国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - [Java]詳解Socket和ServerSocket學(xué)習(xí)筆記

[Java]詳解Socket和ServerSocket學(xué)習(xí)筆記

2020-07-15 11:57Ron Ngai Java教程

即時(shí)類(lèi)應(yīng)用或者即時(shí)類(lèi)的游戲,HTTP協(xié)議很多時(shí)候無(wú)法滿足于我們的需求,這會(huì),Socket對(duì)于我們來(lái)說(shuō)就非常實(shí)用了。本篇文章主要介紹了Socket和ServerSocket,有興趣的可以了解一下。

對(duì)于即時(shí)類(lèi)應(yīng)用或者即時(shí)類(lèi)的游戲,HTTP協(xié)議很多時(shí)候無(wú)法滿足于我們的需求。這會(huì),Socket對(duì)于我們來(lái)說(shuō)就非常實(shí)用了。下面是本次學(xué)習(xí)的筆記。主要分異常類(lèi)型、交互原理、Socket、ServerSocket、多線程這幾個(gè)方面闡述。

異常類(lèi)型

在了解Socket的內(nèi)容之前,先要了解一下涉及到的一些異常類(lèi)型。以下四種類(lèi)型都是繼承于IOException,所以很多之后直接彈出IOException即可。

UnkownHostException:   主機(jī)名字或IP錯(cuò)誤

ConnectException:  服務(wù)器拒絕連接、服務(wù)器沒(méi)有啟動(dòng)、(超出隊(duì)列數(shù),拒絕連接)

SocketTimeoutException: 連接超時(shí)

BindException:  Socket對(duì)象無(wú)法與制定的本地IP地址或端口綁定

交互過(guò)程

Socket與ServerSocket的交互,下面的圖片我覺(jué)得已經(jīng)說(shuō)的很詳細(xì)很清楚了。

[Java]詳解Socket和ServerSocket學(xué)習(xí)筆記

Socket

構(gòu)造函數(shù)

?
1
2
3
4
5
6
7
8
9
Socket()
 
Socket(InetAddress address, int port)throws UnknownHostException, IOException
 
Socket(InetAddress address, int port, InetAddress localAddress, int localPort)throws IOException
 
Socket(String host, int port)throws UnknownHostException, IOException
 
Socket(String host, int port, InetAddress localAddress, int localPort)throws IOException

除去第一種不帶參數(shù)的之外,其它構(gòu)造函數(shù)會(huì)嘗試建立與服務(wù)器的連接。如果失敗會(huì)拋出IOException錯(cuò)誤。如果成功,則返回Socket對(duì)象。

InetAddress是一個(gè)用于記錄主機(jī)的類(lèi),其靜態(tài)getHostByName(String msg)可以返回一個(gè)實(shí)例,其靜態(tài)方法getLocalHost()也可以獲得當(dāng)前主機(jī)的IP地址,并返回一個(gè)實(shí)例。Socket(String host, int port, InetAddress localAddress, int localPort)構(gòu)造函數(shù)的參數(shù)分別為目標(biāo)IP、目標(biāo)端口、綁定本地IP、綁定本地端口。

Socket方法

getInetAddress();      遠(yuǎn)程服務(wù)端的IP地址

getPort();          遠(yuǎn)程服務(wù)端的端口

getLocalAddress()      本地客戶端的IP地址

getLocalPort()        本地客戶端的端口

getInputStream();     獲得輸入流

getOutStream();      獲得輸出流

值得注意的是,在這些方法里面,最重要的就是getInputStream()和getOutputStream()了。

Socket狀態(tài)

isClosed();            //連接是否已關(guān)閉,若關(guān)閉,返回true;否則返回false

isConnect();      //如果曾經(jīng)連接過(guò),返回true;否則返回false

isBound();            //如果Socket已經(jīng)與本地一個(gè)端口綁定,返回true;否則返回false

如果要確認(rèn)Socket的狀態(tài)是否處于連接中,下面語(yǔ)句是很好的判斷方式。

?
1
boolean isConnection=socket.isConnected() && !socket.isClosed();  //判斷當(dāng)前是否處于連接

半關(guān)閉Socket

很多時(shí)候,我們并不知道在獲得的輸入流里面到底讀多長(zhǎng)才結(jié)束。下面是一些比較普遍的方法:

  • 自定義標(biāo)識(shí)符(譬如下面的例子,當(dāng)受到“bye”字符串的時(shí)候,關(guān)閉Socket)
  • 告知讀取長(zhǎng)度(有些自定義協(xié)議的,固定前幾個(gè)字節(jié)表示讀取的長(zhǎng)度的)
  • 讀完所有數(shù)據(jù)
  • 當(dāng)Socket調(diào)用close的時(shí)候關(guān)閉的時(shí)候,關(guān)閉其輸入輸出流

ServerSocket

構(gòu)造函數(shù)

?
1
2
3
4
5
6
7
ServerSocket()throws IOException
 
ServerSocket(int port)throws IOException
 
ServerSocket(int port, int backlog)throws IOException
 
ServerSocket(int port, int backlog, InetAddress bindAddr)throws IOException

注意點(diǎn):

