package chat_job;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;public class Server {
private ServerSocket server;
private Socket socket;
private List<PrintWriter> allOut;
public Server() throws IOException{
server=new ServerSocket(8088);
allOut=new ArrayList<PrintWriter>();
}
public void start(){

try {
while(true){
System.out.println("等待客户端连接.....");
socket=server.accept();
System.out.println("一个客户端上线");
ClientHandler handler=new ClientHandler();
Thread t=new Thread(handler);
t.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}

public synchronized void addOut(PrintWriter pw){
allOut.add(pw);
}
public synchronized void removeOut(PrintWriter pw){
allOut.remove(pw);
}
public synchronized void sendMessage(String message){
for(PrintWriter pw:allOut){
pw.println(message);
}
}

public static void main(String[] args) {
try {
Server server=new Server();
server.start();
} catch (IOException e) {
e.printStackTrace();
System.out.println("服务端启动失败");
}
}
class ClientHandler implements Runnable{

public void run() {
InputStream in;
PrintWriter pw=null;
String IP = null;
try {
in = socket.getInputStream();
InputStreamReader isr=new InputStreamReader(in);
BufferedReader br=new BufferedReader(isr);

OutputStream out=socket.getOutputStream();
OutputStreamWriter osw=new OutputStreamWriter(out);
pw=new PrintWriter(osw,true);

InetAddress address=socket.getInetAddress();
IP=address.getHostAddress();
addOut(pw);
sendMessage(IP+"上线了!当前在线人数:"+allOut.size());
while(true){
String str=br.readLine();
sendMessage(IP+"说:"+str);
}

catch (IOException e) {
e.printStackTrace();
}finally{
try {
removeOut(pw);
System.out.println(IP+"下线了!在线人数:"+allOut.size());
sendMessage(IP+"下线了!在线人数:"+allOut.size());
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}package chat_job;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;public class Client {
private Socket socket;

public Client() throws UnknownHostException, IOException{
System.out.println("与服务端建立连接中.....");
socket = new Socket("127.0.0.1",8088);
System.out.println("与服务端连接完成!");

}

public void start(){
try {
ServerHandle handle=new ServerHandle();
Thread t=new Thread(handle);
t.start();
Scanner scan=new Scanner(System.in);
OutputStream out=socket.getOutputStream();
OutputStreamWriter osw=new OutputStreamWriter(out);
PrintWriter pw=new PrintWriter(osw,true);

while(true){
pw.println(scan.nextLine());
}

} catch (IOException e) {
e.printStackTrace();
}

}


public static void main(String[] args) {
try {
Client client=new Client();
client.start();
} catch (Exception e) {
e.printStackTrace();
System.out.println("客户端运行失败");

}

class ServerHandle implements Runnable{
public void run() {
InputStream in;
try {
in = socket.getInputStream();
InputStreamReader isr=new InputStreamReader(in);
BufferedReader br=new BufferedReader(isr);
while( true){
//写成这段代码,当运行多个客户端时,一个客户端发送信息后关闭,另一个客户端会一直弹null。为什么?
String str=br.readLine();
System.out.println(str);
}
                                                       /*String str=null;//写成这样就不会出以上的错误。
while( (str=br.readLine())!=null){
System.out.println(str);
}*/
} catch (IOException e) {
e.printStackTrace();
}
}
}}