服务端
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
/**
* 请编写一个群聊的程序,包括服务端程序和客户端程序。
* 服务端功能:收到某客户端的信息,将消息在控制台输出,然后,发给其他另外的客户端。
* 客户端功能:每隔5秒发送一条信息给服务端。然后接收服务器转发过来的消息,并在控制台输出。
* @author MSS
*
*/
public class ChatRoom {
public static void main(String[] args) {
//线程池
ThreadPoolExecutor executor=(ThreadPoolExecutor)Executors.newFixedThreadPool(4);
List<Socket> slist=new ArrayList<Socket>();
int num=0;
try {
ServerSocket ss=new ServerSocket(8001);
while(true) {
Socket s=ss.accept();
slist.add(s);
System.out.println("来了一个Client");
executor.execute(new Worker(s,slist,num));
num++;
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
当有客户端接入时启动线程类
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.util.List;
class Worker implements Runnable{
Socket s;
List<Socket> slist;
int num;
public Worker(Socket s,List<Socket> slist,int num) {
this.s=s;
this.slist=slist;
this.num=num;
}
@Override
public void run() {
try {
System.out.println("服务人员已经启动");
InputStream ips=s.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(ips));
while(true) {
String strWord=br.readLine();
System.out.println("No."+num+" client said:"+strWord+":"+strWord.length());
if(strWord.equals("quit")) {
break;
}
if(strWord!=null) {
for(int i=0;i<slist.size();i++) {
Socket sc=slist.get(i);
OutputStream ops=sc.getOutputStream();
DataOutputStream dos=new DataOutputStream(ops);
dos.writeBytes("No."+num+" client said"+strWord+"---->"+System.getProperty("line.separator"));//向所有客户端发送消息
}
}
}
br.close();
//关闭包装类,会自动关闭包装类的底层类。所以不用调用ips.close()
s.close();
}catch(Exception e) {
e.printStackTrace();
}
}
}
客户端
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
public class Client {
public static void main(String[] args) {
try {
Socket s=new Socket(InetAddress.getByName("127.0.0.1"),8001);//需要服务端先开启
//同一个通道,服务端的输出流就是客户端的输入流,服务端的输入流就是客户端的输出流
InputStream ips=s.getInputStream(); //开启通道的输入流
BufferedReader brNet=new BufferedReader(new InputStreamReader(ips));
OutputStream ops=s.getOutputStream();//开启通道的输入流
DataOutputStream dos=new DataOutputStream(ops);
String msg="6666";
while(true) {
Thread.sleep(10000);
dos.writeBytes(msg+System.getProperty("line.separator"));
System.out.println("Server said:"+brNet.readLine());
}
}catch(Exception e) {
e.printStackTrace();
}
}
}