* 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("手機號碼有誤!"); } } }