gpt4 book ai didi

java - 套接字 readInt 并不总是有效

转载 作者:行者123 更新时间:2023-11-30 02:35:13 27 4
gpt4 key购买 nike

我正在构建一个客户端-服务器 Java 应用程序。问题是,当我用 writeInt() 发送 Integer 时,有时它会阻塞 readInt()。

客户端

PrintWriter socketOut = new PrintWriter(sock.getOutputStream());
DataOutputStream d = new DataOutputStream(sock.getOutputStream());
String s = "User";
socketOut.println(s);
socketOut.flush();
d.writeInt(data[0]);
d.flush();
d.writeInt(data[1]);
d.flush();

服务器

while(true){
System.out.println("Listening for clients...");
clientSock = serverSock.accept();
Scanner in = new Scanner(clientSock.getInputStream());

String clientType = in.nextLine();

switch(clientType){
case "Resource":
new Thread(new ResourceService(clientSock)).start();
break;
case "User":
new Thread(new UserService(clientSock)).start();
break;
}

}

用户线程

@Override
public void run(){
try{
DataInputStream input = new DataInputStream(user.getInputStream());
int i = 0;
int a = input.readInt(); // Sometimes it blocks here.
int b = input.readInt();
System.out.println(a);
System.out.println(b);
...

我试图根据发送到服务器的第一个字符串来区分客户端。有时服务器会读取 int,有时会阻塞。输出示例如下:

Listening for clients...
Listening for clients...
Listening for clients...
Listening for clients...
Listening for clients...
1 // here the server didn't block
100000
Listening for clients...

最佳答案

将 DataInputStream/DataOutputStream 与 Scanner 和 PrintWriter 混合使用可能不是一个好主意。对于用户交互,更推荐使用Scanner和PrintWriter。

尝试仅使用 DataOutputStream 和 DataInputStream。

客户端

DataOutputStream d = new DataOutputStream(sock.getOutputStream());
String s = "User";
d.writeUTF(s);
d.writeInt(data[0]);
d.flush();
d.writeInt(data[1]);
d.flush();

服务器

DataInputStream input = new DataInputStream(clientSock.getInputStream());
String clientType = input.readUTF();

switch(clientType){
case "Resource":
new Thread(new ResourceService(input)).start();
break;
case "User":
new Thread(new UserService(input)).start();
break;

用户线程

int a = input.readInt();
int b = input.readInt();
System.out.println(a);
System.out.println(b);

注1:DataInputStream/DataOutputStream使用自己的协议(protocol)来写入/读取UTF字符串,无需使用线路终止。

注意2:PrintWriter的方法不会抛出I/O异常,你必须调用checkError进行检查(可能不是这里的问题)。

关于java - 套接字 readInt 并不总是有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43281214/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com