一个简单的Socket通信例子

叁歲伎倆 2023-06-27 06:17 44阅读 0赞

客户端与服务端交互流程

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEyMTIzOTQ_size_16_color_FFFFFF_t_70

客户端

  1. public class Client {
  2. // 服务端 host
  3. private static final String HOST = "127.0.0.1";
  4. // 服务端 port
  5. private static final int PORT = 8000;
  6. // 消息发送间隔
  7. private static final int SLEEP_TIME = 5000;
  8. public static void main(String[] args) throws IOException {
  9. // 创建客户端socket
  10. final Socket socket = new Socket(HOST, PORT);
  11. new Thread(() -> {
  12. System.out.println("客户端启动成功!");
  13. while (true) {
  14. try {
  15. String message = "hello world";
  16. System.out.println("客户端发送数据: " + message);
  17. socket.getOutputStream().write(message.getBytes());
  18. } catch (Exception e) {
  19. System.out.println("写数据出错!");
  20. }
  21. // 睡眠一段时间再发送消息
  22. sleep();
  23. }
  24. }).start();
  25. }
  26. private static void sleep() {
  27. try {
  28. Thread.sleep(SLEEP_TIME);
  29. } catch (InterruptedException e) {
  30. e.printStackTrace();
  31. }
  32. }
  33. }

服务端

  1. public class Server {
  2. private ServerSocket serverSocket;
  3. public Server(int port) {
  4. try {
  5. // 创建服务端 socket 对象
  6. this.serverSocket = new ServerSocket(port);
  7. System.out.println("服务端启动成功!端口:" + port);
  8. } catch (IOException e) {
  9. e.printStackTrace();
  10. }
  11. }
  12. public void start() {
  13. // 新建子线程处理请求(不阻塞主线程)
  14. new Thread(() -> doStart()).start();
  15. }
  16. private void doStart() {
  17. while (true) {
  18. try {
  19. // 监听消息,没有消息时会阻塞
  20. Socket client = serverSocket.accept();
  21. // 消息处理
  22. new ClientHandler(client).start();
  23. } catch (IOException e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. }
  28. }

服务端处理消息的逻辑

  1. public class ClientHandler {
  2. private static final int MAX_DATA_LEN = 1024;
  3. private Socket socket;
  4. public ClientHandler(Socket socket) {
  5. this.socket = socket;
  6. }
  7. public void start() {
  8. System.out.println("新客户端接入");
  9. // 创建子线程接收新客户端的消息
  10. new Thread(()-> doStart()).start();
  11. }
  12. private void doStart() {
  13. try {
  14. // 读取消息流
  15. InputStream inputStream = socket.getInputStream();
  16. while (true) {
  17. byte[] data = new byte[MAX_DATA_LEN];
  18. int len;
  19. while((len = inputStream.read(data)) != -1) {
  20. String message = new String(data, 0, len);
  21. System.out.println("客户端传来的消息:" + message);
  22. // 将数据回传客户端
  23. socket.getOutputStream().write(data);
  24. }
  25. }
  26. } catch (IOException e) {
  27. e.printStackTrace();
  28. }
  29. }
  30. }

服务端启动逻辑

  1. public class ServerBoot {
  2. private static final int PORT = 8000;
  3. public static void main(String[] args) {
  4. Server server = new Server(PORT);
  5. server.start();
  6. }
  7. }

结果验证

先启动服务端,再启动客户端,在控制台上可以看到打印的结果。
服务端控制台:
watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEyMTIzOTQ_size_16_color_FFFFFF_t_70 1
客户端控制台:
watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEyMTIzOTQ_size_16_color_FFFFFF_t_70 2

发表评论

表情:
评论列表 (有 0 条评论,44人围观)

还没有评论,来说两句吧...

相关阅读

    相关 NIO Socket传输简单例子

    传统的 IO 流都是阻塞式的。也就是说,当一个线程调用 read() 或 write()时,该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务。这种情况下

    相关 简单一对一Socket通信

    之前学弟还问过我这个,但是都是肤浅的查查资料,晚上抽空在慕课系统的了解下,慢慢来吧. 首先Socket通信需要创建一个服务端和一个客户端 建立连接后,既可以通过字节流进行通