1. 程式人生 > >20180827-Java網路程式設計

20180827-Java網路程式設計

 

Java 網路程式設計

網路程式設計是指編寫執行在多個裝置(計算機)的程式,這些裝置都通過網路連線起來。

java.net包中J2SE的API包含有類和介面,它們提供低層次的通訊細節。
你可以直接使用這些類和介面,來專注於解決問題,而不用關注通訊細節。

java.net包中提供了兩種常見的網路協議的支援:

TCP: TCP是傳輸控制協議的縮寫,它保障了兩個應用程式之間的可靠通訊。通常用於網際網路協議,被稱TCP / IP。
UDP: UDP是使用者資料報協議的縮寫,一個無連線的協議。提供了應用程式之間要傳送的資料的資料包。

Socket 程式設計: 這是使用最廣泛的網路概念,它已被解釋地非常詳細
URL 處理

 

Socket 程式設計

套接字使用TCP提供了兩臺計算機之間的通訊機制。 客戶端程式建立一個套接字,並嘗試連線伺服器的套接字。
當連線建立時,伺服器會建立一個Socket物件。客戶端和伺服器現在可以通過對Socket物件的寫入和讀取來進行進行通訊。
java.net.Socket類代表一個套接字,並且java.net.ServerSocket類為伺服器程式提供了一種來監聽客戶端,並與他們建立連線的機制。

以下步驟在兩臺計算機之間使用套接字建立TCP連線時會出現:

1. 伺服器例項化一個ServerSocket物件,表示通過伺服器上的埠通訊。
2. 伺服器呼叫 ServerSocket類 的accept()方法,該方法將一直等待,直到客戶端連線到伺服器上給定的埠。
3. 伺服器正在等待時,一個客戶端例項化一個Socket物件,指定伺服器名稱和埠號來請求連線。
4. Socket類的建構函式試圖將客戶端連線到指定的伺服器和埠號。如果通訊被建立,則在客戶端建立一個Socket物件能夠與伺服器進行通訊。
5. 在伺服器端,accept()方法返回伺服器上一個新的socket引用,該socket連線到客戶端的socket。

連線建立後,通過使用I/O流在進行通訊。
每一個socket都有一個輸出流和一個輸入流。客戶端的輸出流連線到伺服器端的輸入流,而客戶端的輸入流連線到伺服器端的輸出流。

TCP是一個雙向的通訊協議,因此資料可以通過兩個資料流在同一時間傳送.以下是一些類提供的一套完整的有用的方法來實現sockets。


ServerSocket 類的方法

伺服器應用程式通過使用java.net.ServerSocket類以獲取一個埠,並且偵聽客戶端請求。

ServerSocket類有四個構造方法:

1. public ServerSocket(int port) throws IOException
建立繫結到特定埠的伺服器套接字。

2. public ServerSocket(int port, int backlog) throws IOException
利用指定的 backlog 建立伺服器套接字並將其繫結到指定的本地埠號。

3. public ServerSocket(int port, int backlog, InetAddress address) throws IOException
使用指定的埠、偵聽 backlog 和要繫結到的本地 IP 地址建立伺服器。

4. public ServerSocket() throws IOException
建立非繫結伺服器套接字。


建立非繫結伺服器套接字。 如果ServerSocket構造方法沒有丟擲異常,就意味著你的應用程式已經成功繫結到指定的埠,並且偵聽客戶端請求。


ServerSocket類的常用方法:

1.public int getLocalPort()
返回此套接字在其上偵聽的埠。

2.public Socket accept() throws IOException
偵聽並接受到此套接字的連線。

3.public void setSoTimeout(int timeout)
通過指定超時值啟用/禁用 SO_TIMEOUT,以毫秒為單位。

4.public void bind(SocketAddress host, int backlog)
將 ServerSocket 繫結到特定地址(IP 地址和埠號)。


Socket 類的方法

