XazGreatXia 2024-06-07 17:50 采纳率: 29%
浏览 2
已结题

Java学习的一个小问题


import java.io.*;
import java.net.*;
import java.util.Scanner;

public class sockclient {

    public static void main(String[] args) throws Exception{
        
        Socket socket = new Socket("192.168.159.128",8888);

        InputStream input = socket.getInputStream();
        
        OutputStream output = socket.getOutputStream();

        Thread t = new Thread(new Runnable() {

            public void run() {

            try {

                while(true) {

                    System.out.println("[Enter your message]");

                    byte[] by = new byte[4096];
        
                    Scanner scan = new Scanner(System.in);

                    String mess = null;

                    if(scan.hasNext()) {

                        mess = scan.next();
    
                        scan.close();
    
                    }
                    
                    by = mess.getBytes();

                    output.write(by);
            
                    output.flush();

                    byte[] b = new byte[4096];
        
                    int leng;
        
                    StringBuilder sb = new StringBuilder();
        
                    while((leng = input.read(b)) != -1) {
        
                        sb.append(new String(b,0,leng));
        
                        if(new String(b,0,leng).indexOf("\r") >= 0) {

                            break;
        
                        }
        
                        System.out.println(sb.toString().substring(0,sb.toString().length()-4));
        
                        Thread.sleep(1000);
        
                    }
        
                }
         

            } catch (IOException e) {

                e.printStackTrace();

            } catch(Exception e) {

                e.printStackTrace();

            }

        }


        });

        t.start();
        
    }
}

各位博主,请问如何修改以上代码实现消息的多次发送?以上代码发送一次后就不可以发送第二次,望解决。

  • 写回答

1条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-07 17:51
    关注

    引自免费微信小程序:皆我百晓生

    为了实现消息的多次发送,您需要在输入循环里处理多个消息。这里有一个修改后的版本,它将读取并发送多条消息,直到用户输入"exit"为止:

    import java.io.*;
    import java.net.*;
    import java.util.Scanner;
    
    public class SockClient {
    
        public static void main(String[] args) throws Exception {
    
            Socket socket = new Socket("192.168.159.128", 8888);
    
            InputStream input = socket.getInputStream();
            OutputStream output = socket.getOutputStream();
    
            Thread t = new Thread(() -> {
                try {
                    Scanner scan = new Scanner(System.in);
                    String message;
    
                    while ((message = readMessage(scan)) != "exit") {
                        byte[] bytes = message.getBytes();
    
                        output.write(bytes);
                        output.flush();
    
                        byte[] responseBytes = new byte[4096];
                        int length;
                        StringBuilder response = new StringBuilder();
    
                        while ((length = input.read(responseBytes)) != -1) {
                            response.append(new String(responseBytes, 0, length));
    
                            if (response.toString().endsWith("\r")) {
                                break;
                            }
    
                            System.out.println(response.toString());
                        }
                    }
                    scan.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
    
            t.start();
        }
    
        private static String readMessage(Scanner scanner) {
            System.out.println("[Enter your message or type 'exit' to quit]: ");
            return scanner.nextLine();
        }
    }
    

    这个修改版的代码做了以下几点更改:

    1. 将输入循环移到一个新的方法readMessage()中,这样可以在每次循环时请求新的消息。
    2. 使用while循环读取消息,只要用户输入的不是"exit",就会继续发送消息。
    3. 当收到服务器响应且响应末尾包含\r时,跳出接收循环。
    4. 移除了原始代码中的Thread.sleep(1000),这可能会导致客户端阻塞,等待一秒钟后再打印接收到的消息。现在,消息会立即打印出来。

    现在,您可以运行这个程序,并多次发送消息,直到输入"exit"退出程序。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 7月23日
  • 已采纳回答 7月15日
  • 创建了问题 6月7日

悬赏问题

  • ¥20 双硬盘安装Ubuntu后windows 无法挂载硬盘
  • ¥15 下面求极限的步骤哪里不对,正确答案是a1a2…an
  • ¥15 帮我利用jupyter 运行一个正确的代码
  • ¥15 如何使用Gephi软件和Python包中的GephiStreamer交互
  • ¥15 sqlite加密问题咨询
  • ¥15 appdesigner接收不到udp组播的数据
  • ¥15 verilog 非阻塞赋值下的移位拼接错误
  • ¥100 两个按钮控制一个LED
  • ¥15 用C语言写离散数学相关问题
  • ¥30 如何用python的GephiStreamer连接到gephi中,把Python和Gephi的具体操作过程都展示,重点回答Gephi软件的调试,以及如果代码的端口在浏览器中无法显示怎么处理