1. port服務(wù)端要監(jiān)聽(tīng)的端口;backlog客戶端連接請(qǐng)求的隊(duì)列長(zhǎng)度;bindAddr服務(wù)端綁定IP

2. 如果端口被占用或者沒(méi)有權(quán)限使用某些端口會(huì)拋出BindException錯(cuò)誤。譬如1~1023的端口需要管理員才擁有權(quán)限綁定。

3. 如果設(shè)置端口為0,則系統(tǒng)會(huì)自動(dòng)為其分配一個(gè)端口;

4. bindAddr用于綁定服務(wù)器IP,為什么會(huì)有這樣的設(shè)置呢,譬如有些機(jī)器有多個(gè)網(wǎng)卡。

5. ServerSocket一旦綁定了監(jiān)聽(tīng)端口,就無(wú)法更改。ServerSocket()可以實(shí)現(xiàn)在綁定端口前設(shè)置其他的參數(shù)。

 單線程的ServerSocket例子

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void service(){
  while(true){
    Socket socket=null;
    try{
      socket=serverSocket.accept();//從連接隊(duì)列中取出一個(gè)連接,如果沒(méi)有則等待
      System.out.println("新增連接:"+socket.getInetAddress()+":"+socket.getPort());
      ...//接收和發(fā)送數(shù)據(jù)
    }catch(IOException e){e.printStackTrace();}finally{
      try{
        if(socket!=null) socket.close();//與一個(gè)客戶端通信結(jié)束后,要關(guān)閉Socket
      }catch(IOException e){e.printStackTrace();}
    }
  }
}

多線程的ServerSocket

多線程的好處不用多說(shuō),而且大多數(shù)的場(chǎng)景都是多線程的,無(wú)論是我們的即時(shí)類(lèi)游戲還是IM,多線程的需求都是必須的。下面說(shuō)說(shuō)實(shí)現(xiàn)方式:

  • 主線程會(huì)循環(huán)執(zhí)行ServerSocket.accept();
  • 當(dāng)拿到客戶端連接請(qǐng)求的時(shí)候,就會(huì)將Socket對(duì)象傳遞給多線程,讓多線程去執(zhí)行具體的操作;

實(shí)現(xiàn)多線程的方法要么繼承Thread類(lèi),要么實(shí)現(xiàn)Runnable接口。當(dāng)然也可以使用線程池,但實(shí)現(xiàn)的本質(zhì)都是差不多的。

 這里舉例:

下面代碼為服務(wù)器的主線程。為每個(gè)客戶分配一個(gè)工作線程:

?
1
2
3
4
5
6
7
8
9
10
11
12
public void service(){
  while(true){
    Socket socket=null;
    try{
      socket=serverSocket.accept();            //主線程獲取客戶端連接
      Thread workThread=new Thread(new Handler(socket));  //創(chuàng)建線程
      workThread.start();                  //啟動(dòng)線程
    }catch(Exception e){
      e.printStackTrace();
    }
  }
}

 當(dāng)然這里的重點(diǎn)在于如何實(shí)現(xiàn)Handler這個(gè)類(lèi)。Handler需要實(shí)現(xiàn)Runnable接口:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Handler implements Runnable{
  private Socket socket;
  public Handler(Socket socket){
    this.socket=socket;
  }
  
  public void run(){
    try{
      System.out.println("新連接:"+socket.getInetAddress()+":"+socket.getPort());
      Thread.sleep(10000);
    }catch(Exception e){e.printStackTrace();}finally{
      try{
        System.out.println("關(guān)閉連接:"+socket.getInetAddress()+":"+socket.getPort());
        if(socket!=null)socket.close();
      }catch(IOException e){
        e.printStackTrace();
      }
    }
  }
}

當(dāng)然是先多線程還有其它的方式,譬如線程池,或者JVM自帶的線程池都可以。這里就不說(shuō)明了。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:http://www.cnblogs.com/rond/p/3565113.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久草青青草 | 在线看黄色毛片 | 亚洲小视频网站 | 久久久久久网站 | 不卡久久 | 直接看av的网站 | 亚洲lesbianxxxxhd 亚洲男人天堂2018 | 秋霞特色aa大片 | 亚洲午夜免费视频 | porn亚洲| 欧美福利| 色网站视频 | 天堂资源在线 | 亚洲热妇| 久操视频免费在线观看 | 91久久久久久久久久 | 国产一区二区精品在线观看 | 中文字幕一区三级久久日本 | 成人午夜性a一级毛片免费看 | 超碰人人操 | 国产精品视频免费看 | 天天澡天天狠天天天做 | 国产日韩欧美精品 | 日本黄色激情片 | 一区二区三区免费观看视频 | 99国产精品99久久久久久 | 国产成人天天爽高清视频 | 黄色网在线看 | 日韩有码在线播放 | 性做久久久 | 都市激情在线视频 | 久久久精品国产 | 午夜色电影 | 日本中文字幕网 | 国产一区二区视频在线观看 | 日韩av在线中文字幕 | 亚洲精品永久视频 | 亚洲一区精品在线 | 这里只有久久精品 | 久久丁香| 黄色成人影视 |