我正在构建一个客户端 - 服务器 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 使用自己的协议来写入/读取 UTF 字符串,不需要使用行终止。
注 2:PrintWriter 的方法不会抛出 I/O 异常,您必须检查调用checkError
(可能不是这里的问题)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句