當前位置:首頁 » 編程語言 » java中socket編程實例

java中socket編程實例

發布時間: 2025-08-20 11:28:00

A. java編程中,Socket通信是怎麼實現的

java編程對於Socket之間的通信過程如下:

服務端往Socket的輸出流裡面寫東西,客戶端就可以通過Socket的輸入流讀取對應的內容。Socket與Socket之間是雙向連通的,所以客戶端也可以往對應的Socket輸出流裡面寫東西,然後服務端對應的Socket的輸入流就可以讀出對應的內容。下面來看一些服務端與客戶端通信的例子:

publicclassServer{

publicstaticvoidmain(Stringargs[])throwsIOException{
//為了簡單起見,所有的異常信息都往外拋
intport=8899;
//定義一個ServerSocket監聽在埠8899上
ServerSocketserver=newServerSocket(port);
//server嘗試接收其他Socket的連接請求,server的accept方法是阻塞式的
Socketsocket=server.accept();
//跟客戶端建立好連接之後,我們就可以獲取socket的InputStream,並從中讀取客戶端發過來的信息了。
Readerreader=newInputStreamReader(socket.getInputStream());
charchars[]=newchar[64];
intlen;
StringBuildersb=newStringBuilder();
while((len=reader.read(chars))!=-1){
sb.append(newString(chars,0,len));
}
System.out.println("fromclient:"+sb);
reader.close();
socket.close();
server.close();
}

}
客戶端代碼
Java代碼publicclassClient{

publicstaticvoidmain(Stringargs[])throwsException{
//為了簡單起見,所有的異常都直接往外拋
Stringhost="127.0.0.1";//要連接的服務端IP地址
intport=8899;//要連接的服務端對應的監聽埠
//與服務端建立連接
Socketclient=newSocket(host,port);
//建立連接後就可以往服務端寫數據了
Writerwriter=newOutputStreamWriter(client.getOutputStream());
writer.write("HelloServer.");
writer.flush();//寫完後要記得flush
writer.close();
client.close();
}

}

B. java socket編程如何測量文件傳輸速度

下面給你介紹3種解決方法:

解決方案一:

發送時發送一個記錄客戶端時間的包,同時記錄好這個包的大小 。服務端在收到這個包後,拆包。取出客戶端時間和自己的服務端時間時行差值計算。

然後,接下去就好做了

解決方案二:

在發送數據的時候獲取當前系統時間,並將其作為初始時間保存下來(比如long beginTime=毫秒數),傳輸到客戶端;然後再客戶端收到文件後計算與當前系統時間的差值即可。

解決方案三:

long start=System.currentTimeMillis();

傳輸的過程或者方法調用

long end=System.currentTimeMillis();

System.out.println("傳輸時間"+(end-start)+"毫秒");

C. java socket 判斷是否斷開了

首先想到socket類的方法isClosed()、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()等,但經過試驗並查看相關文檔,這些方法都是本地端的狀態,無法判斷遠端是否已經斷開連接。
然後想到是否可以通過OutputStream發送一段測試數據,如果發送失敗就表示遠端已經斷開連接,類似ping,但是這樣會影響到正常的輸出數據,遠端無法把正常數據和測試數據分開。
最後又回到socket類,發現有一個方法sendUrgentData,查看文檔後得知它會往輸出流發送一個位元組的數據,只要對方Socket的SO_OOBINLINE屬性沒有打開,就會自動舍棄這個位元組,而SO_OOBINLINE屬性默認情況下就是關閉的,太好了,正是我需要的!
於是,下面一段代碼就可以判斷遠端是否斷開了連接:
try{
socket.sendUrgentData(0xFF);
}catch(Exception ex){
reconnect();
}
用ping實現
package com.csdn.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class test {
static BufferedReader bufferedReader;
public static void main(String[] args) throws IOException {
try {
Process process = Runtime.getRuntime().exec("ping 192.168.1.104");//判斷是否連接的IP;
bufferedReader = new BufferedReader(new InputStreamReader(process
.getInputStream()));
String connectionStr = "";
while ((connectionStr = bufferedReader.readLine()) != null) {
System.out.println(connectionStr);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
bufferedReader.close();
}
}
}
ping的方法有個嚴重的BUG,就是你只能判斷對方是否連接網路,而不能判斷客戶端是否開啟...
我在寫聊天室時經常要注意客戶端異常退出的問題(比如客戶直接調用任務管理器結束程序進程),
其實在通過socket.getoutstream和socket.getinputstream流對客戶端發送、接受信息時如果socket沒連接上是會拋出異常的,這也就是為什麼Java會要求網路編程都要寫在try裡面,所以只要在catch裡面寫入客戶端退出的處理就行了,沒必要專門去想什麼方法

熱點內容
我的世界伺服器聯接 發布:2025-08-20 17:58:22 瀏覽:251
網路編程tcp協議 發布:2025-08-20 17:56:49 瀏覽:750
伺服器期限燈是什麼 發布:2025-08-20 17:42:26 瀏覽:618
圖片上傳模板 發布:2025-08-20 17:42:18 瀏覽:668
澳門電信wifi如何重設密碼 發布:2025-08-20 17:32:33 瀏覽:649
安卓如何強制編譯某個模塊 發布:2025-08-20 17:25:41 瀏覽:500
安卓怎麼玩王者ios的賬號 發布:2025-08-20 17:24:44 瀏覽:982
遠程桌面web訪問 發布:2025-08-20 17:02:16 瀏覽:550
幹細胞存儲資質 發布:2025-08-20 16:52:38 瀏覽:765
從資料庫讀取二進制文件 發布:2025-08-20 16:52:30 瀏覽:245