单发单收

ServerSocket

  1. /**
  2. * 服务端
  3. */
  4. System.out.println("===服务端启动成功===");
  5. // 1.注册端口
  6. ServerSocket serverSocket = new ServerSocket(7777);
  7. // 2.必须调用accept方法: 等待接收客户端的Socket连接请求,建立Socket通信管道
  8. Socket socket = serverSocket.accept();
  9. // 3.从Socket通信管道中得到一个字节输入流
  10. InputStream is = socket.getInputStream();
  11. // 4.把字节输入流包装成缓冲字符输入流进行消息的接受
  12. BufferedReader br = new BufferedReader(new InputStreamReader(is));
  13. // 5.按照行读取
  14. String msg =null;
  15. SocketAddress cip = socket.getRemoteSocketAddress();
  16. while ((msg = br.readLine()) != null) {
  17. System.out.println("客户端IP :" + cip);
  18. System.out.println("消息:" + msg);
  19. }

Socket

  1. /**
  2. * 客户端
  3. */
  4. System.out.println("===客户端启动成功===");
  5. // 1.创建Socket通信管道请求有服务端的连接
  6. // 参数一:服务器ip地址,参数二:端口
  7. Socket socket = new Socket("127.0.0.1", 7777);
  8. // 2.从Socket通信管道中得到一个字节输出流,负责发送数据
  9. OutputStream os = socket.getOutputStream();
  10. // 3、把低级的字节流包装成打印流
  11. PrintStream ps = new PrintStream(os);
  12. // 4.发送消息
  13. String msg = "测试一下";
  14. ps.println(msg);
  15. ps.flush();
  16. // 5.关闭流,不需要关闭,容易引起BUG
  17. // ps.close();

多发多收(单线程只能接受1个客户端)

  1. /**
  2. * 服务端
  3. */
  4. System.out.println("===服务端启动成功===");
  5. // 1.注册端口
  6. ServerSocket serverSocket = new ServerSocket(7777);
  7. // 2.必须调用accept方法: 等待接收客户端的Socket连接请求,建立Socket通信管道
  8. Socket socket = serverSocket.accept();
  9. // 3.从Socket通信管道中得到一个字节输入流
  10. InputStream is = socket.getInputStream();
  11. // 4.把字节输入流包装成缓冲字符输入流进行消息的接受
  12. BufferedReader br = new BufferedReader(new InputStreamReader(is));
  13. // 5.按照行读取
  14. String msg =null;
  15. SocketAddress cip = socket.getRemoteSocketAddress();
  16. while ((msg = br.readLine()) != null) {
  17. System.out.println("客户端IP :" + cip);
  18. System.out.println("消息:" + msg);
  19. }
  1. /**
  2. * 客户端
  3. */
  4. System.out.println("===客户端启动成功===");
  5. // 1.创建Socket通信管道请求有服务端的连接
  6. // 参数一:服务器ip地址,参数二:端口
  7. Socket socket = new Socket("127.0.0.1", 7777);
  8. // 2.从Socket通信管道中得到一个字节输出流,负责发送数据
  9. OutputStream os = socket.getOutputStream();
  10. // 3、把低级的字节流包装成打印流
  11. PrintStream ps = new PrintStream(os);
  12. Scanner sc = new Scanner(System.in);
  13. while (true) {
  14. // 4.发送消息
  15. System.out.println("请输入:");
  16. String msg = sc.nextLine();
  17. ps.println(msg);
  18. ps.flush();
  19. }

多发多收(多线程-线程池接受多个客户端)

  1. // 使用静态变量记住一个线程池对象
  2. private static ExecutorService pool = new ThreadPoolExecutor(3,
  3. 5,
  4. 6,
  5. TimeUnit.SECONDS, new ArrayBlockingQueue<>(2),
  6. Executors.defaultThreadFactory(),
  7. new ThreadPoolExecutor.AbortPolicy());
  8. public static void main(String[] args) throws IOException {
  9. /**
  10. * 服务端
  11. */
  12. System.out.println("===服务端启动成功===");
  13. // 1.注册端口
  14. ServerSocket serverSocket = new ServerSocket(7777);
  15. // a.定义一个死循环由主线程负责不断的接受客户端的Socket管道连接。
  16. while (true) {
  17. // 2.每接收到一个客户端的Socket管道,交给一个独立的子线程负责读取消息
  18. Socket socket = serverSocket.accept();
  19. // 获取客户端的ip地址
  20. SocketAddress cip = socket.getRemoteSocketAddress();
  21. System.out.println("客户端IP: " + cip);
  22. // 3.开始创建独立线程处理socket
  23. Runnable target = new ServerReaderRunnable(socket);
  24. pool.execute(target);
  25. }
  26. }
  1. package xuexi.variable.logback;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.InputStreamReader;
  6. import java.net.Socket;
  7. import java.net.SocketAddress;
  8. public class ServerReaderRunnable implements Runnable {
  9. private Socket socket;
  10. public ServerReaderRunnable(Socket socket) {
  11. this.socket = socket;
  12. }
  13. @Override
  14. public void run() {
  15. //重写run方法
  16. try {
  17. // 3.从Socket通信管道中得到一个字节输入流
  18. InputStream is = socket.getInputStream();
  19. // 4.把字节输入流包装成缓冲字符输入流进行消息的接受
  20. BufferedReader br = new BufferedReader(new InputStreamReader(is));
  21. // 5.按照行读取
  22. String msg = null;
  23. SocketAddress cip = socket.getRemoteSocketAddress();
  24. while ((msg = br.readLine()) != null) {
  25. System.out.println("客户端IP :" + cip);
  26. System.out.println("消息:" + msg);
  27. }
  28. } catch (IOException e) {
  29. SocketAddress ip2 = socket.getRemoteSocketAddress();
  30. System.out.println("客户端IP下线 " + ip2);
  31. }
  32. }
  33. }
  1. /**
  2. * 客户端
  3. */
  4. System.out.println("===客户端启动成功===");
  5. // 1.创建Socket通信管道请求有服务端的连接
  6. // 参数一:服务器ip地址,参数二:端口
  7. Socket socket = new Socket("127.0.0.1", 7777);
  8. // 2.从Socket通信管道中得到一个字节输出流,负责发送数据
  9. OutputStream os = socket.getOutputStream();
  10. // 3、把低级的字节流包装成打印流
  11. PrintStream ps = new PrintStream(os);
  12. Scanner sc = new Scanner(System.in);
  13. while (true) {
  14. // 4.发送消息
  15. System.out.println("请输入:");
  16. String msg = sc.nextLine();
  17. ps.println(msg);
  18. ps.flush();
  19. }