Java進階(四十七)Socket通信

      網友投稿 897 2022-05-29

      #Java進階(四十七)Socket通信

      今天講解一個 Hello Word 級別的 Java Socket 通信的例子。具體通訊過程如下:

      先啟動Server端,進入一個死循環以便一直監聽某端口是否有連接請求。然后運行Client端,客戶端發出連接請求,服務端監聽到這次請求后向客戶端發回接收消息,連接建立,啟動一個線程去處理這次請求,然后繼續死循環監聽其他請求。客戶端輸入字符串后按回車鍵,向服務器發送數據。服務器讀取數據后回復客戶端數據。此次請求處理完畢后,啟動的線程消亡。如果客戶端接收到 "OK"之外的返回數據,會再次發送連接請求并發送數據,服務器會為這次連接再次啟動一個線程進行響應。直到當客戶端接收到的返回數據為"OK"時,客戶端退出。

      ##服務端源代碼:

      package cn.edu.ujn.socket; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; public class Server { public static final int PORT = 12345;//監聽的端口號 public static void main(String[] args) { System.out.println("服務器啟動...\n"); Server server = new Server(); server.init(); } public void init() { try { ServerSocket serverSocket = new ServerSocket(PORT); while (true) { // 一旦有堵塞, 則表示服務器與客戶端獲得了連接 Socket client = serverSocket.accept(); // 開啟一個新的線程處理這次連接 new HandlerThread(client); } } catch (Exception e) { System.out.println("服務器異常: " + e.getMessage()); } } // 開啟一個新的線程處理連接 private class HandlerThread implements Runnable { private Socket socket; public HandlerThread(Socket client) { socket = client; new Thread(this).start(); } public void run() { try { // 讀取客戶端數據 DataInputStream input = new DataInputStream(socket.getInputStream()); //這里要注意和客戶端輸出流的寫方法對應,否則會拋 EOFException String clientInputStr = input.readUTF(); // 處理客戶端數據 System.out.println("客戶端發過來的內容:" + clientInputStr); // 向客戶端回復信息 DataOutputStream out = new DataOutputStream(socket.getOutputStream()); System.out.print("請輸入:\t"); // 發送鍵盤輸入的一行 String s = new BufferedReader(new InputStreamReader(System.in)).readLine(); out.writeUTF(s); out.close(); input.close(); } catch (Exception e) { System.out.println("服務器 run 異常: " + e.getMessage()); } finally { if (socket != null) { try { socket.close(); } catch (Exception e) { socket = null; System.out.println("服務端 finally 異常:" + e.getMessage()); } } } } } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      41

      42

      43

      44

      45

      46

      47

      48

      49

      50

      51

      52

      53

      54

      55

      56

      57

      58

      59

      60

      61

      62

      63

      64

      65

      66

      67

      68

      69

      70

      71

      72

      73

      74

      75

      Java進階(四十七)Socket通信

      76

      ##客戶端代碼

      package cn.edu.ujn.socket; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; public class Client { public static final String IP_ADDR = "localhost";//服務器地址 public static final int PORT = 12345;//服務器端口號 public static void main(String[] args) { System.out.println("客戶端啟動..."); System.out.println("當接收到服務器端字符為\"OK\"的時候,客戶端將終止\n"); while (true) { Socket socket = null; try { //創建一個流套接字并將其連接到指定主機上的指定端口號 socket = new Socket(IP_ADDR, PORT); //讀取服務器端數據 DataInputStream input = new DataInputStream(socket.getInputStream()); //向服務器端發送數據 DataOutputStream out = new DataOutputStream(socket.getOutputStream()); System.out.print("請輸入: \t"); String str = new BufferedReader(new InputStreamReader(System.in)).readLine(); out.writeUTF(str); String ret = input.readUTF(); System.out.println("服務器端返回過來的是: " + ret); // 如接收到 "OK" 則斷開連接 if ("OK".equals(ret)) { System.out.println("客戶端將關閉連接"); Thread.sleep(500); break; } out.close(); input.close(); } catch (Exception e) { System.out.println("客戶端異常:" + e.getMessage()); } finally { if (socket != null) { try { socket.close(); } catch (IOException e) { socket = null; System.out.println("客戶端 finally 異常:" + e.getMessage()); } } } } } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      41

      42

      43

      44

      45

      46

      47

      48

      49

      50

      51

      52

      53

      54

      55

      56

      57

      58

      59

      60

      注意: Socket 輸出流寫數據方法是 writeUTF 時,輸入流讀取相關數據要用 readUTF。否則會拋 EOFException

      異常。具體原因請參考文后鏈接。

      ##運行結果

      ![這里寫圖片描述](https://img-blog.csdnimg.cn/img_convert/e75e585b97d8c7eb41ed7e8b79c71696.png) ![這里寫圖片描述](https://img-blog.csdnimg.cn/img_convert/a9213552069bdf301566e0b7209c3cc1.png)

      ##參考資料

      http://stackoverflow.com/questions/5489915/java-datainputstream-read-operations-throwing-exceptions

      ![這里寫圖片描述](https://img-blog.csdnimg.cn/img_convert/6dff784ae1058aa3d40679da516d20b8.png) ![這里寫圖片描述](https://img-blog.csdnimg.cn/img_convert/437c73c13548789c62422bc561fb50de.png) ![這里寫圖片描述](https://img-blog.csdnimg.cn/img_convert/f459c10693e43d23c8198384035f8f40.png)

      Java Socket編程

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Python語言學習:Python常用自帶庫(imageio、pickle)簡介、使用方法之詳細攻略
      下一篇:Linux目錄結構(文件系統結構)和舉例說明
      相關文章
      朝桐光亚洲专区在线中文字幕| 亚洲色偷偷综合亚洲AV伊人蜜桃| 久久精品亚洲综合专区| 亚洲成AV人片久久| 亚洲一区二区三区在线播放| 亚洲成人福利在线| 亚洲美女视频免费| 亚洲精品夜夜夜妓女网| 国产亚洲美女精品久久| 77777午夜亚洲| 亚洲精品无码mv在线观看网站| 老司机亚洲精品影视www| 亚洲精品无码你懂的| 亚洲免费视频网址| 亚洲V无码一区二区三区四区观看| 国产亚洲精品免费| 亚洲Av无码乱码在线znlu| 色偷偷亚洲女人天堂观看欧| 亚洲一卡2卡4卡5卡6卡在线99 | 亚洲日本va中文字幕久久| 色偷偷亚洲男人天堂| 国产精品亚洲色图| 亚洲国产精品第一区二区三区| 亚洲熟妇久久精品| 亚洲AV无码精品蜜桃| 国产精品亚洲综合久久| 欧美亚洲精品一区二区| 亚洲天堂免费在线| 亚洲精品天堂成人片AV在线播放| 亚洲AV香蕉一区区二区三区| 国产亚洲综合视频| 亚洲深深色噜噜狠狠爱网站| 亚洲成av人在线视| 亚洲色图古典武侠| 亚洲宅男精品一区在线观看| 亚洲av永久无码| 成人午夜亚洲精品无码网站| 亚洲乱码日产精品a级毛片久久| 国产偷国产偷亚洲清高动态图| 亚洲国产精品无码久久一区二区 | 亚洲欧洲国产经精品香蕉网|