溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

JAVA中怎么利用socket進(jìn)行網(wǎng)絡(luò)編程

發(fā)布時(shí)間:2021-08-10 16:19:13 來(lái)源:億速云 閱讀:110 作者:Leah 欄目:編程語(yǔ)言

本篇文章給大家分享的是有關(guān)JAVA中怎么利用socket進(jìn)行網(wǎng)絡(luò)編程,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

一、建立服務(wù)器

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

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)行通訊。

Socket incoming = server.accept()

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

BufferedReader in = new BufferedReader(new InputStreamReader(incoming.getInputStream()));  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)閉輸入流,即使用:

out.close();  in.close();

二、建立客戶端代碼

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

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

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

三、建立用戶界面

讀者可以根據(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ù)器。

try   { file://建立服務(wù)器     ServerSocket server = new ServerSocket(9998);     int i=1;     for(;;)     {    Socket incoming = server.accept();    new ServerThread(incoming,i).start();    i++;     }    }catch (IOException ex){ ex.printStackTrace(); }

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

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

new Thread()  {   public void run()   {  try {    while(true)   {  checkInput();  sleep(1000);//每1000毫秒檢測(cè)一次   }  }catch (InterruptedException ex)   {   }catch(IOException ex)   {  }   }  }.start();

其中的checkInput()方法為:

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

以上就是JAVA中怎么利用socket進(jìn)行網(wǎng)絡(luò)編程,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI