socket聊天室之服务器搭建

因为我们做的是聊天室,所以会有多个客户端,每个客户端我们用一个线程去实现,通过搭建一个服务器来实现从每个客户端来读取信息和发送信息。
   我们先写客户端的线程。
public class ChatSocket extends Thread{
Socket socket;

public ChatSocket(Socket socket){
this.socket = socket;
}
        public void run(){
        }
}
   这是基础部分,但是这个线程还缺少发送信息和读取信息两个核心功能。发送信息比较简单,创建一个方法即可。
     public void out(String s){
     socket.getOutputString().write(s.getbytes("UTF-8"));
}在根据提示加入try/catch。这里发送信息方法只能发给自己。
  然后是创建读取信息方法。因为我们要一直监听有没有信息要读取,所以这个方法要写入run()里。
      public void run(){
      BufferedReader bf = new BufferedReader
    (new InputStreamReader(
            socket.getInputStream(),"utf-8"));//加入try/catch
       String line = null;
       whlie((line = bf.readline())!=null){
       //当循环结束意味着我们读取了写入的信息 存在line里
        }
       bf.close;
}
这样我们ChatSocket基本写完了,然后我们创建ServerSocket对象
   ServerSocket serversocket = new ServerSocket();
   Socket socket = serversocket.accept();
   ChatSocket chatsocket = new ChatSocket(socket);
    chatsocket.start();
写到这里每个线程都是独立的,达不到群聊的功能,所以我创建了一个ChatManager类用来管理每个线程。因为一个聊天室只需要一个ChatManager,所以我对它进行了单例化处理,然后写了一个获取它的方法getManager(),返回值就是ChatManager。还创建了一个Vector容器,用于存放线程。添加了一个add()方法。
   这里还剩下一个最重要的功能--群发信息功能,我们可以将Vector中的每一个线程遍历出来,如果不是本线程,则发送信息line,发送信息功能chatSocket里已经写好了,
public void publish(ChatSocket cs,String outString){
for(int i=0;i<vector.size();i++){
ChatSocket csChatSocket = vector.get(i);
if(!cs.equals(csChatSocket)){
csChatSocket.output(outString);
}
}
}
outString就是我们要发送的之前读取的信息line,所以在读取line之后调用publish方法,就把写入的信息发给了其他的客户端,整个服务器我们就搭建好了。最后附上程序。

你可能感兴趣的