基于 TCP 与 UDP 的 Socket 聊天室

该系列博客衍生于我所参与的一个校企合作项目,作为该项目的一名成员,我无法公开项目的代码,文中出现的所有代码以及流程图均与原项目不同,包括代码的语言选择、通讯的流程图、通讯协议等。
原项目中的实现功能如下:

  • 在 Linux 上使用 ROS 的收发机制来实现通讯模块与无人驾驶模块的数据传输;
  • 在推耙机与中控室之间主要使用基于 TCP 协议的自定义数据帧的形式来进行数据传输,采用 Python 实现。

而本系列博客的最终需求是在两台不同主机之间使用基于 TCP 协议的自定义数据帧的形式来进行数据传输。代码采用的是基于 Java 的通讯实现。 下面是学习的过程:

  1. 基于 TCP 协议的 Socket 接口实现的基础知识
  2. 基于 TCP 与 UDP 的 Socket 聊天室
  3. 基于 TCP 协议的自定义数据帧的形式来进行短数据的传输
  4. 基于 TCP 协议的自定义数据帧的形式来进行长数据(图片)的传输

目录:

  • 1 基于 TCP 与 UDP 的单向 Socket 聊天室
    • 1.1 基于 TCP 的实现
    • 1.2 基于 UDP 的实现
  • 2 基于 TCP 与 UDP 的双向 Socket 聊天室
    • 2.1 基于 TCP 的实现
    • 2.2 基于 UDP 的实现
  • 3 基于 TCP 的双向 Socket 聊天室的演示视频

1 基于 TCP 与 UDP 的单向 Socket 聊天室

需求:在不同主机上分别建立一个客户端与一个服务器端,利用 TCP 和 UDP 这两种不同的方式实现客户端到服务器端的文字传输(单向传输),其中文字的内容为客户端的 Console 输入。
 

1.1 基于 TCP 的实现

服务器端代码(负责接收):

import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class CirculateReceiveTCP {
   
    public static void main(String[] args) throws Exception {
   
        //首先,建立连接
        ServerSocket serverSocket=new ServerSocket(7878);
        Socket client=serverSocket.accept();
        //验证是否连接成功
        System.out.println("收到来自一个客户端的连接。");

        InputStream inputStream=client.getInputStream();
        byte[] buf=new byte[1024];
        while(true){
   
            //在IO流中,当输入端调用close的话,服务端的read方法会返回-1
            int length = inputStream.read(buf);
            if (length!=-1){
   
                //下面这句语句在源码中可以看到是输入流的长度,同时可以将流中的数据放在数组中
                String s=new String(buf,0,length);
                System.out.println(s);
            }
            else{
   
                break;
            }
        }
        //无论是输入流或者输出流都是不需要我们创建的,我们只是拿来使用的,所以不需要我们来关闭
        //只要关闭client和serverSocket即可
        client.close();
        serverSocket.close();
    }
}

客户端代码:(负责发送)

import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class CirculateSendTCP {
   
    public static void main(String[] args) throws Exception {
   
        //TCP必须先建立连接,再传入数据。如果连接失败,那么后面的数据是无法传输的
        Socket socket = new Socket("127.0.0.1",7878);

        //TCP是使用流来发送数据,而UDP使用包裹来发送数据。流比较适合发送大量的数据,
        // 因为可以把流看成是水管,他是可以一直写数据的,持续不断的。难怪短信有大小限制。
        OutputStream outputStream = socket.getOutputStream();
        Scanner scanner = new Scanner(System.in);

        //TCP协议是可以处理关闭通讯的行为,而UDP则不行,对于UDP,即使是客户端关闭掉了,接收端也是不知道的。
        while(true){
   
            //先建立流,即管道,再写入数据
            String context=scanner.nextLine();
            if ("end".equals(context)){
   
                break;
            }
            outputStream.write(context.getBytes());
        }

        socket.close();

    }
}

 

1.2 基于 UDP 的实现

服务器端代码(负责接收):

import java.io.IOException;
import

你可能感兴趣的:(项目,socket,java,网络通信,TCP,UDP)