zoukankan      html  css  js  c++  java
  • 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 }

    实现双端通信:

  • 相关阅读:
    python基础——返回函数
    python基础——sorted()函数
    python基础——filter函数
    python基础——map/reduce
    python基础——高阶函数
    python基础——迭代器
    python——生成器
    轻量级文本编辑器,Notepad最佳替代品:Notepad++
    python网络编程
    如何检测远程主机上的某个端口是否开启?
  • 原文地址:https://www.cnblogs.com/abcdjava/p/10849736.html
Copyright © 2011-2022 走看看