導航:首頁 > 編程語言 > java關閉serversocket

java關閉serversocket

發布時間:2023-06-29 22:44:30

1. 學習java Socket中 啟動了serverSocket 再啟動socket 為什麼serversocket 自動關閉了

第2次開啟時,埠被佔用。

另外,就是你的ServerSocket是只寫了一次應答、然後退出的。

2. 關於JAVA的關閉serverSOCKET

accept()寫在主線程里,
你需要從操作寫在自定義的線程里,這樣接受一個socket就創建一個自定義線程,

3. java開發聊天功能用什麼技術

Java開發聊天功能可以使用Socket和ServerSocket技術來實現。
在這種情況下,伺服器端需要創建一個ServerSocket對象來監聽客戶端的連接請求槐伍。當有新的連接請求到達時,伺服器會創建一個鉛敏或新的Socket對象來與客戶端進行通信,並將該Socket對象加入到線程池中。通過這種方式,伺服器可拿御以同時處理多個客戶端的連接請求和消息交互。
客戶端需要創建一個Socket對象,並指定伺服器端的IP地址和埠號來連接伺服器。連接成功後,客戶端可以向伺服器發送消息,也可以接收來自伺服器的消息。當客戶端退出聊天室時,需要關閉Socket連接,並通知伺服器該客戶端已經離開。
在實際開發中,還需要考慮到消息的編碼和解碼、異常處理、線程安全等問題。可以使用現成的開源框架如Netty、Spring Boot等來簡化聊天功能的開發。同時,還需要進行充分的測試和優化,以提高聊天功能的性能和用戶體驗。

4. java如何關閉socket連接

所以要用抄長連接啊。客戶端埠關閉後需要在close_wait狀態等待1-2分鍾才會徹底關閉,具體看操作系統的設置,一般默認2分鍾。詳細TCP狀態轉換可以參考TCP協議。
如果預期需要頻繁傳數據,就不要關閉埠,而是維持埠連接,每次都復用這個連接傳。如果預期有幾分鍾以上不會用到連接再關閉。

5. Java Socket初步詳解

網路編程的基本模型就是客戶機到伺服器模型 簡單的說就是兩個進程之間相互通訊 然後其中一個必須提供一個固定的位置 而另一個則只需要知道這個固定的位置 並去建立兩者之間的聯系 然後完成數據的通訊就可以了 這里提供畝悉猜固定位置的通常稱為伺服器 而建立聯系的通常叫做客戶端 基於這個簡單的模型 就可以進入網路編程啦

Java對這個模型的支持有很多種Api 而這里我只想介紹有關Socket的編程介面 對於Java而言已經簡化了Socket的編程介面 首先我們來討論有關提供固定位置的服務方是如何建立的 Java提供了ServerSocket來對其進行支持 事實上當你創建該類的一個實力對象並提供一個埠資源你就建立了一個固定位置可以讓其他計算機來訪問你 ServerSocket server=new ServerSocket( );這里稍微要注意的是埠的分配必須是唯一的 因為埠是為了唯一標識每台計算機唯一服務的 另外埠號是從 ~ 之間的 前 個埠已經被Tcp/Ip 作為保留埠 因此你所分配的埠只能是 個之後的 好了 我們有了固定位置 現在所需要的就是一根連接線了 該連接線由客戶方首先提出要求 因此Java同樣提供了一個Socket對象來對其進行支持 只要客戶方創建一個Socket的實例對象進行支持就可以了 Socket client

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

上面的方法基本可以建立一條連線讓兩台計算機相互交流了 可是數據是如何傳輸的呢?事實上I/O操作總是和網路編程息息相關的 因為底層的網路是繼續數據的 除非遠程調用 處理問題的核心在執行上 否則數據的陸帆交互還是依賴於IO操作的 所以你也必須導入java io這個包 java的IO操作也不復雜 它提供了針對於位元組流和Unicode的讀者和寫者 然後也提供了一個緩沖用於數據的讀寫

BufferedReader in=new BufferedReader(new InputStreamReader(server getInputStream()));

PrintWriter out=new PrintWriter(server getOutputStream());

上面兩句就是建立緩沖並把原始的位元組流轉變為Unicode可以操作 而原始的位元組流來源於Socket的兩個方法 getInputStream()和getOutputStream()方 分別用來得到輸入和輸出 那麼現在有了基本的模型和基本的操作工具 我們可以做一個簡單的Socket常式了

服務方:

import java io *;

import *;

public class MyServer {

public static void main(String[] args) throws IOException{

ServerSocket server=new ServerSocket( );

Socket client=server accept();

BufferedReader in=new BufferedReader(new InputStreamReader(client getInputStream()));

迅型PrintWriter out=new PrintWriter(client getOutputStream());

while(true){

String str=in readLine();

System out println(str);

out println( has receive );

out flush();

if(str equals( end ))

break;

}

client close();

}

}

