亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JAVA如何實現基于Socket的多線程通信

發布時間:2021-10-15 13:46:52 來源:億速云 閱讀:146 作者:小新 欄目:編程語言

這篇文章主要介紹了JAVA如何實現基于Socket的多線程通信,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

  代碼簡介

  代碼思想:

  實現"服務端-客戶端"之間的通信需要解決兩點問題

  (1),如何實現通信

  (2),通信中如何避免單線程先接收后發送(或先發送后接收)的問題;

  解決方案:

  (1),實現通信:使用ServerSocket監聽指定端口后,Socket進行連接;然后客戶端與服務端都獲取Socket對象的輸入輸出流存入PrintWrite后不斷刷新,即可實現通信;

  (2),彌補單線程缺陷:創建消息接收類和消息發送類分別繼承Thread;然后通過開啟兩個線程完避免單線程必須先接收后發送(或先發送后接收)的問題;

  服務端

  package x_Socket;

  import java.io.BufferedReader;

  import java.io.IOException;

  import java.io.InputStreamReader;

  import java.io.PrintWriter;

  import java.net.ServerSocket;

  import java.net.Socket;

  public class x_Server{

  /** 聲明全局對象,讓x_Server的內部類可以共同調用這些對象 **/

  static ServerSocket serverSocket = null;//聲明靜態全局的socket類對象;讓x_Server的靜態方法可以直接調用該對象;

  static Socket socket = null; //聲明靜態全局的socket類對象;讓x_Server的靜態方法可以直接調用該對象;

  BufferedReader buffSend = null; //信息發送數據流

  BufferedReader buffReciever = null; //信息接收數據流

  PrintWriter printWriter = null; //數據讀寫數據流

  /** 主函數入口 **/

  public static void main(String[] args) throws IOException {

  serverSocket = new ServerSocket(5556); //通過Socket的構造函數,監聽的5556端口(即等待socket對象向該端口請求連接)

  socket = serverSocket.accept(); //如果有socket的對象請求連接了5556端口,則serverSocket的accept返回一個socket對象;

  System.out.println("有用戶成功連接客戶端");

  Thread xsend = new Thread(new x_Server().new x_Send()); //通過Thread類的構造函數,創建一個x_Send類的線程對象

  Thread xreciver = new Thread(new x_Server().new x_Receiver()); //通過外部類對象去實例化內部類,再通過Thread的構造函數,創建內部類x_Reciever的線程二對象;

  xsend.start(); //啟動x_Send的線程,讓發送與接收數據可以同時進行

  xreciver.start(); //啟動x_Receiver的線程,讓發送與接收數據可以同時進行

  }

  /** 用于服務端發送信息的x_Send類(線程一) **/

  class x_Send extends Thread{

  public void run(){ //繼承Thread類,必須重寫run()方法

  try {

  buffSend = new BufferedReader(new InputStreamReader(System.in));//獲取從控制臺輸入數據的對象buffSend

  printWriter = new PrintWriter(socket.getOutputStream()); //通過PrintWriter類的構造方法,獲取向客戶端發送信息的輸出流對象

  String msg = null; //msg:存儲服務端發送的信息

  do{

  msg = buffSend.readLine(); //獲得從控制臺輸入一行的信息

  printWriter.println(msg); //將msg傳到向服務端發送信息的輸出流對象

  printWriter.flush(); //刷新輸入輸出流,客戶端端可以立刻收到輸入輸出流的更新信息

  }while(!msg.equals("end")); //客戶輸入"end"表示結束通信

  socket.close(); //關閉端口5556的連接

  serverSocket.close(); //不再監聽端口5556(即不再接收來自該端口的連接)

  } catch (IOException e) {

  System.out.println("客戶端連接已斷開");

  e.printStackTrace();

  }

  }

  }

  /** 用于服務端接收信息的x_Reciever類(線程二) **/

  class x_Receiver extends Thread{

  public void run(){ //繼承Thread類,必須重寫run()方法

  try {

  buffReciever = new BufferedReader(new InputStreamReader(socket.getInputStream())); //獲取從socket輸入(客戶端傳輸過來)數據的輸入流對象

  while(true){

  System.out.println("接收客戶端消息:"+buffReciever.readLine()); //輸出客戶端傳輸過來的信息

  }

  } catch (IOException e) {

  System.out.println("客戶端連接已斷開:\n");

  e.printStackTrace();

  }

  }

  }

  }

  客戶端

  package x_Socket;

  import java.io.BufferedReader;

  import java.io.IOException;

  import java.io.InputStreamReader;

  import java.io.PrintWriter;

  import java.net.Socket;

  import java.net.UnknownHostException;

  public class x_Client {

  /** 聲明全局對象,讓x_Client的內部類可以共同調用這些對象 **/

  static Socket socket = null; //聲明靜態全局的socket類對象;讓x_Client的靜態方法可以直接調用該對象;

  BufferedReader buffSend = null; //信息發送數據流

  BufferedReader buffReciever = null; //信息接收數據流

  PrintWriter printWriter = null; //數據讀寫數據流

  /** 主函數入口 **/

  public static void main(String[] args) throws UnknownHostException, IOException {

  socket =new Socket("127.0.0.1",5556); //通過Socket的構造函數,連接本地ip的5556端口

  System.out.println("連接服務端信息如下:\nip:127,0.0.1 port:5556");

  Thread xsend = new Thread(new x_Client().new x_SendMsg()); //通過Thread類的構造函數,創建一個x_SendMsg類的線程對象

  Thread xreciver = new Thread(new x_Client().new x_RecieverMsg()); //通過外部類對象去實例化內部類,再通過Thread的構造函數,創建內部類x_RecieverMsg的線程二對象;

  xsend.start(); //啟動x_SendMsg的線程;

  xreciver.start(); //啟動x_RecieverMsg的線程;兩個讓發送與接收數據可以同時進行

  }

  /** 用于客戶端發送信息的x_SendMsg類(線程一)**/

  class x_SendMsg extends Thread{

  public void run(){ //繼承Thread類,必須重寫run()方法

  try {

  buffSend = new BufferedReader(new InputStreamReader(System.in));//獲取從控制臺輸入數據的對象buffSend

  printWriter = new PrintWriter(socket.getOutputStream()); //通過PrintWriter類的構造方法,獲取向服務端發送信息的輸出流對象

  String msg = null; //msg:存儲客戶端發送的信息

  do{

  msg = buffSend.readLine(); //獲得從控制臺輸入一行的信息

  printWriter.println(msg); //將msg傳到向服務端發送信息的輸出流對象

  printWriter.flush(); //刷新輸入輸出流,服務端可以立刻收到輸入輸出流的更新信息

  }while(!msg.equals("end")); //客戶輸入"end"表示結束通信

  socket.close(); //關閉端口5556的連接

  } catch (IOException e) {

  System.out.println("服務端端口已關閉"); //異常提示信息顯示

  e.printStackTrace(); 鄭州祛胎記醫院哪家好 http://www.zykeda120.com/

  }

  }

  }

  /** 用于客戶端接收信息的x_RecieverMsg類(線程二) **/

  class x_RecieverMsg extends Thread{

  public void run(){ //繼承Thread類,必須重寫run()方法

  try {

  buffReciever = new BufferedReader(new InputStreamReader(socket.getInputStream())); //獲取從socket輸入(服務端傳輸過來)數據的輸入流對象

  while(true){

  System.out.println("收到服務端消息:"+buffReciever.readLine()); //輸出服務端傳輸過來的信息

  }

  } catch (IOException e) {

  System.out.println("服務端端口已關閉"); //異常提示信息顯示

  e.printStackTrace();

  }

  }

感謝你能夠認真閱讀完這篇文章,希望小編分享的“JAVA如何實現基于Socket的多線程通信”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

河间市| 平罗县| 朝阳市| 古浪县| 南皮县| 边坝县| 福泉市| 两当县| 遵义市| 山东省| 滨海县| 五家渠市| 宁强县| 新乡县| 尚志市| 定西市| 慈利县| 榆林市| 昆山市| 昭通市| 云霄县| 江津市| 区。| 左权县| 罗源县| 察隅县| 镇坪县| 大化| 平罗县| 叶城县| 山阳县| 吉木乃县| 平利县| 渝中区| 赤水市| 梧州市| 乐平市| 伽师县| 安顺市| 虞城县| 玛纳斯县|