JavaSocket編程服務(wù)器Sockets,文章中會(huì)有代碼列出,對(duì)Java開(kāi)發(fā)感興趣的小伙伴就隨著小編一起來(lái)了解一下吧。
具體如下:
列表9.2是一個(gè)服務(wù)器應(yīng)用程序的一部分。
列表9.2一個(gè)簡(jiǎn)單的服務(wù)器程序
classSimpleWebServer{publicstaticvoidmain(Stringargs[]){ServerSocketserverSocket=null;SocketclientSocket=null;intconnects=0;try{{//建立一個(gè)服務(wù)器socketserverSocket=newServerSocket(80,5);while(connects<5){//等待連接clientSocket=serverSocket.accept();//服務(wù)連接ServiceClient(clientSocket);connects++;}serverSocket.close();}catch(IOExceptionioe){System.out.println("ErrorinSimpleWebServer:"+ioe);}}publicstaticvoidServiceClient(Socketclient)throwsIOException{DataInputStreaminbound=null;DataOutputStreamoutbound=null;try{//得到IO流inbound=newDataInputStream(client.getInputStream());outbound=newDataOutputStream(client.getOutputStream());//格式化輸出(回應(yīng)頭和很少的HTML文檔)StringBufferbuffer=PrepareOutput();StringinputLine;while((inputLine=inbound.readLine())!=null){//如果到了HTTP請(qǐng)求的尾部,就發(fā)送回應(yīng)if(inputLine.equals("")){outbound.writeBytes(buffer.toString());break;}}}finally{//清除System.out.println("Cleaningupconnection:"+client);tln("Cleaningupconnection:"+client);outbound.close();inbound.close();client.close();client.close();}}
服務(wù)器并不是主動(dòng)地建立連接.相反地,他們是被動(dòng)地監(jiān)聽(tīng)一個(gè)客戶(hù)端的連接請(qǐng)示然后給他們服務(wù).服務(wù)器是由類(lèi)ServerSocket來(lái)建立的.下面的程序建立了一個(gè)服務(wù)器端socket并把它綁定到80端口:
ServerSocketserverSocket=newServerSocket(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。
ServerSocketserverSocket=newServerSocket(80,5);
一旦socket建立了并開(kāi)始監(jiān)聽(tīng)連接,進(jìn)來(lái)的連接將會(huì)建立并放在監(jiān)聽(tīng)堆.accetp()方法把在堆中的連接取出來(lái)。
SocketclientSocket=serverSocket.accept();
這個(gè)方法返回一個(gè)用來(lái)與來(lái)訪(fǎng)者對(duì)話(huà)的客戶(hù)端連接.服務(wù)器本身不可能建立對(duì)話(huà),相反地,服務(wù)器socket會(huì)使用accept()方法來(lái)產(chǎn)生一個(gè)新的socket.服務(wù)器socket依舊打開(kāi)并排列新的連接請(qǐng)求。
與客戶(hù)端socket一樣,下面的一步建立輸入和輸出流:
DataInputStreaminbound=newDataInputStream(clientSocket.getInputStream());DataOutputStreamoutbound=newDataOutputStream(clientSocket.getOutputStream());
一般的I/O操作可以在新建的流中運(yùn)用.在服務(wù)器回應(yīng)前它等待客戶(hù)端發(fā)送一個(gè)空白的行.當(dāng)會(huì)話(huà)結(jié)束時(shí),服務(wù)器關(guān)閉流和客戶(hù)端socket.如果在隊(duì)列中沒(méi)有請(qǐng)示將會(huì)出現(xiàn)什么情況呢?那個(gè)方法將會(huì)等待一個(gè)的到來(lái).這個(gè)行為叫阻塞.accept()方法將會(huì)阻塞服務(wù)器線(xiàn)程直到一個(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ì)話(huà).5.關(guān)閉客戶(hù)端流和socket.6.回到第二步或者到第七步.7.關(guān)閉服務(wù)器socket.
以上就是深圳達(dá)內(nèi)教育java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“編程入門(mén),Java中socket編程的學(xué)習(xí)”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問(wèn),請(qǐng)?jiān)诰€(xiàn)咨詢(xún),有專(zhuān)業(yè)老師隨時(shí)為你服務(wù)。