⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chatroomserver.java

📁 在本地局域网机器上实现的简单聊天室程序
💻 JAVA
字号:
package ChatRoom;

import java.awt.BorderLayout;
import java.awt.Font;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import java.util.HashSet;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class ChatRoomServer extends Thread{
	private ServerSocket ss;
	private HashSet<Socket> allSockets;
	private JFrame frame;
	private JTextArea area;
	
	public ChatRoomServer(int port) throws IOException{
		super();
		ss=new ServerSocket(port);
		allSockets=new HashSet<Socket>();
		frame=new JFrame("聊天室服务器  	口:"+port);
		area=new JTextArea(new Date().toLocaleString()+"  服务器已启动!\n");
		init();
	}
	
	public ChatRoomServer() {
		frame=new JFrame();
		area=new JTextArea(new Date().toLocaleString()+"  服务器已启动!\n");
		String port;
		do {
			port = JOptionPane.showInputDialog(frame, "请输入端口号:");
			if(port==null)
				System.exit(0);
			try {
				ss = new ServerSocket(Integer.parseInt(port));
			} catch (NumberFormatException e) {
				JOptionPane.showMessageDialog(frame, "端口号错误!");
			} catch (IOException e) {
				JOptionPane.showMessageDialog(frame, "端口号已被占用,请重新输入!");
			}
		} while (ss==null);
		frame.setTitle("聊天室服务器  端口:"+port);
		allSockets=new HashSet<Socket>();
		init();
	}
	
	private void init(){
		area.setFont(new Font("",Font.BOLD,24));
		JScrollPane jsp=new JScrollPane(area);
		frame.add(jsp,BorderLayout.CENTER);	
	}
	
	private void showMe(){
		frame.setLocation(400,300);
		frame.setSize(800, 600);
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	public void run(){
		showMe();
		while(true){
			Socket s;
			try {
				s = ss.accept();
				allSockets.add(s);
				new ChatRoomServerThread(s,allSockets).start();
			} catch (IOException e) {
				e.printStackTrace();
			}
			
		}
	}
	
	class ChatRoomServerThread extends Thread{
		private HashSet<Socket> allSockets;
		private Socket s;
		private BufferedReader br;
		private InputStreamReader isr;
		private PrintWriter pw;
		
		public ChatRoomServerThread(Socket s,HashSet<Socket> allSockets) {
			this.s=s;
			this.allSockets=allSockets;
			
		}
		public void run(){
			//得到s的输入流,并包装成BufferedReader
			//循环不停的从BufferedReader中读取数据。
			//每读到一行数据就将这一行数据转发给所有在线的客户端。
			//   循环遍历allSockets,得到每一个socket,
			//   然后得到该socket的输出流,并包装,再向输出流中写数据。
			
			try {
			    isr = new InputStreamReader(s.getInputStream());
				br = new BufferedReader(isr);
				area.append(new Date().toLocaleString()+"  "+s.getInetAddress()+"/ "+br.readLine()+":进入聊天室!\n");
			} catch (Exception e) {
			}
			while(true){
				try {  
					String str=br.readLine();
					while(str.split(":")[1].equals("%GOODBYE%")){
						area.append(new Date().toLocaleString()+"  "+s.getInetAddress()+"/ "+str.split(":")[0]+":退出聊天室!\n");
						br.close();
						isr.close();
						allSockets.remove(s);
						return;
					}
				    sendMessageToAllClients(str);
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
	     }//run end!
		
		public void sendMessageToAllClients(String str) throws IOException{
			Date date=new Date();
			for(Socket temp:allSockets){
				pw=new PrintWriter(temp.getOutputStream(),true);
				pw.println(date.toLocaleString()+"  "+str);
			}
		}
	}
	public static void main(String[] args){
		
			
			new ChatRoomServer().start();
		
	}
	
}





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -