网络编程-java多线程实现多人聊天室

        我们将探讨如何使用Java多线程来实现一个多人聊天室。聊天室是一种常见的网络应用,它允许用户在文本的基础上进行实时通信。我们将创建一个简单的聊天室服务器和客户端,它们能够实现基本的发送和接收消息功能。

1设计思路

我们的聊天室将分为两部分:服务器和客户端。

  • 服务器端:负责接收客户端的连接请求,并为每个客户端创建一个新的线程来处理与其交互的消息。
  • 客户端:用于发送消息给服务器,并接收服务器的回复。

2代码实现:

2.1服务器代码:

我们需要创建一个服务器类,它将监听一个指定的端口,等待客户端的连接。

package month7.day0711.Demo5;

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

public class Server {
    public static void main(String[] args) {
        ServerSocket serverSocket;
        Socket socket;
        try {
            serverSocket = new ServerSocket(8888);
            System.out.println("服务器已启动!!!");
            socket = serverSocket.accept();
            System.out.println("客户端已连接!!!");

            ReadThread readThread=new ReadThread(socket.getInputStream());
            Thread thread1=new Thread(readThread);
            thread1.start();

            WriteThread wt = new WriteThread(socket.getOutputStream(), "服务端");
            wt.start();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
2.2多线程

我们创建两个线程类:ReadThreadWriteThread

  • ReadThread:负责从服务器读取消息。
  • WriteThread:负责将客户端的消息发送到服务器。
package month7.day0711.Demo5;

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

public class ReadThread implements Runnable {
    InputStream in;

    public ReadThread(InputStream in) {
        this.in = in;
    }

    public void run() {
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        while (true) {
            try {

                    String msg = br.readLine();
                    if (msg == null) {
                        break;
                    }
                    System.out.println(msg);

            } catch (IOException e) {
                throw new RuntimeException(e);
            }

        }
    }
}
package month7.day0711.Demo5;

import java.io.*;
import java.util.Scanner;

public class WriteThread extends Thread {
    OutputStream out;
    String name;

    public WriteThread(OutputStream out, String name) {
        this.out = out;
        this.name = name;
    }

    public void run() {
        BufferedWriter br = new BufferedWriter(new OutputStreamWriter(out));
        Scanner scanner = new Scanner(System.in);

        try {
            while (true) {
                br.write(this.name + ":" + scanner.nextLine());
                br.newLine();
                br.flush();
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }
}

另外两个线程重写run方法,以实现无线循环,让聊天不停止

package month7.day0711.Demo5;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
public class ReceiveThread extends Thread {
    private Socket socket;
    public ReceiveThread(Socket socket) {
        this.socket = socket;
    }
    public void run() {
        while (true) {
            try {
                BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String msg = null;
                while ((msg = br.readLine()) != null) {
                    System.out.println(msg);}
                } catch(IOException e){
                    throw new RuntimeException(e);
                }
            }
        }
    }
package month7.day0711.Demo5;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class SendThread extends Thread {
    private Socket socket;
    public SendThread(Socket socket) {
        this.socket = socket;
    }
    public void run() {
        while (true) {
            try {
                PrintWriter pw = new PrintWriter(socket.getOutputStream());
                Scanner input = new Scanner(System.in);
                pw.print(input.nextLine());
                pw.flush();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

2.3客户端代码:

客户端将负责与服务器建立连接,并处理用户输入的文本消息。

package month7.day0711.Demo5;

import month6.day0623.ReceiveThread;
import month6.day0623.SendThread;

import java.io.IOException;
import java.net.Socket;
import java.time.chrono.IsoChronology;

public class Client {
    public static void main(String[] args) throws IOException {
        Socket socket=new Socket("192.168.204.57",8888);
        System.out.println("客户端已连接");

        ReadThread readThread=new ReadThread(socket.getInputStream());
        Thread thread=new Thread(readThread);
        thread.start();

        WriteThread writeThread=new WriteThread(socket.getOutputStream(),"客户端2");
        writeThread.start();
    }
}

3项目总结:

多线程聊天室主要使用的是多线程和io流,通过io流对数据进行读写操作,多线程实现多个用户连接以及多次发送和接收数据.

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值