服務端
每個連接新起一個線程去處理
public class Server implements Runnable{
private Socket socket;
private BufferedReader bufferedReader;
private PrintWriter printWriter;
public Server(Socket socket, BufferedReader bufferedReader, PrintWriter printWriter){
this.socket = socket;
this.bufferedReader = bufferedReader;
this.printWriter = printWriter;
}
@Override
public void run(){
try{
System.out.println(socket.getPort() + " " + Thread.currentThread().getName()) ;
Scanner scanner = new Scanner(System.in);
while (true){
String string = bufferedReader.readLine();
System.out.println("Server讀到:"+string);
if(string.equals("exit")){
printWriter.println(string);
printWriter.flush();
break;
}
System.out.println("Server端請輸入:");
String str = scanner.next();
printWriter.println(str);
printWriter.flush();
}
}catch (Exception e){
e.printStackTrace();
}finally {
System.out.println("請求結束,關閉資源");
try {
socket.close();
bufferedReader.close();
printWriter.close();
}catch (IOException e){
e.printStackTrace();
}
System.out.println("請求結束,資源已關閉");
}
}
public static void main(String[] args) throws IOException{
ServerSocket serverSocket = new ServerSocket(8000);
while (true){
Socket clientSocket = serverSocket.accept();
System.out.println("連接成功:" + clientSocket.getRemoteSocketAddress());
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
new Thread(new Server(clientSocket, bufferedReader, printWriter)).start();
}
}
}
客戶端
public class Client {
public static void main(String[] args) throws Exception{
Socket socket = new Socket("localhost", 8000);
Scanner scanner = new Scanner(System.in);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
try{
while (true){
System.out.println("客戶端請輸入:");
String str = scanner.next();
printWriter.println(str);
printWriter.flush();
String res = bufferedReader.readLine();
System.out.println("收到服務端的信息:" + res);
if(res.equals("exit"))
break;
}
}catch (Exception e){
e.printStackTrace();
}finally {
scanner.close();
socket.close();
bufferedReader.close();
printWriter.close();
}
}
}
線程處理
缺點
- 在任何時候都可能有大量的線程處於休眠狀態,只是等待輸入或者輸出數據就緒,這可能算是一種資源浪費
- 需要爲每個線程的調用棧都分配內存,其默認值大小區間爲64 KB 到1 MB,具體取決於操作系統
- 即使Java 虛擬機(JVM)在物理上可以支持非常大數量的線程,但是遠在到達該極限之前,上下文切換所帶來的開銷就會帶來麻煩,例如,在達到10 000 個連接的時候