TCP和UDP编程
在java中分别为TCP和UDP这两种通信协议,提供了Socket编程类,这些类都放在java.net包中。
1.TCP
1) 提供ServerSocket(服务器端)和Socket(客户端),基于TCP创建的套接字可以叫做流套接字,服务器端相当于一个监听器,用来监听端口。 服务器与客服端之间的通讯都是输入输出流来实现的。
ServerSocket(服务器端):
1 import java.io.IOException; 2 import java.net.ServerSocket; 3 import java.net.Socket; 4 5 public class Server1 { 6 public static void main(String[] args) { 7 8 /*TCP通信步骤 9 * 10 [1] 服务器启动ServerSocket作为通信的Server端,等待客户端链入。 11 [2] 客户端创建Socket作为通信的Client端 12 [3] Client端链入Server端后建立可靠的、双向的、持续性的、点对点的通讯连接,即可通信。 13 */ 14 15 System.out.println("服务器启动..."); 16 // 【1】创建server socket 17 ServerSocket serverSocket = null; 18 Socket clientSocket = null; 19 20 try { 21 serverSocket = new ServerSocket(9001); 22 // 【2】等待客户端的链入->阻塞式函数->监听8000端口,看是否有client链入 23 clientSocket = serverSocket.accept(); 24 System.out.println(clientSocket.getInetAddress().getHostName()+"链入");//提示用户名 链入 25 System.out.println(clientSocket.getInetAddress().getHostAddress()+"链入");
//提示IP地址 链入
26 } catch (IOException e) { 27 e.printStackTrace(); 28 } 29 30 } 31 32 }
Socket(客户端):
1 import java.io.IOException; 2 import java.net.Socket; 3 4 public class Client1 { 5 public static void main(String[] args) { 6 7 /*TCP通信步骤 8 * 9 [1] 服务器启动ServerSocket作为通信的Server端,等待客户端链入。 10 [2] 客户端创建Socket作为通信的Client端 11 [3] Client端链入Server端后建立可靠的、双向的、持续性的、点对点的通讯连接,即可通信。 12 */ 13 System.out.println("客服端启动..."); 14 // 【1】创建Client socket 15 Socket socket = null; 16 17 try { 18 socket = new Socket("192.168.2.166", 9001); 19 20 } catch (IOException e) { 21 // TODO Auto-generated catch block 22 e.printStackTrace(); 23 } 24 25 } 26 27 }
2)UDP对应的是DatagramSocket。基于UDP的套接字就是数据报套接字,• 两个都要先构造好相应的数据包。
实现双向通信:
①发送端:
1 import java.io.IOException; 2 import java.net.DatagramPacket; 3 import java.net.DatagramSocket; 4 import java.net.InetAddress; 5 import java.net.SocketException; 6 import java.net.UnknownHostException; 7 import java.util.Scanner; 8 9 public class ClientA { 10 public static void main(String[] args) { 11 // 发送端:主动发送信息 12 System.out.println("发送端发送信息..."); 13 14 // 1.创建socket并指定发送数据的端口 15 Scanner sc = new Scanner(System.in); 16 17 DatagramSocket dSocket = null; 18 19 try { 20 21 dSocket = new DatagramSocket(9001); 22 23 for (; ; ) { 24 // 2.创建数据报包 25 System.out.println("ClientA:"); 26 String msg = sc.nextLine(); 27 28 byte[] buf = msg.getBytes("UTF-8"); 29 DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getLocalHost(), 9526); 30 31 // 3.发送 32 dSocket.send(dp); 33 34 //4.接受ClientB数据包 35 byte[] buf2 = new byte[100]; 36 DatagramPacket dp2 = new DatagramPacket(buf2, buf2.length); 37 dSocket.receive(dp2); 38 39 //5.处理接收信息 40 String mS = new String(buf2, 0, dp2.getLength(), "UTF-8"); 41 System.out.println(dp.getAddress().getHostName()+":"+ mS); 42 43 } 44 45 } catch (SocketException e) { 46 e.printStackTrace(); 47 } catch (UnknownHostException e) { 48 e.printStackTrace(); 49 }catch (IOException e) { 50 e.printStackTrace(); 51 }finally{ 52 // 5.关闭 53 dSocket.close(); 54 55 } 56 57 } 58 59 }
②接收端:
1 import java.io.IOException; 2 import java.net.DatagramPacket; 3 import java.net.DatagramSocket; 4 import java.net.SocketException; 5 import java.util.Scanner; 6 7 public class ClientB { 8 9 public static void main(String[] args) { 10 System.out.println("接收端接收消息..."); 11 12 Scanner sc = new Scanner(System.in); 13 14 // 1.创建socket并指定发送数据的端口 15 DatagramSocket dS = null; 16 17 try { 18 //2.接收数据包 19 dS = new DatagramSocket(9526); 20 21 for (; ; ) { 22 23 byte[] buf = new byte[100]; 24 25 DatagramPacket dp = new DatagramPacket(buf, buf.length); 26 27 dS.receive(dp); 28 29 //3.处理接收信息 30 String msg = new String(buf, 0, dp.getLength(), "UTF-8"); 31 System.out.println(dp.getAddress().getHostName()+":"+msg); 32 33 //4.给ClientA发送信息 34 System.out.println("ClientB:"); 35 String mString = sc.nextLine(); 36 byte[] buf2 = mString.getBytes("UTF-8"); 37 38 DatagramPacket dp2 = new DatagramPacket(buf2, 0, buf2.length, dp.getAddress(), dp.getPort()); 39 dS.send(dp2); 40 } 41 } catch (SocketException e) { 42 e.printStackTrace(); 43 } catch (IOException e) { 44 e.printStackTrace(); 45 }finally{ 46 dS.close(); 47 } 48 49 } 50 51 }
实现双端通信: