亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

簡單模擬多線程Socket通信(java)

系統 2171 0

先來看一段單線程的原始代碼(代碼中有詳細的注釋):

服務器(TCPServer.java):


    import java.net.*;
import java.io.*;

public class TCPServer{
  public static void main(String[] args) throws Exception{
    ServerSocket ss = new ServerSocket(5566); //創建一個Socket服務器,監聽5566端口
    int i=0;
    //利用死循環不停的監聽端口
    while(true){
      Socket s = ss.accept(); //利用Socket服務器的accept()方法獲取客戶端Socket對象。
      i++;
      System.out.println("第" + i +"個客戶端成功連接!");
      DataInputStream dis = new DataInputStream(s.getInputStream()); //獲取客戶端Socket對象的輸入流,并在外邊加一層DataInputStream管道,目的是方便讀取數據
      System.out.println(dis.readUTF()); //讀出流中的數據,DataInputStream對象的readUTF()方法可以讀出流中的數據,而且支持中文
      dis.close(); //關閉管道連接
      s.close(); //關閉Socket連接
    }
  }

}
  

客戶端(TCPClient.java):


    import java.net.*;
import java.io.*;

public class TCPClient{
  public static void main(String[] args) throws Exception{
    Socket s = new Socket("192.168.24.177",5566); //創建一個Socket對象,連接IP地址為192.168.24.177的服務器的5566端口
    DataOutputStream dos = new DataOutputStream(s.getOutputStream()); //獲取Socket對象的輸出流,并且在外邊包一層DataOutputStream管道,方便輸出數據
    dos.writeUTF("客戶端消息"); //DataOutputStream對象的writeUTF()方法可以輸出數據,并且支持中文
    dos.flush(); //確保所有數據都已經輸出
    dos.close(); //關閉輸出流
    s.close(); //關閉Socket連接
  }
}
  


以上代碼利用Socket對象和ServerSocket對象進行簡單的網絡交互,即客戶端通過DataOutputStream對象的writeUTF()方法向服務器發送消息,服務器利用DataInputStream對象的readUTF()方法讀出數據。

看上去挺好,但ServerSocket對象的accept()方法是阻塞的方法,它會一直等待,直到有客戶端連接。

同理,DataInputStream對象的readUTF()方法也是阻塞的方法,它也會一直等待,直到客戶端調用writeUTF()方法。

因此,假如某個客戶端成功連接服務器,但是遲遲不調用writeUTF()方法發送數據,服務器就要一直等待,直到客戶端調用writeUTF()方法為止,此期間整個服務器是阻塞的,無法再接受其他客戶端連接,顯然這不符合實際情況。

要解決這個問題,當然要用多線程。

如果每個客戶端都獨有一個線程,讓readUTF()方法阻塞客戶端獨有的線程,而不去阻塞服務器主線程,這樣服務器就可以同時接受多個客戶端連接,而不用考慮客戶端何時調用writeUTF()方法發送數據。代碼如下:

服務器(TCPServer.java):


    import java.net.*;
import java.io.*;

public class TCPServer{
  public static void main(String[] args) throws Exception{
    ServerSocket ss = new ServerSocket(5566); //創建一個Socket服務器,監聽5566端口
    int i=0;
    //利用死循環不停的監聽端口
    while(true){
      Socket s = ss.accept();//利用Socket服務器的accept()方法獲取客戶端Socket對象。
      i++;
      System.out.println("第" + i +"個客戶端成功連接!");
      Client c = new Client(i,s); //創建客戶端處理線程對象
      Thread t =new Thread(c); //創建客戶端處理線程
      t.start(); //啟動線程
    }
  }

}

//客戶端處理線程類(實現Runnable接口)
class Client implements Runnable{
  int clientIndex = 0; //保存客戶端id
  Socket s = null; //保存客戶端Socket對象
  
  Client(int i,Socket s){
    clientIndex = i;
    this.s = s;
  }
  
  public void run(){
    //打印出客戶端數據
    try{
      DataInputStream dis = new DataInputStream(s.getInputStream());
      System.out.println("第" + clientIndex + "個客戶端發出消息:" + dis.readUTF());
      dis.close();
      s.close();
    }
    catch(Exception e)
    {}
  }
}
  

客戶端(TCPClient.java):


    import java.net.*;
import java.io.*;

public class TCPClient{
  public static void main(String[] args) throws Exception{
    Socket s = new Socket("192.168.24.177",5566); //創建一個Socket對象,連接IP地址為192.168.24.177的服務器的5566端口
    DataOutputStream dos = new DataOutputStream(s.getOutputStream()); //獲取Socket對象的輸出流,并且在外邊包一層DataOutputStream管道,方便輸出數據
    Thread.sleep((int)(Math.random()*3000)); //讓客戶端不定時向服務器發送消息
    dos.writeUTF("客戶端消息"); //DataOutputStream對象的writeUTF()方法可以輸出數據,并且支持中文
    dos.flush(); //確保所有數據都已經輸出
    dos.close(); //關閉輸出流
    s.close(); //關閉Socket連接
  }
}
  


運行結果如下(參考結果,不一定相同!):

簡單模擬多線程Socket通信(java)

明顯看出第2、3、4客戶端都沒有向服務器端發出消息,但都成功連接,而且第2、3、4客戶端向服務器發出消息也沒有順序。

通過多線程,實現了多個客戶端同時連接服務器,并且服務器能實時處理多個客戶端發出的消息。

以上僅僅是作為初學者的一些想法,僅供參考!


簡單模擬多線程Socket通信(java)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 成人性视频免费网站 | 久久99热久久精品91 | 欧美19p| 亚洲欧美日韩中文字幕在线一 | 国产日比视频 | 久久影视免费体验区午夜啪啪 | 亚洲va国产va欧美va综合 | 色淫影院| 99久久精品费精品国产一区二 | 色视频一区 | 欧美天天爽 | jiucao视频在线观看 | 欧美成人猛男性色生活 | 女人18毛片a级毛片免费看一 | swag国产精品一区二区 | 国产99对白在线播放 | 精品三级国产一区二区三区四区 | 综合激情五月婷婷 | 欧美亚洲动漫 | 亚洲国产成a人v在线观看 | 青青青青手机在线视频观看国产 | 国产午夜不卡 | 激情五月婷婷久久 | 色婷婷综合久久久久中文一区二区 | 亚洲 欧美 日韩 在线 | 亚洲国产综合久久精品 | 午夜一级毛片 | 精品福利一区二区三区免费视频 | 日韩午夜在线视频 | 国产欧美日韩精品高清二区综合区 | 狠狠操图片 | 国产精品福利视频一区二区三区 | 狠狠色噜噜狠狠狠狠色吗综合 | 一本久久精品一区二区 | 狠狠色丁香婷婷综合最新地址 | www.深夜| 久久久91精品国产一区二区三区 | 美女羞羞视频 | 国产区一区 | 狠狠色噜噜狠狠狠狠97影音先锋 | 国产精品免费观在线 |