Java Socket編程(三) 伺服器Sockets

來源:互聯網
上載者:User

文章來源:aspcn 作者:孫雯

伺服器Sockets

列表9.2是一個伺服器應用程式的一部分.

列表9.2 一個簡單的伺服器程式

/**
* 一個監聽連接埠並提供HTML文檔的程式.
*/
class SimpleWebServer {
public static void main(String args[])
{
ServerSocket serverSocket = null;
Socket clientSocket = null;
int connects = 0;
try
{
{
// 建立一個伺服器socket
serverSocket = new ServerSocket(80, 5);
while (connects
{
// 等待串連
clientSocket = serverSocket.accept();
//服務串連
ServiceClient(clientSocket);
connects++;
}
serverSocket.close();
}
catch (IOException ioe)
{
System.out.println("Error in SimpleWebServer: " + ioe);
}
}
public static void ServiceClient(Socket client)
throws IOException
{
DataInputStream inbound = null;
DataOutputStream outbound = null;
try
{
// 得到IO流
inbound = new DataInputStream( client.getInputStream());
outbound = new DataOutputStream( client.getOutputStream());
//格式化輸出(回應頭和很少的HTML文檔)
StringBuffer buffer = PrepareOutput();
String inputLine;
while ((inputLine = inbound.readLine()) != null)
{
//如果到了HTTP請求的尾部,就發送回應
if ( inputLine.equals("") )
{
outbound.writeBytes(buffer.toString());
break;
}
}
}
finally
{
// 清除
System.out.println("Cleaning up connection: " + client);
tln("Cleaning up connection: " + client);
outbound.close();
inbound.close();
client.close();
client.close();
}
}
伺服器並不是主動地建立串連.相反地,他們是被動地監聽一個用戶端的串連請示然後給他們服務.伺服器是由類ServerSocket來建立的.下面的程式建立了一個伺服器端socket並把它綁定到80連接埠:

ServerSocket serverSocket = new ServerSocket(80, 5);

第一個參數是伺服器要監聽的連接埠.第二個參數是可選的.API文檔中說明了這是一個監聽時間,但是在傳統的socket程式中第二個參數是監聽深度.一個伺服器可以同時接收多個串連請求,但是每次只能處理一個.監聽堆是一個無回答的串連請求隊列.上面的請求建立一個串連來處理最後五個請求.如果省略了後面的一個參數,則預設值是50.

ServerSocket serverSocket = new ServerSocket(80, 5);

一旦socket建立了並開始監聽串連,進來的串連將會建立並放在監聽堆.accetp()方法把在堆中的串連取出來.

Socket clientSocket = serverSocket.accept();

這個方法返回一個用來與來訪者對話的用戶端串連.伺服器本身不可能建立對話,相反地,伺服器socket會使用accept()方法來產生一個新的socket.伺服器socket依舊開啟並排列新的串連請求.

與用戶端socket一樣,下面的一步建立輸入和輸出資料流:

DataInputStream inbound = new DataInputStream( clientSocket.getInputStream() ); DataOutputStream outbound = new DataOutputStream( clientSocket.getOutputStream() );

一般的I/O操作可以在建立的流中運用.在伺服器回應前它等待用戶端發送一個空白的行.當會話結束時,伺服器關閉流和用戶端socket.如果在隊列中沒有請示將會出現什麼情況呢?那個方法將會等待一個的到來.這個行為叫阻塞.accept()方法將會阻塞伺服器線程直到一個呼叫到來.當5個串連處理完閉之後,伺服器退出.任何的在隊列中的呼叫將會被取消.

所有的伺服器都要有以下的基本的步驟:

1.建立一個伺服器socket並開始監聽.

2.使用accept()方法取得新的串連.

3.建立輸入和輸出資料流.

4.在已有的協議上產生會話.

5.關閉用戶端流和socket.

6.回到第二步或者到第七步.

7.關閉伺服器socket.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.