溫馨提示×

溫馨提示×

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

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

Java中Socket接口如何使用

發(fā)布時間:2021-06-23 14:18:13 來源:億速云 閱讀:277 作者:Leah 欄目:云計算

本篇文章為大家展示了Java中Socket接口如何使用,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

Socket接口用法詳解

在Java中,基于TCP協(xié)議實現(xiàn)網(wǎng)絡(luò)通信的類有兩個,在客戶端的Socket類和在服務(wù)器端的ServerSocket類,ServerSocket類的功能是建立一個Server,并通過accept()方法隨時監(jiān)聽客戶端的連接請求。

擴展:

ServerSocket中常用的構(gòu)造函數(shù)及方法

構(gòu)造函數(shù):ServerSocket(intport) 這是一個構(gòu)造方法,用于在當(dāng)前的服務(wù)器默認的IP地址上監(jiān)聽一個指定的端口,即在指定的IP和端口創(chuàng)建一個ServerSocket對象

方法:

Socket accept()產(chǎn)生阻塞,監(jiān)聽指定的端口,直至有客戶端發(fā)來連接請求

void close() 關(guān)閉當(dāng)前ServerSocket

InetAddressgetInetAddress() 返回ServerSocket監(jiān)聽的,本機的IP地址

intgetLocalPort() 返回ServerSocket監(jiān)聽的,本機的IP地址上指定的端口號

intgetSoTimeout();void setSoTimeout(int timeout) 設(shè)置連接過程中沒有得到相應(yīng)的等待期限時間(TimeOut)

StringtoString()   以字符串的方式返回ServerSocket監(jiān)聽的,本機的IP地址及其端口號

Socket類中常用的構(gòu)造函數(shù)和方法

構(gòu)造函數(shù):Socket(InetAddressaddress,int port) 用于創(chuàng)建一個鏈接,向指定的IP地址上指定的端口的服務(wù)器端程序發(fā)送連接請求

Socket(Stringhost,int port)   同上,但該方法允許通過主機名字符串向服務(wù)器發(fā)送連接請求

方法:

void close()關(guān)閉當(dāng)前的Socket 連接

InetAddressgetInetAddress() 返回Socket建立了連接的服務(wù)器的IP地址

InputStreamgetInputStream() 返回當(dāng)前Socket的輸入流

OutputStreamgetOutStream() 返回當(dāng)前Socket的輸出流

InetAddressgetLocalAddress() 返回和Socket進行連接的本地的IP地址

intgetLocalPort() 返回和Socket進行連接的本地的端口號

int getPort() 返回和Socket建立了連接的服務(wù)器的端口號

intgetSoTimeOut();void setSoTimeOut(int timeout) 設(shè)置連接過程中沒有得到相應(yīng)的等待期限時間

String toString() 以字符串的方式返回Socket的屬性信息

Socket類的構(gòu)造方法包括以下幾種:

public Socket(String host,int port)

public Socket(InetAddress address,int port)

public Socket(String host,int port,InetAddresslocalAddr,int localPort)

public Socket(InetAddress host,int port, InetAddress,localAddr,intlocalPort)

在JDK1.1以前,Socket類可同時用于TCP/UDP通信:

public Socket(String host,int port,Booleanstream)

public Socket(InetAddress host,int port, Booleanstream)

Socket類的輸入/輸出流管理包括以下方法:

public InputStream getInputStream()

public void shutdowmInput()

public OutputStream get OutputStream ()

public void shutdowmOutput()

以上這些方法都將拋出IOException異常,程序中需要捕獲并處理。

關(guān)閉Socket的方法為:

public void close() throws IOException

設(shè)置/獲取Socket數(shù)據(jù)的方法為:

public InetAddress getInetAddress()

public int getPort()

public void setSoTimeout(int timeout)

這些方法都將拋出SocketException異常,程序中需要捕獲并處理。

ServerSocket類的構(gòu)造方法包括以下幾種:

public ServerSocket (int Port)

public ServerSocket (int Port,int backlog):支持指定數(shù)目的連接

public ServerSocket (int Port,intbacklog,InetAddress bindAddr)

這些方法都將拋出IOException異常,程序中需要捕獲并處理。

