我们将探讨如何使用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多线程
我们创建两个线程类:ReadThread
和WriteThread
。
- 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流对数据进行读写操作,多线程实现多个用户连接以及多次发送和接收数据.