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

簡(jiǎn)單模擬多線(xiàn)程Socket通信(java)

系統(tǒng) 2509 0

先來(lái)看一段單線(xiàn)程的原始代碼(代碼中有詳細(xì)的注釋):

服務(wù)器(TCPServer.java):


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

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

}
  

客戶(hù)端(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); //創(chuàng)建一個(gè)Socket對(duì)象,連接IP地址為192.168.24.177的服務(wù)器的5566端口
    DataOutputStream dos = new DataOutputStream(s.getOutputStream()); //獲取Socket對(duì)象的輸出流,并且在外邊包一層DataOutputStream管道,方便輸出數(shù)據(jù)
    dos.writeUTF("客戶(hù)端消息"); //DataOutputStream對(duì)象的writeUTF()方法可以輸出數(shù)據(jù),并且支持中文
    dos.flush(); //確保所有數(shù)據(jù)都已經(jīng)輸出
    dos.close(); //關(guān)閉輸出流
    s.close(); //關(guān)閉Socket連接
  }
}
  


以上代碼利用Socket對(duì)象和ServerSocket對(duì)象進(jìn)行簡(jiǎn)單的網(wǎng)絡(luò)交互,即客戶(hù)端通過(guò)DataOutputStream對(duì)象的writeUTF()方法向服務(wù)器發(fā)送消息,服務(wù)器利用DataInputStream對(duì)象的readUTF()方法讀出數(shù)據(jù)。

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

同理,DataInputStream對(duì)象的readUTF()方法也是阻塞的方法,它也會(huì)一直等待,直到客戶(hù)端調(diào)用writeUTF()方法。

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

要解決這個(gè)問(wèn)題,當(dāng)然要用多線(xiàn)程。

如果每個(gè)客戶(hù)端都獨(dú)有一個(gè)線(xiàn)程,讓readUTF()方法阻塞客戶(hù)端獨(dú)有的線(xiàn)程,而不去阻塞服務(wù)器主線(xiàn)程,這樣服務(wù)器就可以同時(shí)接受多個(gè)客戶(hù)端連接,而不用考慮客戶(hù)端何時(shí)調(diào)用writeUTF()方法發(fā)送數(shù)據(jù)。代碼如下:

服務(wù)器(TCPServer.java):


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

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

}

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

客戶(hù)端(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); //創(chuàng)建一個(gè)Socket對(duì)象,連接IP地址為192.168.24.177的服務(wù)器的5566端口
    DataOutputStream dos = new DataOutputStream(s.getOutputStream()); //獲取Socket對(duì)象的輸出流,并且在外邊包一層DataOutputStream管道,方便輸出數(shù)據(jù)
    Thread.sleep((int)(Math.random()*3000)); //讓客戶(hù)端不定時(shí)向服務(wù)器發(fā)送消息
    dos.writeUTF("客戶(hù)端消息"); //DataOutputStream對(duì)象的writeUTF()方法可以輸出數(shù)據(jù),并且支持中文
    dos.flush(); //確保所有數(shù)據(jù)都已經(jīng)輸出
    dos.close(); //關(guān)閉輸出流
    s.close(); //關(guān)閉Socket連接
  }
}
  


運(yùn)行結(jié)果如下(參考結(jié)果,不一定相同!):

簡(jiǎn)單模擬多線(xiàn)程Socket通信(java)

明顯看出第2、3、4客戶(hù)端都沒(méi)有向服務(wù)器端發(fā)出消息,但都成功連接,而且第2、3、4客戶(hù)端向服務(wù)器發(fā)出消息也沒(méi)有順序。

通過(guò)多線(xiàn)程,實(shí)現(xiàn)了多個(gè)客戶(hù)端同時(shí)連接服務(wù)器,并且服務(wù)器能實(shí)時(shí)處理多個(gè)客戶(hù)端發(fā)出的消息。

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


簡(jiǎn)單模擬多線(xiàn)程Socket通信(java)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 日日操日日舔 | 久久精品亚洲精品国产欧美 | 中文字幕精品视频 | 久久久久久久国产精品毛片 | 国产亚洲欧美在线 | 久久www免费人成高清 | 精品国产九九 | 亚洲性激情 | 国产成人精视频在线观看免费 | 免费看特级毛片 | 国产爽片在线观看 | 最新国产精品亚洲 | 精品一区二区三区免费毛片爱 | 国产成人精品综合久久久软件 | 四虎影视最新网址 | 老子影院午夜伦手机在线看 | 99在线精品免费视频 | 久久老色鬼天天综合网观看 | 男人天堂欧美 | 69做爰视频在线观看 | 69美女福利视频在线观看 | 国产精品a区| 日韩人成免费网站大片 | 色综合天天综合网看在线影院 | 日韩在线1 | 日韩男女视频 | 六月婷婷色| 5060午夜一级毛片免费观看 | 91青青青国产在观免费影视 | 精品一区二区三区在线观看l | 亚洲久久色 | 免费看日韩欧美一级毛片 | 中文字幕欧美亚洲 | 国产精品久久久久久久 | 亚洲综合91 | se在线观看| 伊人伊人伊人伊人 | 在线观看高清国产福利视频 | 一级aa免费视频毛片 | 久久青青草原精品影院 | 一本色道久久综合亚洲精品 |