java多线程,多用户聊天室,原理模型【ChatDemo】

/********************************************************************
服务器端类ChatServer
*********************************************************************/

import java.io.IOException;
import https://www.360docs.net/doc/322706574.html,.ServerSocket;
import https://www.360docs.net/doc/322706574.html,.Socket;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class ChatServer {
//公共聊天室
public static void main(String[] args) throws IOException {
ServerSocket ss=new ServerSocket(6666);

List socketList=new LinkedList();


while(true){
Socket socket=ss.accept();
socketList.add(socket);

Thread t=new Thread(new ChatThread(socket,socketList));
t.start();

}

}
}





/********************************************************************
服务器端类ChatThread
*********************************************************************/

import java.io.*;
import https://www.360docs.net/doc/322706574.html,.*;
import java.util.List;

public class ChatThread implements Runnable{

private List socketList;
private Socket socket;
private BufferedReader bufferedReader;

public ChatThread(Socket socket,List socketList){
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);
}
}
public void run() {
String msg="";
this.preRun();
while(true){
try {
msg="from client "+this.bufferedReader.readLine();
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 ;
}
}
}
}




















/********************************************************************
客户端类ChatClient,CTGetMessage,CTSendMessage
*********************************************************************/


import java.io.*;

import https://www.360docs.net/doc/322706574.html,.*;
import java.util.Scanner;

public class ChatClient {
public static void main(String[] args) throws Exception {

Socket socket=new Socket("127.0.0.1", 6666);

Scanner sc=new Scanner(System.

in);
System.out.print("输入名字:");
String name=sc.nextLine();
System.out.println("客户端已经链接.....");
CTGetMessage g = new CTGetMessage(socket);
CTSendMessage s = new CTSendMessage(socket,name);
Thread gt = new Thread(g);
Thread st = new Thread(s);

gt.start();
st.start();
}
}


class CTGetMessage implements Runnable {
private Socket socket;
private BufferedReader bufferedReader;

public CTGetMessage(Socket socket) {
this.socket = socket;
InputStreamReader r = null;
try {
r = new InputStreamReader(this.socket.getInputStream());
} catch (IOException e) {
e.printStackTrace();
};
this.bufferedReader = new BufferedReader(r);
}

public void run() {
String msg = null;
while (true) {
try {
msg = this.bufferedReader.readLine();
System.out.println(msg);
} catch (IOException e) {
e.printStackTrace();
}

}
}

}

class CTSendMessage implements Runnable {
private Socket socket;
private PrintWriter printWriter;
private BufferedReader bufferedReader;
private String name;
public CTSendMessage(Socket socket,String name) {
https://www.360docs.net/doc/322706574.html,=name;
this.socket = socket;
try {
InputStreamReader isr = new InputStreamReader(System.in);
bufferedReader = new BufferedReader(isr);
OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
this.printWriter = new PrintWriter(bw, true);
} catch (IOException e) {
e.printStackTrace();
}
}

public void run() {
String msg = null;
while (true) {
try {
msg =name+":"+ bufferedReader.readLine();
printWriter.println(msg);
} catch (Exception e) {
e.printStackTrace();
}
}

}
}









相关文档
最新文档