您好,登錄后才能下訂單哦!
本篇文章為大家展示了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è)資訊頻道。
免責(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)容。