Socket与ServerSocket

ServerSocket用来代表服务器端的Socket,也就是服务器端的端点
Socket就是客户端的端口
首先,当我们创建一个ServerSocket的时候,要先提供一个端口,实现端口的绑定,一旦绑定之后,这个ServerSocket就可以作为服务端的端口,服务器就会一直监听这个端口。
然后会调用一个叫accept的函数,accept是一个阻塞式的调用,所谓阻塞式的调用,就是它会等待任何一个客户端来跟它建立连接,当没有客户端来建立连接的时候,accept就会一直等待。
一旦客户端,创建一个Socket对象,是用来表达客户端的端点的,客户端生成的一个Socket可以要求跟服务端进行连接。
一旦服务端接受了客户端的连接,这个accept就会返回一个Socket,这个端点就可以跟客户端的端点进行沟通。
image.png

实现ServerSocket

  1. import java.io.*;
  2. import java.net.ServerSocket;
  3. import java.net.Socket;
  4. public class Server {
  5. public static void main(String[] args) {
  6. final String QUIT = "quit";
  7. final int DEFAULT_POST = 8888;
  8. ServerSocket serverSocket = null;
  9. try {
  10. // 绑定监听端口
  11. serverSocket = new ServerSocket(DEFAULT_POST);
  12. System.out.println("启动服务器,监听端口" + DEFAULT_POST);
  13. while (true){
  14. //等待客户端连接,一旦有客户端连接上了,就会返回一个Socket,这个Socket就是客户端的端点
  15. Socket socket = serverSocket.accept();
  16. System.out.println("客户端[" + socket.getPort() + "]已连接");
  17. BufferedReader reader = new BufferedReader(
  18. new InputStreamReader(socket.getInputStream())
  19. );
  20. BufferedWriter writer = new BufferedWriter(
  21. new OutputStreamWriter(socket.getOutputStream())
  22. );
  23. String msg = null;
  24. while ((msg = reader.readLine()) != null){
  25. System.out.println("客户端[" + socket.getPort() + "]:" + msg);
  26. //回复客户发送的消息
  27. writer.write("服务器:" + msg + "\n");
  28. writer.flush();
  29. //查看客户端是否退出
  30. if (QUIT.equals(msg)){
  31. System.out.println("客户端[" + socket.getPort() + "]已退出");
  32. break;
  33. }
  34. }
  35. }
  36. } catch (IOException e) {
  37. e.printStackTrace();
  38. }finally {
  39. if (serverSocket != null){
  40. try {
  41. serverSocket.close();
  42. } catch (IOException e) {
  43. e.printStackTrace();
  44. }
  45. }
  46. }
  47. }
  48. }

实现Socket