導航:首頁 > 編程語言 > javatcp客戶端綁定埠

javatcp客戶端綁定埠

發布時間:2022-01-20 20:09:09

java 的 tcp 建立客戶端和伺服器的連接問題

0.0.0.0表示監聽所有IP,在有公網IP的情況下,雲伺服器上一般這么填寫

Ⅱ Java TCP/IP協議的Socket如何設置埠復用

你的其中一端的連接沒有被及時釋放掉的原因是:你沒有順利地進行TCP連接關閉的流程。最近我就因為這個問題頭疼了好久,現在終於找到真正的原因和解決辦法了!關鍵點是:在調用close之前先發送一次數據(例如,out.write(0);)。接下來我用通俗的語言來闡述原因。

如果你兩端的程序都是在傳送完數據後直接調用Socket的close方法斷開連接的話,這就會有一個調用close方法誰先誰後的問題,先調用者是主動關閉TCP連接的那一方,而後調用者就是被動關閉TCP連接的那一方。

關閉TCP連接的過程中,雙方總共有3個報文需要發送,主動關閉方只需發送1個報文,就是斷開請求的報文,被動關閉方要發送2個報文,分別是 回應主動關閉方發來的斷開請求報文的第一次確認報文和 第二次確認報文,第二次的確認報文用來確認已經沒有數據需要發送了。

主動關閉方發送了斷開請求報文後,就進入了等待被動關閉方發送確認報文的狀態,一般情況下,被動關閉方馬上就會發送第一次確認報文。主動關閉方收到第一次確認報文後,就會等被動關閉方的第二次確認報文,直到超時,套接字資源被操作系統回收(P.S. 雖然書上不是這么說的,但是實際的OS就是這么處理的,原因下面再說)。此時如果被動關閉方發送了第二次確認報文,整個TCP連接關閉流程就順利結束了,所有資源就會被OS回收。

重點來了,問題在於,作為被動關閉方的程序中,在主動關閉方等待被動關閉方發送第二次確認報文時,就算執行了Socket的close也不會發送第二次確認報文,只有向主動關閉方發送數據(任意)後,被動關閉方才會發送第二次確認報文,整個流程才能順利進行,TCP連接的資源才會被釋放,下次才能重復使用同個套接字。

我自己實驗出來的結果是:在兩端的代碼中(只有一端發送一端接收),都只使用

out.write(0);
me.close();

進行TCP連接的斷開,out是Socket的OutputStream,me是已連接的Socket對象。結果,無論重復多少次運行,都能不間斷地順利運行,每次運行結束後,用資源監視器看TCP連接情況,都看到所使用的連接資源都已經被釋放,並沒有等待2MSL時間後才被釋放,所以實際的OS的處理跟理論上的不一樣。所以你的程序要等一段時間後才能再次使用同個埠並不是因為存在2MSL的等待時間,而是因為TCP連接關閉流程沒有順利進行,但是所使用的進程已經退出,OS就會自動幫你回收資源,不過需要等超時後才處理。(P.S. 我測試的OS是Windows)

如果兩端的程序斷開TCP連接時都是直接開始斷開的過程而沒有延時的話,誰是主動關閉方就不確定,兩端的程序中的斷開TCP連接的代碼就得有發送數據的部分,如果其中有一方延時了,那延時的一方就有很大的概率是被動關閉方,另一方在調用close前就不需要發送數據了。

還有,就算TCP連接關閉的流程順利進行,但是,下次使用同個套接字(兩端套接字跟之前的相同)前得延時一下,幾百毫秒就夠了(具體自己調整),因為OS回收套接字資源是需要時間的,關閉TCP連接後就立馬創建兩端套接字跟所關閉的連接的兩端套接字相同的連接也有可能因為仍然被佔用而報錯。

Ⅲ 怎麼樣將java的兩個客戶端socket通過同一個埠connect一個serversocket

一個埠同時只能被一個程序所佔用,一個程序可以佔用多個埠!
任何操作系統都不會允許你這樣做的!不要給自己找麻煩了,這是不可能事件!
有時候一台電腦可能跑兩個客戶端,第一個客戶端已經佔用了埠了,那麼第二個就會出錯!但是我通常不會指定客戶端的埠號!
如何解決呢?下面是自己的方法:
當客戶端要連接服務端時,客戶端會隨機選擇一個埠發送數據包出去!它隨機選擇的這個埠一定是可用的!所以我就用這個隨機選擇的埠作為客戶端接收信息的埠號!
那麼不管電腦上跑多少個客戶端都不會有問題了!(當然最多也就跑65536個網路程序,因為只有65536個埠嘛)

Ⅳ java socket如何實現客戶端與客戶端的交互

1、服務端監聽一個埠,其它客戶端都通過這個埠和服務端進行通信。
2、每個客戶端連接上來,服務端給其一個標識ID。然後向其它所有客戶端廣播一下有新客戶端接入,ID多少。
3、客戶端要向客戶端發送消息,可以以消息包的形式發送,就是把目的客戶端的標識和發送的內容組成一個數據包發往伺服器,伺服器讀取就知道要向哪 個客戶端發送數據,然後把內容往目的客戶端通道發送

Ⅳ TCP下的Socket服務端如何通過指定的IP和埠號向指定的客戶端發送數據 求一個簡單的例子 使用java語言

伺服器是在等待中,當得到socket連接時,就得到了對端的端點地址。每個客戶端是不同的端點地址。

