更新時間:2020-08-13 16:56:39 來源:動力節點 瀏覽2119次
Socket是網絡上運行的兩個程序間雙向通訊的一端,它既可以接受請求,也可以發送請求,利用它可以較為方便的編寫網絡上的數據的傳遞。在java中,有專門的socket類來處理用戶的請求和響應。利用SOCKET類的方法,就可以實現兩臺計算機之間的通訊。這里就介紹一下在JAVA中如何利用socket進行網絡編程。
在Java中Socket可以理解為客戶端或者服務器端的一個特殊的對象,這個對象有兩個關鍵的方法,一個是getInputStream方法,另一個是getOutputStream方法。getInputStream方法可以得到一個輸入流,客戶端的Socket對象上的getInputStream方法得到的輸入流其實就是從服務器端發回的數據流。GetOutputStream方法得到一個輸出流,客戶端Socket對象上的getOutputStream方法返回的輸出流就是將要發送到服務器端的數據流,(其實是一個緩沖區,暫時存儲將要發送過去的數據)。
程序可以對這些數據流根據需要進行進一步的封裝。本文的例子就對這些數據流進行了一定的封裝(關于封裝可以參考Java中流的實現部分)。
一、建立服務器類
Java中有一個專門用來建立Socket服務器的類,名叫ServerSocket,可以用服務器需要使用的端口號作為參數來創建服務器對象。
ServerSocket server=new ServerSocket(9998)
這條語句創建了一個服務器對象,這個服務器使用9998號端口。當一個客戶端程序建立一個Socket連接,所連接的端口號為9998時,服務器對象server便響應這個連接,并且server.accept()方法會創建一個Socket對象。服務器端便可以利用這個Socket對象與客戶進行通訊。
Socket incoming=server.accept()
進而得到輸入流和輸出流,并進行封裝
BufferedReader in=new BufferedReader(new InputStreamReader(incoming.getInputStream()));
PrintWriter out=new PrintWriter(incoming.getOutputStream(),true);
隨后,就可以使用in.readLine()方法得到客戶端的輸入,也可以使用out.println()方法向客戶端發送數據。從而可以根據程序的需要對客戶端的不同請求進行回應。
在所有通訊結束以后應該關閉這兩個數據流,關閉的順序是先關閉輸出流,再關閉輸入流,即使用:
out.close();
in.close();
二、建立客戶端代碼
相比服務器端,客戶端要簡單一些,客戶端只需用服務器所在機器的ip以及服務器的端口作為參數創建一個Socket對象。得到這個對象后,就可以用"建立服務器"部分介紹的方法實現數據的輸入和輸出。
Socket socket=new Socket("168.160.12.42",9998);
in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
out=new PrintWriter(socket.getOutputStream(),true);
以上的程序代碼建立了一個Socket對象,這個對象連接到ip地址為168.160.12.42的主機上、端口為9998的服務器對象。并且建立了輸入流和輸出流,分別對應服務器的輸出和客戶端的寫入。
三、建立用戶界面
讀者可以根據自己的喜好建立自己的用戶界面,這不是本文的重點。
經過以上三個步驟,就可以建立一個比較簡單的對話程序。但是,為了使這個程序更加完善,應進行以下幾個改進:
一、現在服務器只能服務一個客戶,也就是單線程的。可以將它改進為多線程服務器。
try???
{?file://建立服務器????
ServerSocket?server?=?new?ServerSocket(9998);????
int?i=1;????
for(;;)????
{????
Socket?incoming?=?server.accept();????
new?ServerThread(incoming,i).start();????
i++;????
}????
}catch?(IOException?ex){?ex.printStackTrace();?}
循環檢測是否有客戶連接到服務器上,如果有,則創建一個線程來服務這個客戶,這個線程的名稱是ServerThread,這個類擴展了Thread類,它的編寫方法與前述的服務器的寫法相同。
二、為了可以隨時得到對方傳送過來的消息,可以在服務器以及客戶端各建立一個獨立的線程來察看輸入流,如果輸入流中有輸入,則可以即時顯示出來。代碼如下:
new?Thread()??
{??
public?void?run()??
{??
try?
{ ??
while(true)??
{??
checkInput();??
sleep(1000);//每1000毫秒檢測一次??
}??
}catch?(InterruptedException?ex)??
{??
}catch(IOException?ex)??
{??
}??
}??
}.start();
其中的checkInput()方法為:
private?void?checkInput()?throws?IOException??
{??
String?line;??
if((line=in.readLine())!=null)?file://檢測輸入流中是否有新的數據??
t.setPartner(line);?file://將數據流中的消息顯示出來??
}
通過以上改進,程序就可以比較好的運行了。
以上就是動力節點java培訓機構的小編針對“Java中怎么利用socket進行網絡編程”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習