//客戶端Socket可以通過指定IP地址或域名兩種方式來連接服務器端,實際最終都是通過IP地址來連接服務器
//新建壹個Socket,指定其IP地址及端口號
Socket socket = new Socket("192.168.0.7",80);
/***Socket 客戶端 壹些常用設置***/
//客戶端socket在接收數據時,有兩種超時:1.連接服務器超時,即連接超時;2.連接服務器成功後,接收服務器數據超時,即接收超時
//*設置socket 讀取數據流的超時時間
socket.setSoTimeout(5000);
//發送數據包,默認為false,即客戶端發送數據采用Nagle算法;
//但是對於實時交互性高的程序,建議其改為true,即關閉Nagle算法,客戶端每發送壹次數據,無論數據包大小都會將這些數據發送出去
socket.setTcpNoDelay(true);
//設置客戶端socket關閉時,close()方法起作用時延遲1分鐘關閉,如果1分鐘內盡量將未發送的數據包發送出去
socket.setSoLinger(true, 60);
//設置輸出流的發送緩沖區大小,默認是8KB,即8096字節
socket.setSendBufferSize(8096);
//設置輸入流的接收緩沖區大小,默認是8KB,即8096字節
socket.setReceiveBufferSize(8096);
//作用:每隔壹段時間檢查服務器是否處於活動狀態,如果服務器端長時間沒響應,自動關閉客戶端socket
//防止服務器端無效時,客戶端長時間處於連接狀態
socket.setKeepAlive(true);
/*** Socket客戶端向服務器端發送數據 ****/
//客戶端向服務器端發送數據,獲取客戶端向服務器端輸出流
OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
//代表可以立即向服務器端發送單字節數據
socket.setOOBInline(true);
//數據不經過輸出緩沖區,立即發送
socket.sendUrgentData(65);//"A"
//向服務器端寫數據,寫入壹個緩沖區
//註:此處字符串最後必須包含“\r\n\r\n”,告訴服務器HTTP頭已經結束,可以處理數據,否則會造成下面的讀取數據出現阻塞
//在write()方法中可以定義規則,與後臺匹配來識別相應的功能,例如登錄Login()方法,可以寫為write("Login|test,123 \r\n\r\n"),供後臺識別;
bw.write("Login|test,123 \r\n\r\n");
//發送緩沖區中數據,必須有
bw.flush();
/*** Socket客戶端讀取服務器端響應數據 ****/
//socket.isConnected代表是否連接成功過
if((socket.isConnected() == true) && (socket.isClosed() == false)){//判斷Socket是否處於連接狀態
//客戶端接收服務器端的響應,讀取服務器端向客戶端的輸入流
InputStream is = socket.getInputStream();
//緩沖區
byte[] buffer = new byte[is.available()];
//讀取緩沖區
is.read(buffer);
//轉換為字符串
String responseInfo = new String(buffer);
//日誌中輸出
Log.i("TEST", responseInfo);
} //關閉網絡
socket.close();
/***第二種:通過connect方法連接服務器***/
Socket socket_other = new Socket();
//使用默認的連接超時
socket_other.connect(new InetSocketAddress("192.168.0.7",80));
//連接超時2s
socket_other.connect(new InetSocketAddress("192.168.0.7",80),2000);
//關閉socket
socket_other.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}