Java Socket编程(模拟多用户聊天室)

Server.java

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class Server {
	private ServerSocket ss;
	private Socket socket;
	private List<Socket> list = new ArrayList<Socket>();
	public Server() {
		try {
			ss = new ServerSocket(10000);
			while (true) {
				socket = ss.accept();
				list.add(socket);
				System.out.println("在线人数:" + list.size());
				new Thread(new ChatThread(socket, list)).start();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		new Server();
	}
	
	
	class ChatThread implements Runnable{
		private Socket socket;
		private List<Socket> socketList;
		private BufferedReader bufferedReader;
		
		public ChatThread(Socket socket, List<Socket> socketList) {
			super();
			this.socket = socket;
			this.socketList = socketList;
		}
		private void  preRun(){
			InputStreamReader r=null;
			try {
				r = new InputStreamReader(this.socket.getInputStream());
				this.bufferedReader=new BufferedReader(r);	
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		private PrintWriter getSocketPrintWriter(Socket socket){
			OutputStream os=null;
			try {
				os = socket.getOutputStream();
			} catch (IOException e) {
				e.printStackTrace();
			}
			OutputStreamWriter osw=new OutputStreamWriter(os);
			BufferedWriter bw=new BufferedWriter(osw);
			return new PrintWriter(bw, true);
		}
		private void broadcast(String msg){
			for(Socket s : socketList){
				PrintWriter pw=this.getSocketPrintWriter(s);
				pw.println(msg);
			}
		}
		@Override
		public void run() {
			String msg="";
			this.preRun();
			while(true){
				try {
					msg="from client: "+this.bufferedReader.readLine();
					System.out.println(msg);
					this.broadcast(msg);
				} catch (IOException e) {
					try {
						this.bufferedReader.close();
						this.socket.close();
						this.socketList.remove(this.socket);
						this.broadcast("somebody exist....people size :" +socketList.size());
					} catch (IOException e1) {
						e1.printStackTrace();
					}
					e.printStackTrace();
					return ;
				}
			}
		}
		
	}
}
Client.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {
	Socket socket;
	BufferedReader in;
	PrintWriter out;

	public Client() {
		
			try {
				socket = new Socket("127.0.0.1", 10000);
			} catch (UnknownHostException e1) {
				e1.printStackTrace();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			
			new Thread(){
				public void run(){
					try {
						BufferedReader line = new BufferedReader(new InputStreamReader(System.in));
						out = new PrintWriter(socket.getOutputStream(), true);
						String str = null;
						while((str= line.readLine()) != null){
							out.println(str);
						}
						line.close();
					} catch (IOException e) {
						e.printStackTrace();
					}finally{
						out.close();
					}
				}
			}.start();
			
			new Thread(){
				public void run(){
					try {
						in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
						String str = null;
						while((str = in.readLine()) != null){
							System.out.println("receive from server:" + str);
						}
						in.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}.start();
	}

	public static void main(String[] args) {
		new Client();
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值