4 設定超時時間
假設有這樣一種需求,我們的客戶端需要通過socket從服務端獲取到xx資訊,然後給使用者展示在頁面上。我們知道socket在讀資料的時候是阻塞式的,如果沒有讀到資料程式會一直阻塞在那裡。在同步請求的時候我們肯定是不能允許這樣的情況發生的,這就需要我們在請求達到一定的時間後控制阻塞的中斷,讓程式得以繼續執行。socket為我們提供了乙個setsotimeout()方法來設定接收資料的超時時間,單位是毫秒。當設定的超時時間大於0,並且超過了這一時間socket還沒有接收到返回的資料的話,socket就會丟擲乙個sockettimeoutexception。
假設我們需要控制我們的客戶端在開始讀取資料10秒後還沒有讀到資料就中斷阻塞的話我們可以這樣做:
public class client
}} catch (sockettimeoutexception e)
system.out.println("from server: " + sb);
writer.close();
br.close();
client.close();
}}
5 處理接收的亂碼
對於這種服務端或客戶端接收中文亂碼的情況通常是因為資料傳送時使用的編碼跟接收時候使用的編碼不一致。比如有下面這樣一段服務端**:
public class server
}/**
* 用來處理socket請求的
*/static class task implements runnable
public void run() catch (exception e)
}/**
* 跟客戶端socket進行通訊
* @throws exception
*/private void handlesocket() throws exception
}system.out.println("客戶端: " + sb);
//讀完後寫一句
writer writer = new outputstreamwriter(socket.getoutputstream(), "utf-8");
writer.write("你好,客戶端。");
writer.write("eof\n");
writer.flush();
writer.close();
br.close();
socket.close();}}
}
這裡用來測試我就弄的混亂了一點。在上面服務端**中我們在定義輸入流的時候明確定義了使用
gbk編碼來讀取資料,而在定義輸出流的時候明確指定了將使用
utf-8
編碼來傳送資料。如果客戶端上送資料的時候不以
gbk編碼來傳送的話服務端接收的資料就很有可能會亂碼;同樣如果客戶端接收資料的時候不以服務端傳送資料的編碼,即
utf-8
編碼來接收資料的話也極有可能會出現資料亂碼的情況。所以,對於上述服務端**,為使我們的程式能夠讀取對方傳送過來的資料,而不出現亂碼情況,我們的客戶端應該是這樣的:
public class client
}} catch (sockettimeoutexception e)
system.out.println("服務端: " + sb);
writer.close();
br.close();
client.close();
}}
Java Socket程式設計
一般,就這麼的形式,熟悉後就這麼用了。客戶端 首先,建立客戶端套接字 socket s new socket ip,port 通過套接字,可以獲得輸入流和輸出流 inputstream is s.getinputstream outputstream os s.getoutstream 接下來就是對...
java socket程式設計
1.什麼是socket 所謂socket通常也稱作 套接字 用於描述ip位址和埠,是乙個通訊鏈的控制代碼。應用程式通常通過 套接字 向網路發出請求或者應答網路請求。2.客戶端和伺服器端通過socket傳送訊息和接收訊息的過程 接收訊息的過程 傳送訊息的過程 server端listen 監聽 某個埠是...
Java socket程式設計
對tcp ip udp socket程式設計這些詞你不會很陌生吧?隨著網路技術的發展,這些詞充斥著我們的耳朵。那麼我想問 1.什麼是tcp ip udp?2.socket在 呢?3.socket是什麼呢?4.你會使用它們嗎?什麼是tcp ip udp?tcp ip transmission cont...