ServerSocket建立聊天室服务器(二)

(平时操作,留下痕迹,以后效,君若受益,吾之大幸)

*编写完服务器,可打开终端进行测试 打开cmd 命令 键入 telnet localhost  +(端口号)

例如:

回车 便与服务器端口建立连接

一、MyServerSocket.class

package cn.upc.serversocket.main;


public class MyServerSocket {
   public static void main(String[] args) {
      new ServerSocketListener().start();
      System.out.println(1);
   }
}

二、ServerSocketListener.class

package cn.upc.serversocket.main;

import javax.swing.*;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerSocketListener extends Thread {

   @Override
   public void run() {
      try {
         ServerSocket serverSocket = new ServerSocket(12345); //1~65535
         while (true) {
            Socket socket = serverSocket.accept(); //监听连接,建立连接,返回socket对象
            //JOptionPane.showMessageDialog(null, "客户端已经连接到12345端口");

            ChatSocket cs = new ChatSocket(socket);
            cs.start();
            ChatManager.getChatManager().add(cs); //添加至聊天管理器
         }

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

三、ChatSocket.class
package cn.upc.serversocket.main;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class ChatSocket extends Thread {

   Socket socket;

   public ChatSocket(Socket socket) {
      this.socket = socket;
   }

   public void out(String string) {  //ServerSocket发送数据功能   客户端接收
      try {
         socket.getOutputStream().write((string+"\n").getBytes("GBK"));
      } catch (IOException e) {
         ChatManager.getChatManager().remove(this);
      }
   }



   @Override
   public void run() {
      try {
         BufferedReader br =                  //ServerSocket接受数据功能
               new BufferedReader(
                     new InputStreamReader(
                           socket.getInputStream(), "GBK"));
         String line = null;
         while ((line = br.readLine()) != null) {
            ChatManager.getChatManager().publish(this, line);   //向各个客户端发送数据
         }
         br.close();
      } catch (IOException e) {
         System.out.println("断开了一个客户端链接");
         ChatManager.getChatManager().remove(this);
      }

   }
}

四、ChatManager.class
package cn.upc.serversocket.main;

import java.util.Vector;

public class ChatManager {
   private ChatManager(){}    //单例化
   private static final ChatManager cm= new ChatManager();
   public static ChatManager getChatManager(){
      return cm;
   }

   Vector<ChatSocket>  vector=new Vector<ChatSocket>();

   public void add(ChatSocket cs){  //为集合添加socket对象
      vector.add(cs);
   }
   public void remove(ChatSocket cs){
      vector.remove(cs);
   }

   public void publish(ChatSocket cs,String string){   //某一线程 向其他线程发布信息
      for (int i = 0; i < vector.size(); i++) {
         ChatSocket chatSocket=vector.get(i);
         if(!cs.equals(chatSocket)){
            chatSocket.out(string);
         }
      }
   }
}

猜你喜欢

转载自blog.csdn.net/flyingshadower/article/details/84586595