我写的思路是这样的,服务器是一个类,客户端一个类,客户端的Socket连接服务端的ServerSocket后会返回一个Socket对象,由这个Socket和客户端沟通,我们可以将这个Socket传递到另一个类中去,这个类就相当于你拨打10086人工服务,它会给你分配一个客服,你把这个Socket传到另一个类中去,通过构造方法赋值给这个类的成员变量(也是一个Socket),然后给这个Socket通过获得输入输出流为它写一个发送方法和一个接收线程(因为不知道消息何时会接收到,接收和发送要独立运行)
具体就是
ServerSocket server=new ServerSocket(8888)
Socket ss=server.accept();
ChatThread ct=new ChatThread(ss);
再用一个集合把ct装进去,当接收到消息后就调用服务器里的方法进行发送
而你的集合里也装了这些对象,就可以取出来调用send方法,最好带一个参数send(消息)
比如你存到ArrayList al中;
就
al.get(???).send(消息);
class ChatThread()
{
private Socket ss;
//还要通过ss获取输入输出流
public ChatThread(Socket ss)
{
this.ss=ss;
}
public void send(带个参数,消息)
{
}
//再写个线程接收
}
服务端需要创建线程池来管理客户端的连接线程,避免系统资源过度浪费。也就是说服务端的socket一直监听,有请求进来就把这个请求分配给线程池去处理,而socket继续监听,接受下一个请求,如果让socket自己来处理请求,则后续的请求就都无法进入了。
服务端以map形式存放客户端数据,key=客户名称;value=聊天内容,即存放客户端的输出流。
如果需要代码,我可以给你一套参考。
你是需要代码么