当前位置: 首页 > 知识库问答 >
问题:

TCP/IP客户端:从服务器读取多个输入流的最佳方式

蔚承天
2023-03-14

我正在创建一个java客户端程序,它向服务器发送一个命令,服务器会发回一个确认和一个响应字符串。

响应以这种方式发回

客户-

服务器-

服务器-

当我尝试读取输入时,我只能读取一个输入流的确认消息

我的客户端程序能够以某种方式读取消息(hacky方法)。要读取输入,我必须使用Bufferedreader读取ack msg。

  1. 此缓冲读取器只能读取ack_msg不能读取以下msg
  2. 需要DataInputstream代码来读取响应msg。
  3. 如果我跳过步骤1,只是使用Datainputstream我不能读取完整的消息。

客户JAVA

try {
            Socket clientSocket = new Socket(SERVER_ADDRESS, TCP_SERVER_PORT);// ip,port

            System.out.println(" client Socket created .. ");
            
            PrintWriter outToServer = new PrintWriter(clientSocket.getOutputStream(), true);

            String ToServer = command;
            outToServer.println(ToServer);

            in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
//          
            // while (!in.ready()) {
            // }
            System.out.println(in.read()); // Read one line and output it

            
            // ===
            byte[] messageByte = new byte[1000];//assuming msg size -need to know eact msg size ?
            boolean end = false;
            String dataString = "";
            int bytesRead = 0;

            try {
                DataInputStream in1 = new DataInputStream(clientSocket.getInputStream());
//
                while (!end) {
                    bytesRead = in1.read(messageByte);
                    dataString += new String(messageByte, 0, bytesRead);
                    if (dataString.length() > 0) {
                        end = true;
                    }
                }
                System.out.println("MESSAGE: " + dataString);
            } catch (Exception e) {
                e.printStackTrace();
            }
            // ===
                
            in.close();             

            clientSocket.close();
            System.out.print("connection closed");

        } catch (Exception e) {
            System.out.print("Whoops! It didn't work!\n");
            e.printStackTrace();
        }

输出

客户端套接字创建...

答复:6

信息:³CO³0Œ

连接已关闭

当我跳过第一步

客户端套接字创建...

留言:-

连接已关闭

如何编写从服务器(msg)读取所有输入的代码

参考了如何在服务器套接字JAVA中读取所有Inputstream

谢啦

共有3个答案

南宫凯康
2023-03-14
InputStream input = null;
OutputStream output = null;

Socket cs = new Socket("LocalHost", 6789);
 input = cs.getInputStream();
output = cs.getOutputStream();
 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(output));

bw.write("Send your String");
bw.flush();

int bytesRead = 0;
byte[] messageByte = new byte[1000];
String dataString = "";

bytesRead = input.read(messageByte);
dataString = new String(messageByte, 0, bytesRead);
仲孙焱
2023-03-14

您不能在同一个基础套接字上同时使用BufferedReader和DataInputStream。您将丢失BufferedReader中的数据。在套接字的生命周期内,对所有内容使用相同的流或读取器。写入器和输出流也是如此。

康泽宇
2023-03-14

这些语句强制在发送至少1个html" target="_blank">字节后立即关闭流。

dataString += new String(messageByte, 0, bytesRead);
if (dataString.length() > 0) {
   end = true;
}

一旦收到ack 6,连接就关闭了。如果忽略ack,响应可能以多个数据包发送,连接将在收到第一个数据包后关闭。

您必须能够确定ack和响应何时结束。

  1. 如果你知道应答和应答中有多少个字符,你可以像你提到的问题一样循环。您将需要一个用于ack的循环和一个用于响应的循环
  2. 如果不知道字符数,则必须查找特殊字符,如行尾或文件结尾,以了解确认行何时结束以及服务器响应何时结束。在每条消息的结尾处寻找一个特殊字符
  3. 第三种可能是等待特定的时间。时间到期后,继续。这在TCP上是不可靠的,因为数据可能会丢失并重新发送。这可能需要比你分配的时间更多的时间来回复。 我同意下面的评论。最初,我犹豫是否要在列表中添加3个。此选项最有可能用于检测通信信道的问题。如果时间到期,那么客户端将放弃一个错误条件,它将不会继续处理,就好像一切正常一样
 类似资料:
  • 我正在创建一个Java客户机程序,它向服务器发送一个命令,然后服务器返回一个确认和一个响应字符串。 响应以这种方式发回 客户端代码 public static void readStream(InputStream in){ 输出 客户端读取的完整响应 谢谢

  • 问题内容: 简单的脚本在这里: a) 不断从套接字读取并将值存储在关联数组中 b) 不断从stdin读取值并响应t / f(如果它们已存在于关联数组中) a和b是随机事件,不以任何方式关联。 诀窍是从两个子流程访问数组(因为将流程放在后台会将其作为子流程生成) 我正在考虑最好的策略,并且出现了一些想法,但是我想知道是否有人有更好的想法: 1) 将输入从套接字重定向到stdin作为子进程,并在一个w

  • 我正在使用TCP / IP流编写客户端服务器Java程序,我的服务器连接到oracle数据库。当客户端请求一些信息时,服务器处理查询,即返回一个包含一些行的列(例如 5)。我想将整列发送回客户端,我能够发送和接收单行数据,但不能发送和接收多行(因为表包含许多行 i,e 行)....任何帮助都是可取的

  • 创建 TCP 客户端 最简单的方法来创建一个 TCP 客户端,使用默认选项如下所示: NetClient client = vertx.createNetClient(); 配置 TCP 客户端 如果你不想使用默认值,则创建TCP 客户端时,通过传入NetClientOptions实例可以配置: NetClientOptions options = new NetClientOptions().s

  • 问题内容: 我要进行最简单的解释。我的Java TCP项目有一个服务器和三个客户端。 服务器具有一个ClientThread。每个客户端都有一个ServerThread和一个UserThread。 工作流程为: 1.客户端(例如,client_0)的UserThread获取用户输入,然后将消息发送到服务器。 2.服务器的ClientThread捕获来自client_0的消息,并将另一条消息发送到另