【Java网络编程】基于TCP协议和websocket实现Java简易双向聊天功能

本文的代码详细注解使用AI生成

1、新建一个项目,再创建包,我这的包名为com.nyx.Test1

2、创建服务器类Server

package com.nyx.Test1;

import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args)  throws Exception {
        ServerSocket ss = new ServerSocket(9898);

        Socket s=ss.accept();

        //服务器而言,不停地接收和发送数据
        //启动的第一个线程负责接收数据
        ReceThread rt=new ReceThread(s);
        rt.start();//启动线程
        System.out.println("服务器启动成功!");

        //启动的第二个线程负责发送数据
        SendThread st=new SendThread(s);
        st.start();

    }
}

3、创建客户端类Client

package com.nyx.Test1;

import java.io.IOException;
import java.net.Socket;

public class Client {
    public static void main(String[] args) throws IOException {
        Socket s=new Socket("localhost",9898);

        //客户端而言,不停地接收和发送数据
        //启动的第一个线程负责接收数据
        ReceThread rt=new ReceThread(s);
        rt.start();//启动线程
        System.out.println("客户端启动成功并连接到服务器");

        //启动的第二个线程负责发送数据
        SendThread st=new SendThread(s);
        st.start();
    }
}

4、创建公共使用的发送类SendThread

下面是该类的核心功能以及相关的知识点:

  1. 构造函数

    • SendThread(Socket s):这是一个构造函数,它接收一个Socket对象作为参数,这个Socket对象代表了客户端与服务器之间的网络连接。
  2. run() 方法

    • public void run():这是线程启动后自动调用的方法。在这个方法中,线程将执行其主要的任务,即从用户输入读取消息并通过网络发送出去。
  3. 输入输出流

    • OutputStream os = s.getOutputStream():这行代码从Socket对象获取一个输出流,用于发送数据到网络对端。
    • BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os)):创建一个BufferedWriter对象,它可以将文本数据写入到输出流中。OutputStreamWriter用作装饰器,将字节流转换为字符流。
  4. 读取用户输入

    • Scanner sc = new Scanner(System.in):创建一个Scanner对象,用于从控制台读取用户的输入。
  5. 发送消息

    • bw.write(sc.nextLine()):将用户输入的文本写入到BufferedWriter中。
    • bw.newLine():写入一个新行字符,表示消息的结束。
    • bw.flush():强制将缓冲区中的数据发送出去,确保消息被立即传输而不是等待缓冲区满。
  6. 异常处理

    • catch (IOException e):捕获并处理在输入输出过程中可能发生的异常。

需要用到的知识点包括:

  • 多线程编程:理解线程的创建和运行,以及线程的生命周期。
  • Socket编程:了解如何使用Java的Socket类来建立网络连接和进行数据传输。
  • I/O流:熟悉Java的输入输出流,包括字节流和字符流,以及如何使用缓冲流提高I/O性能。
  • 异常处理:理解异常的概念,以及如何在Java中处理异常。
package com.nyx.Test1;

import java.io.IOException;
import java.io.OutputStream;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;

public class SendThread extends Thread {

    private Socket s;

    public SendThread(Socket s) {
        this.s = s;
    }

    @Override
    public void run() {
        Scanner sc = new Scanner(System.in);
        while(true) {
            try {
                OutputStream os = s.getOutputStream();
                BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));

                bw.write(sc.nextLine());
                bw.newLine();
                bw.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }


        }
    }

}

5、创建公共的接收类RaceThread

下面是该类的核心功能以及相关的知识点:

  1. 构造函数

    • ReceThread(Socket s):这是一个构造函数,它接收一个Socket对象作为参数,这个Socket对象代表了客户端与服务器之间的网络连接。
  2. run() 方法

    • public void run():这是线程启动后自动调用的方法。在这个方法中,线程将执行其主要的任务,即从网络接收数据并打印到控制台。
  3. 输入流

    • InputStream is = s.getInputStream():这行代码从Socket对象获取一个输入流,用于从网络对端接收数据。
    • BufferedReader br = new BufferedReader(new InputStreamReader(is)):创建一个BufferedReader对象,它可以从输入流中读取文本数据。InputStreamReader用作装饰器,将字节流转换为字符流。
  4. 接收消息

    • String content = br.readLine():从BufferedReader中读取一行文本数据。
  5. 打印接收到的消息

    • System.out.println("接收到的数据是:"+content):将接收到的消息打印到控制台。
  6. 异常处理

    • catch (IOException e):捕获并处理在输入输出过程中可能发生的异常。

需要用到的知识点包括:

  • 多线程编程:理解线程的创建和运行,以及线程的生命周期。
  • Socket编程:了解如何使用Java的Socket类来建立网络连接和进行数据传输。
  • I/O流:熟悉Java的输入输出流,包括字节流和字符流,以及如何使用缓冲流提高I/O性能。
  • 异常处理:理解异常的概念,以及如何在Java中处理异常。
package com.nyx.Test1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;

public class ReceThread extends Thread {

    private Socket s;
    public ReceThread(Socket s) {
        this.s = s;
    }

    @Override
    public void run() {
        //不停的接收
        while(true){
            try {
                InputStream is = s.getInputStream();
                BufferedReader br = new BufferedReader(new InputStreamReader(is));
                String content = br.readLine();

                System.out.println("接收到的数据是:"+content);
            } catch (IOException e) {
                e.printStackTrace();
            }


        }
    }
}

最后先启动服务器,再启动客户端来测试 

测试成功!

  • 22
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
WebSocket协议是一种在单个TCP连接上进行全双工通信的协议。在WebSocket协议之前,浏览器与服务器之间的通信通常都是基于HTTP请求和响应的,也就是说,客户端向服务器发送请求,服务器返回响应,然后连接就被断开了。这种方式不够实时、效率也不高。 WebSocket协议通过在HTTP协议升级时使用"Upgrade"头来实现握手。握手成功后,连接就从HTTP协议升级到了WebSocket协议,从而在单个TCP连接上实现了全双工通信。 在Java,可以使用Java API for WebSocket(JSR 356)来实现WebSocket协议。下面是基于Java实现WebSocket协议的步骤: 1. 创建自己的Endpoint类,继承javax.websocket.Endpoint类,实现onOpen、onMessage、onError和onClose方法。 2. 在onOpen方法,创建Session对象,将它加入到某个集合,以便在之后向客户端发送消息时使用。 3. 在onMessage方法,处理客户端发送的消息,并向所有客户端发送消息。 4. 在onError方法,处理异常。 5. 在onClose方法,将Session从集合移除。 6. 创建ServerEndpointConfig对象,并将Endpoint类和URI绑定在一起。 7. 创建WebSocket服务器,将ServerEndpointConfig对象传递给它。 8. 启动WebSocket服务器,等待客户端连接。 9. 客户端连接成功后,服务器会自动调用Endpoint的onOpen方法,表示连接已建立。 10. 客户端发送消息时,服务器会自动调用Endpoint的onMessage方法,处理消息。 11. 客户端关闭连接时,服务器会自动调用Endpoint的onClose方法,清除Session对象。 12. 服务器发生异常时,会自动调用Endpoint的onError方法,处理异常。 以上是基于Java实现WebSocket协议的大致步骤。需要注意的是,WebSocket协议数据是以帧的形式进行传输的,而不是HTTP协议的请求和响应。因此,在编写WebSocket应用程序时,需要特别注意帧的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七洛殇Atrosenet.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值