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 }

实现双端通信:

 

posted @ 2019-05-11 19:31  abcdjava  阅读(476)  评论(0编辑  收藏  举报