Socket接口用法詳解java
在Java中,基於TCP協議實現網絡通訊的類有兩個,在客戶端的Socket類和在服務器端的ServerSocket類,ServerSocket類的功能是創建一個Server,並經過accept()方法隨時監聽客戶端的鏈接請求。程序員
擴展:編程
ServerSocket中經常使用的構造函數及方法數組
構造函數:ServerSocket(intport) 這是一個構造方法,用於在當前的服務器默認的IP地址上監聽一個指定的端口,即在指定的IP和端口建立一個ServerSocket對象服務器
方法:微信
Socket accept()產生阻塞,監聽指定的端口,直至有客戶端發來鏈接請求網絡
void close() 關閉當前ServerSocket併發
InetAddressgetInetAddress() 返回ServerSocket監聽的,本機的IP地址socket
intgetLocalPort() 返回ServerSocket監聽的,本機的IP地址上指定的端口號函數
intgetSoTimeout();void setSoTimeout(int timeout) 設置鏈接過程當中沒有獲得相應的等待期限時間(TimeOut)
StringtoString() 以字符串的方式返回ServerSocket監聽的,本機的IP地址及其端口號
Socket類中經常使用的構造函數和方法
構造函數:Socket(InetAddressaddress,int port) 用於建立一個連接,向指定的IP地址上指定的端口的服務器端程序發送鏈接請求
Socket(Stringhost,int port) 同上,但該方法容許經過主機名字符串向服務器發送鏈接請求
方法:
void close()關閉當前的Socket 鏈接
InetAddressgetInetAddress() 返回Socket創建了鏈接的服務器的IP地址
InputStreamgetInputStream() 返回當前Socket的輸入流
OutputStreamgetOutStream() 返回當前Socket的輸出流
InetAddressgetLocalAddress() 返回和Socket進行鏈接的本地的IP地址
intgetLocalPort() 返回和Socket進行鏈接的本地的端口號
int getPort() 返回和Socket創建了鏈接的服務器的端口號
intgetSoTimeOut();void setSoTimeOut(int timeout) 設置鏈接過程當中沒有獲得相應的等待期限時間
String toString() 以字符串的方式返回Socket的屬性信息
Socket類的構造方法包括如下幾種:
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異常,程序中須要捕獲並處理。
關閉Socket的方法爲:
public void close() throws IOException
設置/獲取Socket數據的方法爲:
public InetAddress getInetAddress()
public int getPort()
public void setSoTimeout(int timeout)
這些方法都將拋出SocketException異常,程序中須要捕獲並處理。
ServerSocket類的構造方法包括如下幾種:
public ServerSocket (int Port)
public ServerSocket (int Port,int backlog):支持指定數目的鏈接
public ServerSocket (int Port,intbacklog,InetAddress bindAddr)
這些方法都將拋出IOException異常,程序中須要捕獲並處理。
public Socket accept():等待客戶端的鏈接
public void close():關閉Socket
設置/獲取Socket數據的方法包括:
public InetAddress get InetAddress ()
public int getLocalPort()
public void setSoTimeout(int timeout)
這些方法都將拋出SocketException異常,程序中須要捕獲並處理。
Socket的基本概念
1.創建鏈接
當須要創建網絡鏈接時,必須有一臺機器運行一個程序,隨時等候鏈接,而另外一端的程序這對其發出鏈接請求。這一點同電話系統相似——必須有一方撥打電話,而另外一方必須等候電話連通。創建鏈接的過程爲:
(1)如今服務器端生成一個ServerSocket實例對象,隨時監聽客戶端的鏈接請求。
(2)當客戶端須要鏈接時,相應地要生成一個Socket實例對象,併發出鏈接請求,其中host參數指明該主機名,port#參數指明該主機端口號。
(3)服務器端經過accept()方法接收到客戶端的請求後,開闢一個接口與之進行鏈接,並生成所需的I/O數據流。
(4)客戶端和服務器端的通訊都是經過一對InputStream和OutputStream進行的,通訊結束後,兩端分別關閉對應的Socket接口。
2.鏈接地址
打電話時,呼叫方必須事先知道所需撥打的號碼,而程序創建網絡鏈接時,也一樣須要知道地址或主機名稱。另外,網絡鏈接還須要一個端口號(能夠將其看成電話的分機號),鏈接到正確的主機以後,須要對該鏈接確認特定口令。某些狀況下,還須要使用一個擴展號碼與網絡計費系統相連,因而相應地要有一個特定端口號用於鏈接計費程序。
3.端口號
在TCP/IP系統中,端口號由16位二進制整數組成,即在0-65535之間。實際應用中,前1024個端口號已經預先定義爲一些特定服務,所以通常不能使用,除非想同這些服務器進行鏈接(如Telnet,SMTP,mail,ftp等)。在兩個程序鏈接以前,彼此之間必須達成一致,即由客戶端負責初始化鏈接,而服務器隨時等候請求。只有客戶端和服務器端指定端口號一致時鏈接纔會創建。若是系統中兩個程序所用端口號不一致,這鏈接沒法創建。
4.網絡鏈接模式
在Java中,TCP/IP接口的鏈接是由java.net包中的類實現的。如圖表示的是Socket鏈接過程當中客戶端和服務器端的工做原理。
每一個server端都擁有一個端口號,一臺機器上若是運行多個服務,這可能對應多個端口號。通訊結束後,兩端分別關閉對應的Socket接口,而不影響其餘的端口。
Socket通訊的基本步驟
使用Socket方式進行網絡通訊的程序基本結構都是相似的,不管一個Socket通訊程序的功能多麼齊全、程序多麼複雜,其基本結構都是同樣的。客戶端與服務器端進行通訊的過程都包括如下四個基本步驟:
(1)在服務器端指定一個用來等待鏈接的端口號,在客戶端規定一個主機和端口號,從而在客戶端和服務器端建立Socket/ServerSocket實例。
(2)打開鏈接到Socket的輸入輸出流。
(3)利用輸入輸出流,按照必定的協議對Socket進行讀寫操做。
(4)關閉輸入輸出流和Socket
一般,程序員的主要工做時針對所要完成的功能砸器第(3)步進行編程,第(1)、(2)、(4)步對全部的通訊程序來講幾乎都是同樣的。
Socker通訊的程序設計
1.服務器端程序
TCP/IP服務器端應用程序是經過Java語言中提供的ServerSocket和Socket這兩個有關網絡的類來實現的。而ServerSocket類除了創建一個Server以外,還經過accept()方法提供了隨時監聽客戶端鏈接請求的功能,它的構造方法有如下兩種。
ServerSocket(int port)
ServerSocket(int port,int backlog)
其中port是指鏈接中對方的端口號,backlog則表示服務器端所能支持的最大鏈接數。下面的程序用來監聽客戶端應用程序創建鏈接的請求,並在鏈接創建後向客戶端發送信息。
/**
* 功能:這是服務器端程序,用來監聽客戶端應用程序創建鏈接的請求,並在鏈接創建後向客戶端發送信息
*/
package com.xushouwei;
//引入相應的包
import java.net.*;
import java.io.*;
public class TServer
{
public static void main(String[] args)
{
//定義ServerSocket類
ServerSocket s=null;
//定義Socket類
Socket s1;
//定義發送字符串
String sendString="你好!我是徐守威...";
//獲得發送字符串的長度
int s1lenth=sendString.length();
//定義OutputStream類
OutputStream s1out;
//定義DataOutputStream類
DataOutputStream dos;
//經過1314端口創建鏈接
try
{
//建立ServerSocket並把傳入端口號
s=new ServerSocket(1314);
} catch (Exception e)
{
e.printStackTrace();
}
//循環運行監聽程序,以監視鏈接請求
while(true)
{
try
{
//監聽端口請求,等待鏈接
s1=s.accept();
//獲得與socket相鏈接的數據流對象
s1out=s1.getOutputStream();
dos=new DataOutputStream(s1out);
//發送字符串
dos.writeUTF(sendString);
//關閉數據流(但不是關閉Socket鏈接)
dos.close();
s1out.close();
s1.close();
} catch (Exception e)
{
e.printStackTrace();
}
}
}
}
2.客戶端程序
TCP/IP服務器端應用程序是經過Java語言中提供的Socket類來實現的。一樣,Socket類提供了包括創建網絡鏈接在內的許多功能,它的構造方法有如下幾種:
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是本機的地址和端口號。下面程序用來與前面的服務器端程序創建鏈接,並將服務器端送來的信息顯示在標準輸出上。
/**
* 功能:這是客戶端程序,用來與前面的服務器端程序創建鏈接,並將服務器端送來的信息顯示在標準輸出上
*/
package com.xushouwei;
//引入相應的包
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端口的輸入句柄,並從中讀取數據
s1In=s1.getInputStream();
dis=new DataInputStream(s1In);
String st=new String(dis.readUTF());
System.out.println(st);
//操做結束,關閉數據流及socket鏈接
dis.close();
s1In.close();
s1.close();
} catch (Exception e)
{
e.printStackTrace();
}
}
}
瞭解更多詳情請登陸超人學院網站http://www.crxy.cn或者關注CRXY大數據微信號:CRXY-CN