Java Socket編程(三) 服務(wù)器Sockets
文章來(lái)源:aspcn 作者:孫雯
服務(wù)器Sockets
列表9.2是一個(gè)服務(wù)器應(yīng)用程序的一部分.
列表9.2 一個(gè)簡(jiǎn)單的服務(wù)器程序
/**
* 一個(gè)監(jiān)聽(tīng)端口并提供HTML文檔的程序.
*/
class SimpleWebServer {
public static void main(String args[])
{
ServerSocket serverSocket = null;
Socket clientSocket = null;
int connects = 0;
try
{
{
// 建立一個(gè)服務(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請(qǐng)求的尾部,就發(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ù)器并不是主動(dòng)地建立連接.相反地,他們是被動(dòng)地監(jiān)聽(tīng)一個(gè)客戶端的連接請(qǐng)示然后給他們服務(wù).服務(wù)器是由類ServerSocket來(lái)建立的.下面的程序建立了一個(gè)服務(wù)器端socket并把它綁定到80端口:
ServerSocket serverSocket = new ServerSocket(80, 5);
第一個(gè)參數(shù)是服務(wù)器要監(jiān)聽(tīng)的端口.第二個(gè)參數(shù)是可選的.API文檔中說(shuō)明了這是一個(gè)監(jiān)聽(tīng)時(shí)間,但是在傳統(tǒng)的socket程序中第二個(gè)參數(shù)是監(jiān)聽(tīng)深度.一個(gè)服務(wù)器可以同時(shí)接收多個(gè)連接請(qǐng)求,但是每次只能處理一個(gè).監(jiān)聽(tīng)堆是一個(gè)無(wú)回答的連接請(qǐng)求隊(duì)列.上面的請(qǐng)求建立一個(gè)連接來(lái)處理最后五個(gè)請(qǐng)求.如果省略了后面的一個(gè)參數(shù),則默認(rèn)值是50.
ServerSocket serverSocket = new ServerSocket(80, 5);
一旦socket建立了并開(kāi)始監(jiān)聽(tīng)連接,進(jìn)來(lái)的連接將會(huì)建立并放在監(jiān)聽(tīng)堆.accetp()方法把在堆中的連接取出來(lái).
Socket clientSocket = serverSocket.accept();
這個(gè)方法返回一個(gè)用來(lái)與來(lái)訪者對(duì)話的客戶端連接.服務(wù)器本身不可能建立對(duì)話,相反地,服務(wù)器socket會(huì)使用accept()方法來(lái)產(chǎn)生一個(gè)新的socket.服務(wù)器socket依舊打開(kāi)并排列新的連接請(qǐng)求.
與客戶端socket一樣,下面的一步建立輸入和輸出流:
DataInputStream inbound = new DataInputStream( clientSocket.getInputStream() ); DataOutputStream outbound = new DataOutputStream( clientSocket.getOutputStream() );
一般的I/O操作可以在新建的流中運(yùn)用.在服務(wù)器回應(yīng)前它等待客戶端發(fā)送一個(gè)空白的行.當(dāng)會(huì)話結(jié)束時(shí),服務(wù)器關(guān)閉流和客戶端socket.如果在隊(duì)列中沒(méi)有請(qǐng)示將會(huì)出現(xiàn)什么情況呢?那個(gè)方法將會(huì)等待一個(gè)的到來(lái).這個(gè)行為叫阻塞.accept()方法將會(huì)阻塞服務(wù)器線程直到一個(gè)呼叫到來(lái).當(dāng)5個(gè)連接處理完閉之后,服務(wù)器退出.任何的在隊(duì)列中的呼叫將會(huì)被取消.
所有的服務(wù)器都要有以下的基本的步驟:
1.建立一個(gè)服務(wù)器socket并開(kāi)始監(jiān)聽(tīng).
2.使用accept()方法取得新的連接.
3.建立輸入和輸出流.
4.在已有的協(xié)議上產(chǎn)生會(huì)話.
5.關(guān)閉客戶端流和socket.
6.回到第二步或者到第七步.
7.關(guān)閉服務(wù)器socket.
欄 目:Java編程
下一篇:JVM的垃圾回收機(jī)制詳解和調(diào)優(yōu)
本文標(biāo)題:Java Socket編程(三) 服務(wù)器Sockets
本文地址:http://mengdiqiu.com.cn/a1/Javabiancheng/8562.html
您可能感興趣的文章
- 01-10Java咖啡館(1)——嘆咖啡
- 01-10Java進(jìn)階:Struts多模塊的技巧
- 01-10Java Socket編程(一) Socket傳輸模式
- 01-10Java Socket編程(二) Java面向連接的類
- 01-10Java運(yùn)行時(shí)多態(tài)性的實(shí)現(xiàn)
- 01-10Java經(jīng)驗(yàn)點(diǎn)滴:處理沒(méi)有被捕獲的異常
- 01-10Java Socket編程(四) 重復(fù)和并發(fā)服務(wù)器
- 01-10Java中的浮點(diǎn)數(shù)分析
- 01-10面向?qū)ο缶幊?Java中的抽象數(shù)據(jù)類型
- 01-10跟我學(xué)Java Swing之游戲設(shè)計(jì)(2)


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10Java咖啡館(1)——嘆咖啡
- 01-10JVM的垃圾回收機(jī)制詳解和調(diào)優(yōu)
- 01-10Java Socket編程(三) 服務(wù)器Sockets
- 01-10Java進(jìn)階:Struts多模塊的技巧
- 01-10J2SE 1.5版本的新特性一覽
- 01-10Java Socket編程(一) Socket傳輸模式
- 01-10Java運(yùn)行時(shí)多態(tài)性的實(shí)現(xiàn)
- 01-10Java Socket編程(二) Java面向連接的類
- 01-10Java Socket編程(四) 重復(fù)和并發(fā)服務(wù)
- 01-10Java經(jīng)驗(yàn)點(diǎn)滴:處理沒(méi)有被捕獲的異常
隨機(jī)閱讀
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 04-02jquery與jsp,用jquery