public Socket  accept():等待客戶端的連接

public void close():關(guān)閉Socket

設(shè)置/獲取Socket數(shù)據(jù)的方法包括:

public InetAddress  get InetAddress ()

public int getLocalPort()

public void setSoTimeout(int timeout)

這些方法都將拋出SocketException異常,程序中需要捕獲并處理。

Socket的基本概念

1.建立連接

當(dāng)需要建立網(wǎng)絡(luò)連接時,必須有一臺機器運行一個程序,隨時等候連接,而另一端的程序這對其發(fā)出連接請求。這一點同電話系統(tǒng)類似——必須有一方撥打電話,而另一方必須等候電話連通。建立連接的過程為:

(1)現(xiàn)在服務(wù)器端生成一個ServerSocket實例對象,隨時監(jiān)聽客戶端的連接請求。

(2)當(dāng)客戶端需要連接時,相應(yīng)地要生成一個Socket實例對象,并發(fā)出連接請求,其中host參數(shù)指明該主機名,port#參數(shù)指明該主機端口號。

(3)服務(wù)器端通過accept()方法接收到客戶端的請求后,開辟一個接口與之進行連接,并生成所需的I/O數(shù)據(jù)流。

(4)客戶端和服務(wù)器端的通信都是通過一對InputStream和OutputStream進行的,通信結(jié)束后,兩端分別關(guān)閉對應(yīng)的Socket接口。

2.連接地址

打電話時,呼叫方必須事先知道所需撥打的號碼,而程序建立網(wǎng)絡(luò)連接時,也同樣需要知道地址或主機名稱。另外,網(wǎng)絡(luò)連接還需要一個端口號(可以將其當(dāng)作電話的分機號),連接到正確的主機之后,需要對該連接確認特定口令。某些情況下,還需要使用一個擴展號碼與網(wǎng)絡(luò)計費系統(tǒng)相連,于是相應(yīng)地要有一個特定端口號用于連接計費程序。

3.端口號

在TCP/IP系統(tǒng)中,端口號由16位二進制整數(shù)組成,即在0-65535之間。實際應(yīng)用中,前1024個端口號已經(jīng)預(yù)先定義為一些特定服務(wù),因此一般不能使用,除非想同這些服務(wù)器進行連接(如Telnet,SMTP,mail,ftp等)。在兩個程序連接之前,彼此之間必須達成一致,即由客戶端負責(zé)初始化連接,而服務(wù)器隨時等候請求。只有客戶端和服務(wù)器端指定端口號一致時連接才會建立。如果系統(tǒng)中兩個程序所用端口號不一致,這連接無法建立。

4.網(wǎng)絡(luò)連接模式

在Java中,TCP/IP接口的連接是由java.net包中的類實現(xiàn)的。如圖表示的是Socket連接過程中客戶端和服務(wù)器端的工作原理。

每個server端都擁有一個端口號,一臺機器上如果運行多個服務(wù),這可能對應(yīng)多個端口號。通信結(jié)束后,兩端分別關(guān)閉對應(yīng)的Socket接口,而不影響其他的端口。

Socket通信的基本步驟

使用Socket方式進行網(wǎng)絡(luò)通信的程序基本結(jié)構(gòu)都是類似的,無論一個Socket通信程序的功能多么齊全、程序多么復(fù)雜,其基本結(jié)構(gòu)都是一樣的??蛻舳伺c服務(wù)器端進行通信的過程都包括以下四個基本步驟:

(1)在服務(wù)器端指定一個用來等待連接的端口號,在客戶端規(guī)定一個主機和端口號,從而在客戶端和服務(wù)器端創(chuàng)建Socket/ServerSocket實例。

(2)打開連接到Socket的輸入輸出流。

(3)利用輸入輸出流,按照一定的協(xié)議對Socket進行讀寫操作。

(4)關(guān)閉輸入輸出流和Socket

通常,程序員的主要工作時針對所要完成的功能砸器第(3)步進行編程,第(1)、(2)、(4)步對所有的通信程序來說幾乎都是一樣的。

Socker通信的程序設(shè)計

1.服務(wù)器端程序