java.net.Socket類代表客戶端和伺服器都用來互相溝通的套接字。客戶端要獲取一個Socket物件通過例項化 ,而 伺服器獲得一個Socket物件則通過accept()方法的返回值。

Socket類有五個構造方法.


1. public Socket(String host, int port) throws UnknownHostException, IOException.
建立一個流套接字並將其連線到指定主機上的指定埠號。


2. public Socket(InetAddress host, int port) throws IOException
建立一個流套接字並將其連線到指定 IP 地址的指定埠號。

3. public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException.
建立一個套接字並將其連線到指定遠端主機上的指定遠端埠。

4. public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException.
建立一個套接字並將其連線到指定遠端地址上的指定遠端埠。

5. public Socket()
通過系統預設型別的 SocketImpl 建立未連線套接字


當Socket構造方法返回,並沒有簡單的例項化了一個Socket物件,它實際上會嘗試連線到指定的伺服器和埠。

客戶端和伺服器端都有一個Socket物件,所以無論客戶端還是服務端都能夠呼叫這些方法。


1. public void connect(SocketAddress host, int timeout) throws IOException
將此套接字連線到伺服器,並指定一個超時值。

2. public InetAddress getInetAddress()
返回套接字連線的地址。

3. public int getPort()
返回此套接字連線到的遠端埠。

4. public int getLocalPort()
返回此套接字繫結到的本地埠。

5. public SocketAddress getRemoteSocketAddress()
返回此套接字連線的端點的地址,如果未連線則返回 null。

6. public InputStream getInputStream() throws IOException
返回此套接字的輸入流。
7. public OutputStream getOutputStream() throws IOException
返回此套接字的輸出流。

8. public void close() throws IOException
關閉此套接字。




InetAddress 類的方法

這個類表示網際網路協議(IP)地址。下面列出了Socket程式設計時比較有用的方法:


1. static InetAddress getByAddress(byte[] addr)
在給定原始 IP 地址的情況下,返回 InetAddress 物件。

2. static InetAddress getByAddress(String host, byte[] addr)
根據提供的主機名和IP 地址建立 InetAddress。

3. static InetAddress getByName(String host)
在給定主機名的情況下確定主機的 IP 地址。

4. String getHostAddress()
返回 IP 地址字串(以文字表現形式)。

5. String getHostName()
獲取此 IP 地址的主機名。

6. static InetAddress getLocalHost()
返回本地主機。

7. String toString()
將此 IP 地址轉換為 String。



Socket 客戶端例項

如下的GreetingClient 是一個客戶端程式,該程式通過socket連線到伺服器併發送一個問候,然後等待一個響應。


//檔名 GreetingClient.java

<pre>
import java.net.*;
import java.io.*;

public class GreetingClient{

public static void main(String[] args){
String serverName = args[0];

int port = Integer.parseInt(args[1]);

try{

System.out.println("Connecting to " + serverName
+ " on port " + port);
Socket client = new Socket(serverName,port);
System.out.println("Just connected to "
+ client.getRemoteSocketAddress());

OutputStream outToServer = client.getOutputStream();
DataOutputStream out = new DataOutputStream(outToServer);

out.writeUTF("Hello from "
+ client.getLocalSocketAddress()));

InputStream inFromServer = client.getInputStream();
DataInputStream in = new DataInputStream(inFromServer);

System.out.println("Server says " + in.readUTF());
client.close();

}catch(IOException e){
e.printStackTrace();
}
}

}

 

 

Socket 伺服器例項


如下的GreetingServer 程式是一個伺服器端應用程式,改程式使用Socket來監聽一個指定的埠。

 

$ java GreetingServer 6066
Waiting for client on port 6066...


像下面一樣開啟客戶端:


$ java GreetingClient localhost 6066
Connecting to localhost on port 6066
Just connected to localhost/127.0.0.1:6066
Server says Thank you for connecting to /127.0.0.1:6066
Goodbye!