基本socket阻塞模式的聊天室

源码如下:

启动服务后 可以 telnet localhost 10000  来测试

 

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

public class Server extends ServerSocket {
	private static ArrayList<String> onlineUser = new ArrayList<String>();
	private static ArrayList<CreateServerThread> threadList = new ArrayList<CreateServerThread>();
	protected static final int SERVER_PORT = 10000;

	public Server() throws FileNotFoundException, IOException {
		super(SERVER_PORT);
		System.out.println("服务启动,等待客户端连接............");
		try {
			while (true) {
				Socket socket = accept();
				new CreateServerThread(socket);
			}
		} finally {
			close();
		}
	}

	public static void main(String[] args) throws IOException {
		new Server();
	}

	class PostMessageThread extends Thread{
		
		public String message;
		public PostMessageThread(String message){
			this.message = message;
			start();
		}
		public void run(){
			pushAllClient(message);
		}
		
		public void pushAllClient(String message){
			for (int i = 0; i < threadList.size(); i++) {
				CreateServerThread client = (CreateServerThread) threadList
						.get(i);
				client.sendMessage(message);
			}
		}
	}
	class CreateServerThread extends Thread {
		private Socket client;
		private BufferedReader in;
		private PrintWriter out;
		private String Username;

		public CreateServerThread(Socket s) throws IOException {
			client = s;
			in = new BufferedReader(new InputStreamReader(client.getInputStream()));
			out=new PrintWriter(new OutputStreamWriter(client.getOutputStream(),"GBK"),true);
			out.println("--- 欢迎进入随机聊天室  ---");
			out.println("请输入你的昵称:");
			System.out.println("客户建立连接中............");
			start();
		}

		public void sendMessage(String msg) {
			out.println(msg);
		}

		public void run() {
			try {
				int flag = 0;
				String line = in.readLine();
				while (line!= null && !line.equals("bye")) {
					if (line.equals("list")) {//显示所有用户
						listOnlineUsers(out);
						line = in.readLine();
						continue;
					}
					if (flag++ == 0) {
						Username = line;
						onlineUser.add(Username);
						listOnlineUsers(out);
						threadList.add(this);
						pushMessage("[< " + Username + " 进入聊天室! >]");
						System.out.println(Username+" 已经登陆聊天室!");
					} else {
						pushMessage("<" + Username + ">" + line);
					}
					line = in.readLine();
				}
				out.println("--- See you, bye! ---");
				client.close();
				System.out.println(Username+" 已断开连接!");
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				try {
					client.close();
				} catch (IOException e) {
				}
				threadList.remove(this);
				onlineUser.remove(Username);
				pushMessage("[< " + Username + " left>]");
			}
		}

		private String listOnlineUsers(PrintWriter out) {
			String s = "-+- 在线用户列表 -+-";
			out.println(s);
			for (int i = 0; i < onlineUser.size(); i++) {
				out.println("[" + onlineUser.get(i) + "]");
			}
			out.println("-+------------------+-");
			return s;
		}

		private void pushMessage(String msg) {
			new PostMessageThread(msg);
		}
	}
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值