1.所謂Socket通常也稱作“套接字”,用於描述IP地址和端口,是一個通信鏈的句柄
2.應用程序通常通過“套接字”向網絡發送請求或者應答網絡請求
3.Socket有兩種主要的操作方式:面向連接(TCP)的和無連接的(UDP)。
4.Java.net中提供了兩個類Socket和ServerSocket,分別用來表示雙向連接的客戶端和服務端。
一個客戶端要發起一次通信,首先必須知道運行服務器端的主機IP地址。然後由網絡基礎設施利用目標地址,將客戶端發送的信息傳遞到正確的主機上。
ServerSocket:這個類是實現了一個服務器端的Socket,利用這個類可以監聽來自網絡的請求(當要監控多個客戶端時,可使用類ExecutorService,其對象獲取方法:Executors.newCachedThreadPool(); 調用該對象的execute(Runnablecommand)即可,在未來某個時間執行給定的命令。該命令可能在新的線程、已入池的線程或者正調用的線程中執行,這由Executor實現決定)。創建一個ServerSocket必須指定一個端口,以便客戶端能夠向該端口號發送連接請求。其accept()方法爲下一個傳入的連接請求創建Socket實例。
Socket:利用Socket構造函數,可創建一個TCP套接字後,先連接到指定的遠程地址和端口號。
通信過程中順序:服務器端首先得到輸入流,然後將輸入流信息輸出到其各個客戶端
Socket提供了getInputStream()和getOutputStream()方法來得到輸入輸出流。然後再對輸入流輸出流進行讀寫操作,例 如,對於服務器端,得到Socket對象後,調用getInputStream方法即 可得到來自客戶端的流,調用getOutStream方法可得到向客 戶端發送數據的流。對於客戶端,調用getInputStream方法即可得到來自服務器的流,調用getOutStream方法可得到向服務器端發送 數 據的流。下面是一個簡單的例子:
public class SocketClient {
public static void main(String [] args){
Socket socket=null;
BufferedReader reader=null;
PrintWriter writer=null;
try {
//客戶端socket指定服務器的地址和端口號
socket=new Socket("127.0.0.1", SingleSocketService.port);
//獲取服務端的輸入流
reader =new BufferedReader(new InputStreamReader(socket.getInputStream()));
//用於發送返回信息,
writer =new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())));
for (int i = 0; i < 10; i++) {
writer.println("body" + i);
writer.flush();
String str=reader.readLine();
System.out.println(str);
}
writer.println("end");
writer.flush();
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
reader.close();
writer.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public class SingleSocketService {
public static int port =8080;
public static void main(String [] agres){
ServerSocket serverSocket = null;
BufferedReader bufferedReader = null;
PrintWriter writer = null;
Socket socket = null;
//設定服務端的端口號
try {
serverSocket=new ServerSocket(port);
////等待請求,此方法會一直阻塞,直到獲得請求才往下走
socket=serverSocket.accept();
//用於接收客戶端發來的請求,得到輸入流
bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//用於發送返回信息,可以不需要裝飾這麼多io流使用緩衝流時發送數據要注意調用.flush()方法
writer=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
while (true){
String str=bufferedReader.readLine();//接收到的信息
if(str.equals("end")){
break;
}
Thread.sleep(1000);
writer.println("Message Received");
writer.flush();
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
bufferedReader.close();
writer.close();
socket.close();
serverSocket.close();
}catch (Exception e){
}
}
}