//創建服務器連接
Socket socket =new Socket("192.168.1.1", 8080);
//數據包裝
OutputStream os =socket.getOutputStream();
OutputStreamWriter osw=new OutputStreamWriter(os);
BufferedWriter bw =new BufferedWriter(osw);
//寫入數據
bw.write("hello world!\r\n\r\n");
//刷新發送
bw.flush();
//包裝
InputStream is =socket.getInputStream();
InputStreamReader isr =new InputStreamReader(is);
BufferedReader br =new BufferedReader(isr);
String str ="";
//循環讀取
while ((str=br.readLine())!=null) {
System.out.println(str);
}
//記得關流
os.close();
is.close();
socket.close();
/**
* 那些情況會關流
* 一般我們調用socket.close()就會關閉留,但還有其他情況也會關閉socket流
* 1.直接調用socket.close();
* 2.只要inputStream和OutputStream流有一個關閉了,則網絡連接自動關閉如(inputStream.close();和outputStream.close(););
* 3.在程序退出時網絡連接自動關閉
* 4.將socket置爲null是,虛擬機就會回收這個對象,所以也會關閉連接。
* 5.在Socket被新的Socket對象覆蓋也同4那樣關閉連接
*
* Socket.isClose()可以查看Socket是否已經關閉
*
*/
//用Socket.connect方法連接服務器
Socket socket2 =new Socket();
socket2.connect(new InetSocketAddress("192.168.1.1", 8080));
//設置連接超時
socket2.connect(new InetSocketAddress("192.168.1.1", 8080),5000);
/**
* 網絡連接超時有兩種,連接超時和讀取超時
*
* 1.只有通過 Socket.connect 方法才能指定連接超時的時間。
* 由於使用 connect 方法連接服務器必
* 須要指定IP 和端口,因此,無效的 IP 或端口將會拋出連接超時異常。
* 2.在連接服務器成功後,Socket 所做的最重要的兩件事就是“接收數據”和“發送數據”,而在
* 接收數據時可能因爲網絡延遲、網絡阻塞等原因,客戶端一直處於等待狀態,當客戶端等待一段時
* 間後,如果服務器還沒有發送數據到客戶端,那麼客戶端Socket 將會拋出一個超時異常。
* 我們可以通過Socket.setSoTimeout方法來設置讀取數據超時的時間。時間的單位是毫秒。這個
* 方法必須在讀取數據之前調用纔會生效。如果將超時時間設爲0,則不使用超時時間。也就是說,
* 客戶端什麼時候和服務器斷開,將完全取決於服務端程序的超時設置。如下面的代碼將讀取數據超
* 時時間設爲5秒。
* Socket socket =new Socket();
* socket.setSoTimeout(5000);
* socket.connect(...);
* socket.getInputStream().read();
* 要注意的是不要將設置連接超時和讀取數據超時設置得太小,如果值太小,如100,可能會造
* 成服務器的數據還沒來得及發過來,客戶端就拋出超時異常的現象。
*
*
*/
//設置關閉延遲,有時候在需要關閉連接時還有數據要發就需要設置這個關閉延遲
socket.setSoLinger(true, 30000);
//Socket的可用選項
//TcpNodelay發送不延遲,當數據包很小的時候會等待連接到大包上一起
//發送出去,設置了這個就可以關閉這個功能,立刻發送出去不延遲
socket.setTcpNoDelay(true);
//so_reuseaddr設置這個可以使多個Socket對象綁在同一個端口上
socket.setReuseAddress(true);
//so_timeout讀取數據延遲
socket.setSoTimeout(5000);
//so_sndbuf默認情況下發送緩衝大小爲8KB,可以在這裏改這個值
socket.getSendBufferSize();
socket.setSendBufferSize(10*1024);
//so_rcvbuf接收緩衝大小,默認也爲8KB
socket.getReceiveBufferSize();
socket.setReceiveBufferSize(10*1024);
//so_keepalive 默認關閉,如果將這個 Socket 選項打開,客戶端 Socket 每隔一段時間(大約兩個小時)就會利用空閒的
//連接向服務器發送一個數據包。這個數據包並沒有其他的作用,只是爲了檢測一下服務器是否仍處
//於活動狀態。
socket.setKeepAlive(true);
//so_oobinline 如果這個 Socket 選項打開,可以通過 Socket 類的 sendUrgentData 方法向服務器發送一個單字
//節的數據。這個單字節數據並不經過輸出緩衝區,而是立即發出。
廣告
最近搞了個微信公衆號,爲各種程序員枯燥的寫碼生活添加一些生活調料,
在等待編譯的過程看一篇美麗的圖文放鬆放鬆肌肉。希望各位看官賞臉關注一下
公衆號:馬桶上的哲學
讀哲名理,提升逼格