Java網絡編程——Socket與ServerSocket

    我們知道,程序可以通過ServerSocket和Socket兩個類來實現TCP服務器、TCP客戶端。下面我們通過一個簡單的demo看一下代碼中具體是怎麼實現的。
    Client.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;


public class Client {
	public static void main(String[]args) throws IOException{
		Socket socket=new Socket("127.0.0.1",30000);
		//將Socket對應的輸出流包裝成BufferedReader
		BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
		String line=br.readLine();
		System.out.println("來自服務器的數據:"+line);
		//關閉輸入流、socket
		br.close();
		socket.close();
	}
}


   Server.java
import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
	public static void main(String[]args) throws IOException{
		//創建一個ServerSocket,用於監聽客戶端Socket的連接請求
		ServerSocket ss=new ServerSocket(30000);
		//採用循環不斷接受來自客戶端的請求
		while(true){
			//每當接受到客戶端Socket的請求,服務器端也對應產生一個Socket
			Socket s=ss.accept();
			//將Socket對應的輸出流包裝成PrintStream
			PrintStream ps=new PrintStream(s.getOutputStream());
			ps.println("您好,您收到了服務器的新年祝福");
			//關閉輸出流,關閉Socket
			ps.close();
			s.close();
		}
	}
}

           這個簡單的小demo就實現了客戶端與服務端的通信。但是由於此種方式是基於阻塞式API的,即當程序執行輸入、輸出操作後,在這些操作返回之前會一直阻塞該線程,所以服務器必須爲每個客戶端都提供一條獨立線程進行處理,當服務器需要同時處理大量客戶端時,這種做法會導致性能的下降。java提供的NIO API能夠有效的解決這個問題,可以讓服務器使用一個或者有限幾個線程來同時處理連接到服務器上的所有客戶端,以開發高性能的網絡服務器。也就是Selector的應用。下篇博客我們將介紹Selector的代碼實現。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章