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

📄 chatserver.java

📁 聊天系统聊天系统聊天系统聊天系统聊天系统聊天系统聊天系统
💻 JAVA
字号:
/**
 * 
 */
package jclass;

import java.io.*;
import java.net.*;
import java.util.*;

/**
 * @author gz0804
 *
 */
public class ChatServer {
	
	//这个map用来存放用户名和相应的socket
	private static Map<String,Socket> map=new HashMap<String, Socket> ();

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ServerSocket ss=null;
		ChatServer cs=new ChatServer();
		try {
			//建立服务器连接
			ss=new ServerSocket(8080);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("abc");
		
		//服务器要一直工作,不停地监视传进来的连接
		while(true)
		{
			try {
				Socket socket=ss.accept();
				InputStream is=socket.getInputStream();
				BufferedReader br=new BufferedReader(
						new InputStreamReader(is));
				String name=br.readLine();
				
				//当用户名非空时,放到map里,并创建新进程处理
				if(name!=null&&!name.equals(""))
				{
					map.put(name,socket);
				}
				new Thread(cs.new HandleSocket(name,socket)).start();

			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}
	

	//处理客户信息的进程
	private class HandleSocket implements Runnable
	{
		Socket socket;
		String username;
		public HandleSocket(String username,Socket socket)
		{
			this.username=username;
			this.socket=socket;
		}
		public void run()
		{
			InputStream is=null;
			BufferedReader br=null;
			String msg="";
			
			//获取输入流
			try {
				is=socket.getInputStream();
				br=new BufferedReader(new InputStreamReader(is));
			} catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
			}
			
			//当有信息传入服务器时,发送到每个用户
			whileLabel:while(true)
			try {
				//读取信息
				msg=br.readLine();
				//发送信息
				sendMessage(msg);
			} catch (Exception e) {
				// TODO: handle exception
				
				//连接断开时,移除socket,并且停止当前进程
				map.remove(username);
				break whileLabel;
			}
		}
	}
	
	//向用户发送信息
	private void sendMessage(String msg)
	{
		
		//尝试取出map里的每一个socke,并向其发送信息
		try {
			for(Socket so:map.values())
			{
				PrintWriter pw=new PrintWriter(so.getOutputStream());
				pw.println(msg);
				pw.flush();
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}

}

⌨️ 快捷键说明

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