Ⅵ 用Java 的socket實現客戶端的功能

//服務端程序:
importjava.io.*;
importjava.net.*;

publicclassTCPServer{
publicstaticvoidmain(String[]args)throwsIOException{
newTCPServer().init();
}
@SuppressWarnings("static-access")
privatevoidinit()throwsIOException{
@SuppressWarnings("resource")
ServerSocketserver=newServerSocket(1000);
Socketclient=null;
while(true){
try{
client=server.accept();
BufferedInputStreambis=newBufferedInputStream(client.getInputStream());
byte[]b=newbyte[1024];
intlen=0;
Stringmessage="";
while((len=bis.read(b))!=-1){
message=newString(b,0,len);
System.out.print("客戶端:"+client.getInetAddress().getLocalHost().getHostAddress()+"發來消息:"+message);
if("byte".equals(message.trim()))
client.close();
PrintWriterpw=newPrintWriter(client.getOutputStream(),true);
pw.println(message);
}
}catch(Exceptione){
System.err.println("客戶端:"+client.getInetAddress().getLocalHost().getHostAddress()+"已斷開連接!");
}
}
}
}
//客戶端程序:
importjava.io.*;
importjava.net.Socket;

{
publicstaticvoidmain(String[]args)throwsIOException{
newTCPClient().init();
}
privatevoidinit()throwsIOException{
@SuppressWarnings("resource")
finalSocketclient=newSocket("127.0.0.1",1000);
BufferedReaderin=newBufferedReader(newInputStreamReader(System.in));
Stringsend="";
while(true){
send=in.readLine();
PrintWriterout=newPrintWriter(client.getOutputStream(),true);
if(!"byte".equals(send.trim()))
out.println(send);
else{
out.println(send);
System.exit(0);
}
newThread(newTCPClient(){
@SuppressWarnings("static-access")
publicvoidrun(){
try{
BufferedInputStreambis=newBufferedInputStream(client.getInputStream());
byte[]b=newbyte[1024];
intlen=0;
while((len=bis.read(b))!=-1){
System.out.println("伺服器:"+client.getInetAddress().getLocalHost().getHostAddress()+"發來消息:"+newString(b,0,len).trim());
}
}catch(IOExceptione){
System.err.println("連接伺服器失敗!");
}
}
}).start();
}
}
publicvoidrun(){}
}

//伺服器測試結果:

客戶端:192.168.0.200發來消息:001 byte

客戶端:192.168.0.200發來消息:byte

客戶端:192.168.0.200 已斷開連接!

客戶端:192.168.0.200發來消息:adasd

客戶端:192.168.0.200 已斷開連接!

//客戶端測試結果:

---001號客戶端--

001byte

伺服器:192.168.0.200發來消息:001byte

byte //001禮貌說跟伺服器說byte

---002號客戶端--

adasd //002客戶端直接關閉程序

伺服器:192.168.0.200發來消息:adasd

Ⅶ SOCKET通信 客戶端如何指定埠

其他人給你回的是win socket c語言的,java的一樣,都封裝好了,更簡單。但是你要注意,只要經過路由設備,這個埠號就失效了

Ⅷ java socket怎麼樣獲取客戶端公網埠映射

既然是NAT,那就是由客戶端連接伺服器時,才知道客戶端的IP和埠
Socket.getRemoteSocketAddress() 有客戶端的信息。

Ⅸ java中的socket客戶端的埠如何綁定

java中的socket客戶端只需用伺服器所在機器的ip以及伺服器的埠作為參數創建一個Socket對象就可以了,客戶端的代碼可以看下實例:
Socket socket = new Socket("168.160.12.42",9998);
或:
Socket socket = new Socket(InetAddress.getLocalHost(),5678); // 向主機名為InetAddress.getLocalHost()的伺服器申請連接

客戶機必須知道有關伺服器的IP地址,對於著一點Java也提供了一個相關的類InetAddress 該對象的實例必須通過它的靜態方法來提供,它的靜態方法主要提供了得到本機IP 和通過名字或IP直接得到InetAddress的方法。

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

以上的程序代碼建立了一個Socket對象,這個對象連接到ip地址為168.160.12.42的主機上、埠為9998的伺服器對象。並且建立了輸入流和輸出流,分別對應伺服器的輸出和客戶端的寫入。

閱讀全文

與javatcp客戶端綁定埠相關的資料

熱點內容
linux下tftp拷貝文件 瀏覽:507
親吻系電影 瀏覽:513
韓國在車震的劇情 瀏覽:929
流量點擊工具 瀏覽:892
主角叫葉楓的斗羅小說 瀏覽:227
群主如何刪除群文件 瀏覽:766
蘋果ipad能連鍵盤嗎 瀏覽:492
jsreference 瀏覽:637
蘋果用什麼數據線 瀏覽:748
越語電影 瀏覽:55
電影結束了?英文翻譯 瀏覽:476
Excel數據文件夾 瀏覽:442
java交行面試題 瀏覽:626
露點電影合集 瀏覽:697
cad文件可以用p3d打開嗎 瀏覽:394
文件名不能用的特殊符號 瀏覽:740
那能找到在線小電影 瀏覽:476
穿越朱元璋的兒子小說 瀏覽:35
the beast 1975 瀏覽:491
文件夾里可以有多少子文件夾 瀏覽:384

友情鏈接