使用JAVA编程实现多人聊天室(需要用到多线程)

本文介绍了一种使用JAVA编程实现的多人聊天室系统,通过多线程技术实现了服务器端的功能,包括新用户上线通知、用户离线广播以及消息的全局转发。系统能够处理多个客户端的并发连接,并在服务停止时断开所有用户连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 使用JAVA编程实现多人聊天室(需要用到多线程),并要求服务器端至少包含如下功能:
    (1) 若有新用户连接,则向已经连接到服务端的用户发送用户上线消息。
    (2) 若有用户断开连接,则向在线用户发送用户下线消息。
    (3) 若有用户发送消息,则向所有用户转发该消息。
    (4) 当停止服务时,断开所有用户连接。
import java.io.*;
import java.io.BufferedReader;
import java.net.*;
import java.util.*;
public class Server implements Runnable{
	static Socket socket=null;
	static ServerSocket serversocket=null;
	static Socket[] sockets=new Socket[20];
	static int number=0;
	public Server(){
		try {
			serversocket=new ServerSocket(5000);		
		}
		catch (IOException e){
			e.printStackTrace();
		}
	}
	public static void main(String args[]){
		Scanner input =new Scanner (System.in);
		System.out.println("服务端开始工作");
		Server t=new Server();
		while(true){
			try{
				socket=serversocket.accept();
				number++;		
				sockets[number]=socket;
				System.out.println("第"+number+"个客户连接");
			}
			catch(IOException e){
				e.printStackTrace();
			}
		Print p = new Print(socket);
		Thread read = new Thread(t);
               		Thread print = new Thread(p);
            
		read.start();
            
		print.start();
		}
	}							
	public void run(){
		try{
			Thread.sleep(1000);
			BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			while(true){
			 	String xinxi=in.readLine();
				 System.out.println(xinxi);
				 PrintWriter out = new PrintWriter(socket.getOutputStream());
			 	for (int i = 0; i < 20; i++) {
			            Socket socket=sockets[i];
    					if (socket!=this.socket) {

			                	        out.println(xinxi);
					}
						out.flush();
				}	
			}
		}
catch (IOException e) {
			System.out.println("客户离开");		
			return;
		}
		catch(Exception e){
			e.printStackTrace();
		}
	}
}
import java.io.*;
import java.net.*;
import java.util.*;
public class Print implements Runnable{
	Socket[] sockets=new Socket[20];
	static int number=0;
	Scanner in =new Scanner (System.in);
	public Print (Socket s){
		while(number<=19){
			sockets[number]=s;
			number++;
		}
	}
	public void run(){
		try{
			Thread.sleep(1000);
			while(true){
				String msg=in.next();
				for(int i=0;i<number-1;i++){
					PrintWriter out = new PrintWriter(sockets[i].getOutputStream());
					out.println("服务端说:"+msg);
				}
			}
		}
		catch(Exception e){
			  e.printStackTrace();
		}
	}
}
import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.Socket;

import java.util.Scanner;
public class client implements Runnable{
	static Socket socket=null;
	Scanner input = new Scanner (System.in);
	static String name=null;
	public static void main(String args[]){
		int x=(int)(Math.random()*100);
		client.name="clent"+x;
		System.out.println("欢迎进入");
		try{
			socket=new Socket("127.0.0.1",5000);
			System.out.println("已经连上服务器");
		}
		catch(Exception e){
			e.printStackTrace();
		}
	
	client t=new client();
	Read read =new Read (socket);
	Thread print=new Thread(t);
	Thread reading =new Thread(read);
	print.start( );
	reading.start( );
	}
	public void run() {

               	              try {

		                Thread.sleep(1000);
	                
                PrintWriter out = new PrintWriter(socket.getOutputStream());
           			while (true) {

		                String msg = input.next();

		                out.println(name+"说:"+msg);
			out.flush();
		
                }
		}
		catch (Exception e) {

		               e.printStackTrace();

		}

	}
}

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.Socket;

import java.util.Scanner;
public class Read implements Runnable{
	static Socket socket = null;
	public Read(Socket socket){
		this.socket=socket;
	}
	public void run(){
		try{
			Thread.sleep(1000);
			BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			while(true){
				System.out.println(in.readLine());
			}
		}
		catch(Exception e){
			 e.printStackTrace();
		}
	}
}

客户端
服务端

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值