socket實現簡易聊天功能
阿新 • • 發佈:2018-12-21
最近在看網路程式設計這一塊 小有收貨 分享一哈 希望可以幫到有需要的人
編碼開始
功能實現類如圖
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外掛的
我這裡已經安裝好了 這個外掛 需要使用的話 必須要安裝的
願君度過美好的一天,明天加油