這個程序的主要目的在於伺服器不斷接收客戶機所寫入的信息只到 客戶機發送 End 字元串就退出程序 並且伺服器也會做出 Receive 為回應 告知客戶機已接收到消息

客戶機代碼:

import *;

import java io *;

public class Client{

static Socket server;

public static void main(String[] args)throws Exception{

server=new Socket(InetAddress getLocalHost() );

BufferedReader in=new BufferedReader(new InputStreamReader(server getInputStream()));

PrintWriter out=new PrintWriter(server getOutputStream());

BufferedReader wt=new BufferedReader(new InputStreamReader(System in));

while(true){

String str=wt readLine();

out println(str);

out flush();

if(str equals( end )){

break;

}

System out println(in readLine());

}

server close();

}

}

客戶機代碼則是接受客戶鍵盤輸入 並把該信息輸出 然後輸出 End 用來做退出標識

這個程序只是簡單的兩台計算機之間的通訊 如果是多個客戶同時訪問一個伺服器呢?你可以試著再運行一個客戶端 結果是會拋出異常的 那麼多個客戶端如何實現呢?

其實 簡單的分析一下 就可以看出客戶和服務通訊的主要通道就是Socket本身 而伺服器通過accept方法就是同意和客戶建立通訊 這樣當客戶建立Socket的同時 伺服器也會使用這一根連線來先後通訊 那麼既然如此只要我們存在多條連線就可以了 那麼我們的程序可以變為如下:

伺服器:

import java io *;

import *;

public class MyServer {

public static void main(String[] args) throws IOException{

ServerSocket server=new ServerSocket( );

while(true){

Socket client=server accept();

BufferedReader in=new BufferedReader(new InputStreamReader(client getInputStream()));

PrintWriter out=new PrintWriter(client getOutputStream());

while(true){

String str=in readLine();

System out println(str);

out println( has receive );

out flush();

if(str equals( end ))

break;

}

client close();

}

}

}

這里僅僅只是加了一個外層的While循環 這個循環的目的就是當一個客戶進來就為它分配一個Socket直到這個客戶完成一次和伺服器的交互 這里也就是接受到客戶的 End 消息 那麼現在就實現了多客戶之間的交互了 但是 問題又來了 這樣做雖然解決了多客戶 可是是排隊執行的 也就是說當一個客戶和伺服器完成一次通訊之後下一個客戶才可以進來和伺服器交互 無法做到同時服務 那麼要如何才能同時達到既能相互之間交流又能同時交流呢?很顯然這是一個並行執行的問題了 所以線程是最好的解決方案

那麼下面的問題是如何使用線程 首先要做的事情是創建線程並使得其可以和網路連線取得聯系 然後由線程來執行剛才的操作 要創建線程要麼直接繼承Thread要麼實現Runnable介面 要建立和Socket的聯系只要傳遞引用就可以了 而要執行線程就必須重寫run方法 而run方法所做的事情就是剛才單線程版本main所做的事情 因此我們的程序變成了這樣:

import *;

import java io *;

public class MultiUser extends Thread{

private Socket client;

public MultiUser(Socket c){

this client=c;

}

public void run(){

try{

BufferedReader in=new BufferedReader(new InputStreamReader(client getInputStream()));

PrintWriter out=new PrintWriter(client getOutputStream());

//Mutil User but can t parallel

while(true){

String str=in readLine();

System out println(str);

out println( has receive );

out flush();

if(str equals( end ))

break;

}

client close();

}catch(IOException ex){

}finally{

}

}

public static void main(String[] args)throws IOException{

ServerSocket server=new ServerSocket( );

while(true){

//transfer location change Single User or Multi User

MultiUser mu=new MultiUser(server accept());

mu start();

}

}

}

lishixin/Article/program/Java/hx/201311/27013

閱讀全文

與java關閉serversocket相關的資料

熱點內容
岳陽微信公司 瀏覽:96
win10如何從備份中恢復出廠設置密碼 瀏覽:659
什麼軟體修改wifi密碼錯誤 瀏覽:582
遇見不安全網站怎麼辦 瀏覽:251
哪個app有慶余年電視劇 瀏覽:420
iphone5s視頻時很黑 瀏覽:601
js獲取埠號 瀏覽:347
手機短息發的鏈接病毒蘋果手機 瀏覽:724
win10專業忘記家庭組密碼 瀏覽:176
南寧applestore幾樓 瀏覽:296
java字元串怎麼初始化 瀏覽:349
醫美哪個app好 瀏覽:768
代碼編程和機器人編程哪個好 瀏覽:875
90版本男法 瀏覽:796
win10桌面字體難看 瀏覽:848
三菱fx5u支持哪些編程 瀏覽:7
優酷在文件夾在哪裡 瀏覽:91
趣列印的數據文件是什麼 瀏覽:871
linuxjava程序 瀏覽:483
蘋果6splus數據線圖片 瀏覽:98

友情鏈接