日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
淺談JAVA中如何利用socket進(jìn)行網(wǎng)絡(luò)編程(一)

Socket是網(wǎng)絡(luò)上運(yùn)行的兩個(gè)程序間雙向通訊的一端,它既可以接受請(qǐng)求,也可以發(fā)送請(qǐng)求,利用它可以較為方便的編寫網(wǎng)絡(luò)上的數(shù)據(jù)的傳遞。在java中,有專門的socket類來(lái)處理用戶的請(qǐng)求和響應(yīng)。利用SOCKET類的方法,就可以實(shí)現(xiàn)兩臺(tái)計(jì)算機(jī)之間的通訊。這里就介紹一下在JAVA中如何利用socket進(jìn)行網(wǎng)絡(luò)編程。

10年積累的成都網(wǎng)站制作、網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站策劃后付款的網(wǎng)站建設(shè)流程,更有友誼免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

在Java中Socket可以理解為客戶端或者服務(wù)器端的一個(gè)特殊的對(duì)象,這個(gè)對(duì)象有兩個(gè)關(guān)鍵的方法,一個(gè)是getInputStream方法,另一個(gè)是getOutputStream方法。getInputStream方法可以得到一個(gè)輸入流,客戶端的Socket對(duì)象上的getInputStream方法得到的輸入流其實(shí)就是從服務(wù)器端發(fā)回的數(shù)據(jù)流。GetOutputStream方法得到一個(gè)輸出流,客戶端Socket對(duì)象上的getOutputStream方法返回的輸出流就是將要發(fā)送到服務(wù)器端的數(shù)據(jù)流,(其實(shí)是一個(gè)緩沖區(qū),暫時(shí)存儲(chǔ)將要發(fā)送過(guò)去的數(shù)據(jù))。

程序可以對(duì)這些數(shù)據(jù)流根據(jù)需要進(jìn)行進(jìn)一步的封裝。本文的例子就對(duì)這些數(shù)據(jù)流進(jìn)行了一定的封裝(關(guān)于封裝可以參考Java中流的實(shí)現(xiàn)部分)。

一、建立服務(wù)器類

Java中有一個(gè)專門用來(lái)建立Socket服務(wù)器的類,名叫ServerSocket,可以用服務(wù)器需要使用的端口號(hào)作為參數(shù)來(lái)創(chuàng)建服務(wù)器對(duì)象。

 
 
 
  1. ServerSocket server = new ServerSocket(9998)

這條語(yǔ)句創(chuàng)建了一個(gè)服務(wù)器對(duì)象,這個(gè)服務(wù)器使用9998號(hào)端口。當(dāng)一個(gè)客戶端程序建立一個(gè)Socket連接,所連接的端口號(hào)為9998時(shí),服務(wù)器對(duì)象server便響應(yīng)這個(gè)連接,并且server.accept()方法會(huì)創(chuàng)建一個(gè)Socket對(duì)象。服務(wù)器端便可以利用這個(gè)Socket對(duì)象與客戶進(jìn)行通訊。

 
 
 
  1. Socket incoming = server.accept()

進(jìn)而得到輸入流和輸出流,并進(jìn)行封裝

 
 
 
  1. BufferedReader in = new BufferedReader(new InputStreamReader(incoming.getInputStream()));
  2. PrintWriter out = new PrintWriter(incoming.getOutputStream(),true);

隨后,就可以使用in.readLine()方法得到客戶端的輸入,也可以使用out.println()方法向客戶端發(fā)送數(shù)據(jù)。從而可以根據(jù)程序的需要對(duì)客戶端的不同請(qǐng)求進(jìn)行回應(yīng)。

在所有通訊結(jié)束以后應(yīng)該關(guān)閉這兩個(gè)數(shù)據(jù)流,關(guān)閉的順序是先關(guān)閉輸出流,再關(guān)閉輸入流,即使用:

 
 
 
  1. out.close();
  2. in.close();

二、建立客戶端代碼

相比服務(wù)器端,客戶端要簡(jiǎn)單一些,客戶端只需用服務(wù)器所在機(jī)器的ip以及服務(wù)器的端口作為參數(shù)創(chuàng)建一個(gè)Socket對(duì)象。得到這個(gè)對(duì)象后,就可以用"建立服務(wù)器"部分介紹的方法實(shí)現(xiàn)數(shù)據(jù)的輸入和輸出。

 
 
 
  1. Socket socket = new Socket("168.160.12.42",9998);
  2. in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  3. out = new PrintWriter(socket.getOutputStream(),true);

以上的程序代碼建立了一個(gè)Socket對(duì)象,這個(gè)對(duì)象連接到ip地址為168.160.12.42的主機(jī)上、端口為9998的服務(wù)器對(duì)象。并且建立了輸入流和輸出流,分別對(duì)應(yīng)服務(wù)器的輸出和客戶端的寫入。

三、建立用戶界面

讀者可以根據(jù)自己的喜好建立自己的用戶界面,這不是本文的重點(diǎn)。

經(jīng)過(guò)以上三個(gè)步驟,就可以建立一個(gè)比較簡(jiǎn)單的對(duì)話程序。但是,為了使這個(gè)程序更加完善,應(yīng)進(jìn)行以下幾個(gè)改進(jìn):

一、現(xiàn)在服務(wù)器只能服務(wù)一個(gè)客戶,也就是單線程的??梢詫⑺倪M(jìn)為多線程服務(wù)器。

 
 
 
  1. try 
  2. { file://建立服務(wù)器  
  3.  ServerSocket server = new ServerSocket(9998);  
  4.  int i=1;  
  5.  for(;;)  
  6.  {  
  7.   Socket incoming = server.accept();  
  8.   new ServerThread(incoming,i).start();  
  9.   i++;  
  10.  }  
  11. }catch (IOException ex){ ex.printStackTrace(); }  

循環(huán)檢測(cè)是否有客戶連接到服務(wù)器上,如果有,則創(chuàng)建一個(gè)線程來(lái)服務(wù)這個(gè)客戶,這個(gè)線程的名稱是ServerThread,這個(gè)類擴(kuò)展了Thread類,它的編寫方法與前述的服務(wù)器的寫法相同。

二、為了可以隨時(shí)得到對(duì)方傳送過(guò)來(lái)的消息,可以在服務(wù)器以及客戶端各建立一個(gè)獨(dú)立的線程來(lái)察看輸入流,如果輸入流中有輸入,則可以即時(shí)顯示出來(lái)。代碼如下:

 
 
 
  1. new Thread()
  2. {
  3.  public void run()
  4.  {
  5.   try
  6.   { 
  7.    while(true)
  8.    {
  9.     checkInput();
  10.     sleep(1000);//每1000毫秒檢測(cè)一次
  11.    }
  12.   }catch (InterruptedException ex)
  13.  {
  14.  }catch(IOException ex)
  15.  {
  16.   }
  17.  }
  18. }.start();

 其中的checkInput()方法為:

 
 
 
  1. private void checkInput() throws IOException
  2. {
  3.  String line;
  4.  if((line=in.readLine())!=null) file://檢測(cè)輸入流中是否有新的數(shù)據(jù)
  5.   t.setPartner(line); file://將數(shù)據(jù)流中的消息顯示出來(lái)

通過(guò)以上改進(jìn),程序就可以比較好的運(yùn)行了。

希望本文可以幫助到你。


本文名稱:淺談JAVA中如何利用socket進(jìn)行網(wǎng)絡(luò)編程(一)
地址分享:http://www.5511xx.com/article/dhjssjp.html