TCP/IP服務(wù)器端應(yīng)用程序是通過Java語言中提供的ServerSocket和Socket這兩個有關(guān)網(wǎng)絡(luò)的類來實現(xiàn)的。而ServerSocket類除了建立一個Server之外,還通過accept()方法提供了隨時監(jiān)聽客戶端連接請求的功能,它的構(gòu)造方法有以下兩種。

ServerSocket(int port)

ServerSocket(int port,int backlog)

其中port是指連接中對方的端口號,backlog則表示服務(wù)器端所能支持的最大連接數(shù)。下面的程序用來監(jiān)聽客戶端應(yīng)用程序建立連接的請求,并在連接建立后向客戶端發(fā)送信息。

/**

 * 功能:這是服務(wù)器端程序,用來監(jiān)聽客戶端應(yīng)用程序建立連接的請求,并在連接建立后向客戶端發(fā)送信息

 */

package com.xushouwei;

//引入相應(yīng)的包

import java.net.*;

import java.io.*;

public class TServer

{

   public static void main(String[] args)

   {

      //定義ServerSocket類

      ServerSocket s=null;

      //定義Socket類

      Socket s1;

      //定義發(fā)送字符串

      String sendString="你好!我是徐守威...";

      //得到發(fā)送字符串的長度

      int s1lenth=sendString.length();

      //定義OutputStream類

      OutputStream s1out;

      //定義DataOutputStream類

      DataOutputStream dos;

      //通過1314端口建立連接

      try

      {

        //創(chuàng)建ServerSocket并把傳入端口號

        s=new ServerSocket(1314);

      } catch (Exception e)

      {

        e.printStackTrace();

      }

      //循環(huán)運行監(jiān)聽程序,以監(jiān)視連接請求

      while(true)

      {

        try

        {

           //監(jiān)聽端口請求,等待連接

           s1=s.accept();

           //得到與socket相連接的數(shù)據(jù)流對象

           s1out=s1.getOutputStream();

           dos=new DataOutputStream(s1out);

           //發(fā)送字符串

           dos.writeUTF(sendString);

           //關(guān)閉數(shù)據(jù)流(但不是關(guān)閉Socket連接)

           dos.close();

           s1out.close();

           s1.close();

        } catch (Exception e)

        {

           e.printStackTrace();

        }

      }

   }

}

2.客戶端程序

TCP/IP服務(wù)器端應(yīng)用程序是通過Java語言中提供的Socket類來實現(xiàn)的。同樣,Socket類提供了包括建立網(wǎng)絡(luò)連接在內(nèi)的許多功能,它的構(gòu)造方法有以下幾種:

Socket(InetAddress address,int port)

Socket(InetAddress address,int port,Booleanstream)

Socket(String host,int port)

Socket(String host,int port, InetAddresslocalAddr,int localPort)

其中,address、host和port分別指連接另一方的IP地址、主機名稱和端口號,stream這表示該Socket是否是支持流的Socket,localAddr和localPort是本機的地址和端口號。下面程序用來與前面的服務(wù)器端程序建立連接,并將服務(wù)器端送來的信息顯示在標準輸出上。

/**

 * 功能:這是客戶端程序,用來與前面的服務(wù)器端程序建立連接,并將服務(wù)器端送來的信息顯示在標準輸出上

 */

package com.xushouwei;

//引入相應(yīng)的包

import java.net.*;

import java.io.*;

public class TClint

{

   public static void main(String[] args)

   {

      //定義Socket類

      Socket s1;

      //定義InputStream類

      InputStream s1In;

      //定義DataInputStream類

      DataInputStream dis;

      try

      {

        //在端口1314打開連接

        s1=new Socket("127.0.0.1",1314);

        //獲得socket端口的輸入句柄,并從中讀取數(shù)據(jù)

        s1In=s1.getInputStream();

        dis=new DataInputStream(s1In);

        String st=new String(dis.readUTF());

        System.out.println(st);

        //操作結(jié)束,關(guān)閉數(shù)據(jù)流及socket連接

        dis.close();

        s1In.close();

        s1.close();

      } catch (Exception e)

      {

        e.printStackTrace();

      }

   }

}

上述內(nèi)容就是Java中Socket接口如何使用,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI