java:網絡編程(UDP (DatagramSocket和DatagramPacket)正則表達式)


* TCP
* 特點:面向連接,點對點的通信,效率較低,但安全可靠
* UDP:用戶數據報協議,類似於發報機
* 特點:非面向連接,可以廣播發送,效率較高,但傳輸不可靠
* java.net.DatagramSocket: 此類表示用來發送和接收數據報包的套接字。
* 構造方法:
* DatagramSocket() 構造數據報套接字並將其綁定到本地主機上任何可用的端口。
* DatagramSocket(int port, InetAddress laddr) 創建數據報套接字,將其綁定到指定的本地地址。
* 常用的方法:
* send(DatagramPacket p) 從此套接字發送數據報包。
* receive(DatagramPacket p)從此套接字接收數據報包。
* close() 關閉此數據報套接字。
*
* java.net.DatagramPacket:此類表示數據報包。
* 構造方法:
* DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
構造數據報包,用來將長度為 length 偏移量為 offset 的包發送到指定主機上的指定端口號。
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
構造數據報包,用來將長度為 length 的包發送到指定主機上的指定端口號。
DatagramPacket(byte[] buf, int length)
構造 DatagramPacket,用來接收長度為 length 的數據包。

public class UDPClient {
    public static void main(String[] args) {
        try {
            //1.創建數據報套接字
            DatagramSocket datagramSocket =  new DatagramSocket(6666);
            //2.創建數據報包用於封裝數據和目標地址
            String str="hello world!";
            byte[] content = str.getBytes();//將字符串轉換為字節的數組
            DatagramPacket datagramPacket = new DatagramPacket(content, content.length,InetAddress.getLocalHost(), 9999);
            //3.調用send方法進行發送數據
            datagramSocket.send(datagramPacket);
            //4.釋放資源
            datagramSocket.close();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/**
 * DatagramSocket(int port)
 * DatagramPacket(byte[] buf, int length)  構造 DatagramPacket,用來接收長度為 length 的數據包。
 * DataPacket類中方法:
 *     getData() 返回數據緩沖區。
 *  getLength()返回將要發送或接收到的數據的長度。
 *  getPort() 返回某台遠程主機的端口號,此數據報將要發往該主機或者是從該主機接收到的
 *  getAddress()返回某台機器的 IP 地址,此數據報將要發往該機器或者是從該機器接收到的。
 * 
 */
public class UDPServer {
    public static void main(String[] args) {
        try {
            //1.創建數據報套接字
            DatagramSocket socket = new DatagramSocket(9999);
            //2.創建一個數據報包
            byte[] content = new byte[1024];
            DatagramPacket datagramPacket = new DatagramPacket(content,content.length);
            //3.調用receive方法接收數據包
            socket.receive(datagramPacket);
            //4.從數據報包中獲取數據
            byte[] data=  datagramPacket.getData();//獲取數據報包中的數據
            int length = datagramPacket.getLength();//
            InetAddress ip = datagramPacket.getAddress();
            int port = datagramPacket.getPort();
            System.out.println("內容:"+new String(data,0,length));
            System.out.println("數據長度:"+length);
            System.out.println("發送方的IP地址:"+ip);
            System.out.println("發送方的端口號:"+port);
            //5.釋放資源
            socket.close();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }
}

利用UDP實現聊天功能:

 

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;

/**
 * 利用UDP實現聊天功能
 * @author Administrator
 *
 */
public class UdpChatClient {
    public static void main(String[] args) {
        System.out.println("---------顧客---------");
        try {
            //1.創建數據報套接字
            DatagramSocket socket = new DatagramSocket(6666);
            Scanner input = new Scanner(System.in);
            while(true){
                //2.獲取用戶輸入
                String message = input.next();
                byte[] bs = message.getBytes();
                //3.創建數據報包
                DatagramPacket packet = new DatagramPacket(bs, bs.length, InetAddress.getByName("127.0.0.1"),8888);
                //4.發送數據
                socket.send(packet);
                //接收數據
                byte[] bs2 = new byte[1024];
                DatagramPacket packet2 = new DatagramPacket(bs2, bs2.length);
                socket.receive(packet2);//接收數據
                byte[] serverMesage = packet2.getData();
                String str=new String(serverMesage,0,serverMesage.length);
                System.out.println("客服說:"+str);
                if(message.equals("bye")){
                    break;
                }
            }
            //釋放資源
            socket.close();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;

/**
 * 利用UDP實現聊天功能
 * @author Administrator
 *
 */
public class UdpChatServer {
    public static void main(String[] args) {
        System.out.println("---------客服---------");
        try {
            //1.創建數據報套接字
            DatagramSocket socket = new DatagramSocket(8888);
            Scanner input = new Scanner(System.in);
            while(true){
                //接收數據
                byte[] bs2 = new byte[1024];
                DatagramPacket packet2 = new DatagramPacket(bs2, bs2.length);
                socket.receive(packet2);//接收數據
                byte[] serverMesage = packet2.getData();
                String str=new String(serverMesage,0,serverMesage.length);
                System.out.println("顧客說:"+str);
                
                //2.獲取用戶輸入
                String message = input.next();
                byte[] bs = message.getBytes();
                //3.創建數據報包
                DatagramPacket packet = new DatagramPacket(bs, bs.length, InetAddress.getByName("127.0.0.1"),6666);
                //4.發送數據
                socket.send(packet);
                if(message.equals("bye")){
                    break;
                }
            }
            //釋放資源
            socket.close();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }
}

 

  正則表達式:


* 匹配次數的符號: *:0次或多次--->{0,}
* +:1次或多次 --->{1,}
* ?: 0次或1次 --->{0,1}
* {n}:恰好出現n次
* {n,m}:最少出現n次,最大出現m次
* {n,}:最少出現n次
* 常用的符號:
* . 任何字符(與行結束符可能匹配也可能不匹配)
* \d 數字:[0-9]
* \D 非數字: [^0-9]
* \s 空白字符:[ \t\n\x0B\f\r]
* \S 非空白字符:[^\s]
* \w 單詞字符:[a-zA-Z_0-9] --->字母,數組和下划線
* \W 非單詞字符:[^\w]
* 字符類:
* [abc] a、b 或 c(簡單類)
* [^abc] 任何字符,除了 a、b 或 c(否定)
* [a-zA-Z] a 到 z 或 A 到 Z,兩頭的字母包括在內(范圍)

public class TestVertify {
    /**
     * 利用傳統字符串中方法進行校驗。
     * 用戶名長度不能小於8位,並只能有字母或數字組成
     * @param name
     * @return
     */
    public static boolean checkUserName(String name){
        boolean isCorrect=true;
        if(name.length()<8){
            isCorrect=false;
            System.out.println("用戶名長度不能小於8位!");
        }else{
            //將用戶名轉換為小寫
            String uname = name.toLowerCase();
            for(int i=0;i<uname.length();i++){
                char c = uname.charAt(i);
                if(!((c>='a'&&c<='z')||(c>='0'&&c<='9'))){
                    isCorrect=false;
                    System.out.println("用戶名必須有字母或數字組成!");
                    break;
                }
            }
        }
        return isCorrect;
    }
    
    
    public static boolean checkName(String name){
        String reg="[a-zA-Z0-9]{8,20}";//字母和數字組成,長度應該在8位到20位之間。
        boolean is=name.matches(reg);
        return is;
    }
    /**
     * 校驗手機號碼:11位
     * 13開頭,15開頭,17開頭,18開頭,后跟9的數字
     * @param mobile
     * @return
     */
    public static boolean checkMobile(String mobile){
        String reg = "1[3|5|7|8]\\d{9}";
        return mobile.matches(reg);
    }
    public static void main(String[] args) {
//        boolean is =checkUserName("abcedfg123");
//        boolean is = checkName("abcdefg12!");
//        System.out.println("是否通過校驗:"+is);
        boolean is=  checkMobile("17112345678");
        if(is){
            System.out.println("手機號碼正確!");
        }else{
            System.out.println("手機號碼有誤!");
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM