Java 網路編程

來源:互聯網
上載者:User

標籤:gre   close   綁定   用戶端   拋出異常   cep   應用   write   xtend   

Socket 編程
通訊端使用TCP提供了兩台電腦之間的通訊機制。 用戶端程式建立一個通訊端,並嘗試串連伺服器的通訊端。
當串連建立時,伺服器會建立一個 Socket 對象。用戶端和伺服器現在可以通過對 Socket 對象的寫入和讀取來進行通訊。
java.net.Socket 類代表一個通訊端,並且 java.net.ServerSocket 類為伺服器程式提供了一種來監聽用戶端,並與他們建立串連的機制。
以下步驟在兩台電腦之間使用通訊端建立TCP串連時會出現:
伺服器執行個體化一個 ServerSocket 對象,表示通過伺服器上的連接埠通訊。
伺服器調用 ServerSocket 類的 accept() 方法,該方法將一直等待,直到用戶端串連到伺服器上給定的連接埠。
伺服器正在等待時,一個用戶端執行個體化一個 Socket 對象,指定伺服器名稱和連接埠號碼來請求串連。
Socket 類的建構函式試圖將用戶端串連到指定的伺服器和連接埠號碼。如果通訊被建立,則在用戶端建立一個 Socket 對象能夠與伺服器進行通訊。
在伺服器端,accept() 方法返回伺服器上一個新的 socket 引用,該 socket 串連到用戶端的 socket。
串連建立後,通過使用 I/O 流在進行通訊,每一個socket都有一個輸出資料流和一個輸入資料流,用戶端的輸出資料流串連到伺服器端的輸入資料流,而用戶端的輸入資料流串連到伺服器端的輸出資料流。
TCP 是一個雙向的通訊協定,因此資料可以通過兩個資料流在同一時間發送.以下是一些類提供的一套完整的有用的方法來實現 socket。
ServerSocket 類的方法
伺服器應用程式通過使用 java.net.ServerSocket 類以擷取一個連接埠,並且偵聽用戶端請求。
ServerSocket 類有四個構造方法:
序號方法描述
1public ServerSocket(int port) throws IOException
建立綁定到特定連接埠的伺服器通訊端。
2public ServerSocket(int port, int backlog) throws IOException
利用指定的 backlog 建立伺服器通訊端並將其綁定到指定的本地連接埠號碼。
3public ServerSocket(int port, int backlog, InetAddress address) throws IOException
使用指定的連接埠、偵聽 backlog 和要綁定到的本地 IP 位址建立伺服器。
4public ServerSocket() throws IOException
建立非綁定伺服器通訊端。
建立非綁定伺服器通訊端。 如果 ServerSocket 構造方法沒有拋出異常,就意味著你的應用程式已經成功綁定到指定的連接埠,並且偵聽用戶端請求。
這裡有一些 ServerSocket 類的常用方法:
序號方法描述
1public int getLocalPort()
返回此通訊端在其上偵聽的連接埠。
2public Socket accept() throws IOException
偵聽並接受到此通訊端的串連。
3public void setSoTimeout(int timeout)
通過指定逾時值啟用/禁用 SO_TIMEOUT,以毫秒為單位。
4public void bind(SocketAddress host, int backlog)
將 ServerSocket 綁定到特定地址(IP 位址和連接埠號碼)。
Socket 類的方法
java.net.Socket 類代表用戶端和伺服器都用來互相溝通的通訊端。用戶端要擷取一個 Socket 對象通過執行個體化 ,而 伺服器獲得一個 Socket 對象則通過 accept() 方法的傳回值。
Socket 類有五個構造方法.
序號方法描述
1public Socket(String host, int port) throws UnknownHostException, IOException.
建立一個流通訊端並將其串連到指定主機上的指定連接埠號碼。
2public Socket(InetAddress host, int port) throws IOException
建立一個流通訊端並將其串連到指定 IP 位址的指定連接埠號碼。
3public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException.
建立一個通訊端並將其串連到指定遠程主機上的指定遠程連接埠。
4public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException.
建立一個通訊端並將其串連到指定遠程地址上的指定遠程連接埠。
5public Socket()
通過系統預設類型的 SocketImpl 建立未串連通訊端
當 Socket 構造方法返回,融金匯銀並沒有簡單的執行個體化了一個 Socket 對象,它實際上會嘗試串連到指定的伺服器和連接埠。
下面北京股票配資列出了一些感興趣的方法,注意用戶端和伺服器端都有一個 Socket 對象,所以無論用戶端還是服務端都能夠調用這些方法。
序號方法描述
1public void connect(SocketAddress host, int timeout) throws IOException
將此通訊端串連到伺服器,並指定一個逾時值。
2public InetAddress getInetAddress()
返回通訊端串連的地址。
3public int getPort()
返回此通訊端串連到的遠程連接埠。
4public int getLocalPort()
返回此通訊端綁定到的本地連接埠。
5public SocketAddress getRemoteSocketAddress()
返回此通訊端串連的端點的地址,如果未串連則返回 null。
6public InputStream getInputStream() throws IOException
返回此通訊端的輸入資料流。
7public OutputStream getOutputStream() throws IOException
返回此通訊端的輸出資料流。
8public void close() throws IOException
關閉此通訊端。
InetAddress 類的方法
這個類表示互連網協議(IP)地址。下面列出了 Socket 編程時比較有用的方法:
序號方法描述
1static InetAddress getByAddress(byte[] addr)
在給定原始 IP 位址的情況下,返回 InetAddress 對象。
2static InetAddress getByAddress(String host, byte[] addr)
根據提供的主機名稱和 IP 位址建立 InetAddress。
3static InetAddress getByName(String host)
在給定主機名稱的情況下確定主機的 IP 位址。
4String getHostAddress()
返回 IP 位址字串(以文本表現形式)。
5String getHostName()
擷取此 IP 位址的主機名稱。
6static InetAddress getLocalHost()
返回本地主機。
7String toString()
將此 IP 位址轉換為 String。
Socket 用戶端執行個體
如下的 GreetingClient 是一個用戶端程式,該程式通過 socket 串連到伺服器並發送一個請求,然後等待一個響應。
GreetingClient.java 檔案代碼:
// 檔案名稱 GreetingClient.java

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("串連到主機:" + serverName + " ,連接埠號碼:" + port);
Socket bjrongjinhuiyin.comclient = new Socket(serverName, port);
System.out.println("遠程主機地址:" + 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("伺服器響應: " + in.readUTF());
client.close();
}catch(IOException e)
{
e.printStackTrace();
}
}
}
Socket 服務端執行個體
如下的GreetingServer 程式是一個伺服器端應用程式,使用 Socket 來監聽一個指定的連接埠。
GreetingServer.java 檔案代碼:
// 檔案名稱 GreetingServer.java

import java.net.*;
import java.io.*;

public class GreetingServer extends Thread
{
private ServerSocket serverSocket;

public GreetingServer(int port) throws IOException
{
serverSocket = new ServerSocket(port);
serverSocket.setSoTimeout(10000);
}

public void run()
{
while(true)
{
try
{
System.out.println("等待遠端連線,連接埠號碼為:" + serverSocket.getLocalPort() + "...");
Socket server = serverSocket.accept();
System.out.println("遠程主機地址:" + server.getRemoteSocketAddress());
DataInputStream in = new DataInputStream(server.getInputStream());
System.out.println(in.readUTF());
DataOutputStream out = new DataOutputStream(server.getOutputStream());
out.writeUTF("謝謝串連我:" + server.getLocalSocketAddress() + "\nGoodbye!");
server.close();
}catch(SocketTimeoutException s)
{
System.out.println("Socket timed out!");
break;
}catch(IOException e)
{
e.printStackTrace();
break;
}
}
}
public static void main(String [] args)
{
int port = Integer.parseInt(args[0]);
try
{
Thread t = new GreetingServer(port);
t.run();
}catch(IOException e)
{
e.printStackTrace();
}
}
}

Java 網路編程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.