雷火电竞-中国电竞赛事及体育赛事平台

歡迎來到入門教程網(wǎng)!

Java編程

當前位置:主頁 > 軟件編程 > Java編程 >

Java Socket編程(三) 服務(wù)器Sockets

來源:本站原創(chuàng)|時間:2020-01-10|欄目:Java編程|點擊:

文章來源:aspcn 作者:孫雯

服務(wù)器Sockets

列表9.2是一個服務(wù)器應(yīng)用程序的一部分.

列表9.2 一個簡單的服務(wù)器程序

/**
* 一個監(jiān)聽端口并提供HTML文檔的程序.
*/
class SimpleWebServer {
public static void main(String args[])
{
ServerSocket serverSocket = null;
Socket clientSocket = null;
int connects = 0;
try
{
{
// 建立一個服務(wù)器socket
serverSocket = new ServerSocket(80, 5);
while (connects < 5)
{
// 等待連接
clientSocket = serverSocket.accept();
//服務(wù)連接
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());
//格式化輸出(回應(yīng)頭和很少的HTML文檔)
StringBuffer buffer = PrepareOutput();
String inputLine;
while ((inputLine = inbound.readLine()) != null)
{
//如果到了HTTP請求的尾部,就發(fā)送回應(yīng)
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();
}
}
服務(wù)器并不是主動地建立連接.相反地,他們是被動地監(jiān)聽一個客戶端的連接請示然后給他們服務(wù).服務(wù)器是由類ServerSocket來建立的.下面的程序建立了一個服務(wù)器端socket并把它綁定到80端口:

ServerSocket serverSocket = new ServerSocket(80, 5);

第一個參數(shù)是服務(wù)器要監(jiān)聽的端口.第二個參數(shù)是可選的.API文檔中說明了這是一個監(jiān)聽時間,但是在傳統(tǒng)的socket程序中第二個參數(shù)是監(jiān)聽深度.一個服務(wù)器可以同時接收多個連接請求,但是每次只能處理一個.監(jiān)聽堆是一個無回答的連接請求隊列.上面的請求建立一個連接來處理最后五個請求.如果省略了后面的一個參數(shù),則默認值是50.

ServerSocket serverSocket = new ServerSocket(80, 5);

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

Socket clientSocket = serverSocket.accept();

這個方法返回一個用來與來訪者對話的客戶端連接.服務(wù)器本身不可能建立對話,相反地,服務(wù)器socket會使用accept()方法來產(chǎn)生一個新的socket.服務(wù)器socket依舊打開并排列新的連接請求.

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

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

一般的I/O操作可以在新建的流中運用.在服務(wù)器回應(yīng)前它等待客戶端發(fā)送一個空白的行.當會話結(jié)束時,服務(wù)器關(guān)閉流和客戶端socket.如果在隊列中沒有請示將會出現(xiàn)什么情況呢?那個方法將會等待一個的到來.這個行為叫阻塞.accept()方法將會阻塞服務(wù)器線程直到一個呼叫到來.當5個連接處理完閉之后,服務(wù)器退出.任何的在隊列中的呼叫將會被取消.

所有的服務(wù)器都要有以下的基本的步驟:

1.建立一個服務(wù)器socket并開始監(jiān)聽.

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

3.建立輸入和輸出流.

4.在已有的協(xié)議上產(chǎn)生會話.

5.關(guān)閉客戶端流和socket.

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

7.關(guān)閉服務(wù)器socket.

上一篇:Java進階:Struts多模塊的技巧

欄    目:Java編程

下一篇:JVM的垃圾回收機制詳解和調(diào)優(yōu)

本文標題:Java Socket編程(三) 服務(wù)器Sockets

本文地址:http://www.jygsgssxh.com/a1/Javabiancheng/8562.html

網(wǎng)頁制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語言數(shù)據(jù)庫服務(wù)器

如果侵犯了您的權(quán)利,請與我們聯(lián)系,我們將在24小時內(nèi)進行處理、任何非本站因素導致的法律后果,本站均不負任何責任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有