1. 程式人生 > >socket實現簡易聊天功能

socket實現簡易聊天功能

最近在看網路程式設計這一塊 小有收貨 分享一哈  希望可以幫到有需要的人

編碼開始 

功能實現類如圖

client :主要模擬客戶端 傳送訊息 

server :服務端

serverHandler :服務端業務處理類

Test :測試類

1:首先開始寫 Server 服務端 (@SuppressWarnings("all")  防止提示 看著難受 )

@Slf4j
@SuppressWarnings("all")
public class Server {

   private static final int DEFAULT_PORT  = 8888;

   private static ServerSocket serverSocket;

   public static void start(){
      start(DEFAULT_PORT);
   }

   /**
    * socket 連線建立
    * @param defaultPort defaultPort
    */
   private synchronized static void start(int port) {
      
      if (serverSocket != null){
         return;
      }

      try {
         //通過建構函式建立ServerSocket
         //如果埠合法且空閒,服務端就監聽成功
         serverSocket = new ServerSocket(port);
         log.info("服務端已啟動,埠號:" + port);
         log.info("。。。。。。簡易聊天室啟動。。。。。。。");

         //通過無線迴圈監聽客戶端連線
         //如果沒有客戶端接入,將阻塞在accept操作上。
         while (true) {
            Socket socket = serverSocket.accept();
            new Thread(new ServerHandler(socket)).start();
         }
      }catch (Exception e){
         e.printStackTrace();
         log.info("建立socket 異常");
      }finally {
         if(serverSocket!=null){
            try {
               serverSocket.close();
            } catch (IOException e) {
               e.printStackTrace();
               log.info("關閉socket 異常");
            }
            serverSocket = null;
         }
      }
   }
}

2:serverHandler 服務業務處理端

@Slf4j
public class ServerHandler implements Runnable {

   /**
    * socket 連線
    */
   private Socket socket;

   ServerHandler(Socket socket) {
      this.socket = socket;
   }

   @Override
   public void run() {
      BufferedReader in = null;
      PrintWriter out = null;
      BufferedReader reader;
      try{
         in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
         out = new PrintWriter(socket.getOutputStream(), true);
         reader = new BufferedReader(new InputStreamReader(System.in));
         String result;
         String outPut;
         while ((result = in.readLine()) != null) {
            log.info(("client :" + result));
            if(result.equals("exit")){
               out.println("exit");
               log.info("哇哈哈 聊天結束了!!!");
               break;
            }
            outPut =reader.readLine();
            out.println(outPut);
         }

      }catch (Exception e){
         e.printStackTrace();
         log.error("server 處理處理異常 ");
      }finally {
         if(out!=null){
            out.close();
         }
         if(in!=null){
            try {
               in.close();
            } catch (IOException e) {
               e.printStackTrace();
            }
         }
      }
   }
}

3:編寫我們的客戶端

@Slf4j
public class Client {
   private static  final int DEFAULT_PORT = 8888;
   private static  final String DEFAULT_IP = "127.0.0.1";

   public static void send(){
      send(DEFAULT_IP,DEFAULT_PORT);
   }

   /**
    * 傳送
    * @param ip  defaultIp
    * @param port defaultPort
    */
   private static void send(String ip, int port) {
      Socket socket = null;
      BufferedReader br = null;
      PrintWriter pw = null;
      BufferedReader reader;
      try{
         socket = new Socket(ip,port);
         pw =  new PrintWriter(socket.getOutputStream(),true);
         br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
         reader = new BufferedReader(new InputStreamReader(System.in));
         String input ;
         log.info("聊天開始。。。。。。輸入exit即可關閉");
         while ((input = reader.readLine())!=null){
            pw.println(input);
            String s = br.readLine();
            if(s.equals("exit")){
               log.info("聊天終止。。。。。。");
               break;
            }
            log.info(("server answer :" + s));
         }
      }catch (Exception e){
         log.error("建立連線失敗:"+e.getLocalizedMessage());
      }finally {
         if(socket!=null){
            try {
               socket.close();
            } catch (IOException e) {
               e.printStackTrace();
            }
         }

         if(br!=null){
            try {
               br.close();
            } catch (IOException e) {
               e.printStackTrace();
            }
         }

         if(pw!=null){
            pw.close();
         }
      }
   }
}

4:編寫測試類 進行測試 

public class Test {

   public static void main(String[] args) throws InterruptedException {
      new Thread(() -> {
         Server.start();
      }).start();

      Thread.sleep(2000);
      
      new Thread(() ->{
         Client.send();
      }).start();
   }
}

介面執行效果如圖

這樣 簡易聊天功能實現了 

@Slf4j 這個註解 來自於lombok 

pom依賴 

<!--lombok-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

idea 工具也是需要安裝lombok外掛的

我這裡已經安裝好了  這個外掛 需要使用的話 必須要安裝的

願君度過美好的一天,明天加油