Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 套接字readInt不总是工作_Java_Sockets - Fatal编程技术网

Java 套接字readInt不总是工作

Java 套接字readInt不总是工作,java,sockets,Java,Sockets,我正在构建一个客户机-服务器Java应用程序。问题是,当我用writeInt()发送整数时,有时它会阻塞readInt() 客户 PrintWriter socketOut = new PrintWriter(sock.getOutputStream()); DataOutputStream d = new DataOutputStream(sock.getOutputStream()); String s = "User"; socketOut.println(s); socketOut.fl

我正在构建一个客户机-服务器Java应用程序。问题是,当我用writeInt()发送整数时,有时它会阻塞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();
DataOutputStream d = new DataOutputStream(sock.getOutputStream());
String s = "User";
d.writeUTF(s);
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;
       }

    }
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;
用户线程

@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与扫描仪和PrintWriter混合使用可能不是一个好主意。建议更多地使用扫描仪和PrintWriter进行用户交互

尝试只使用DataOutputStream和DataInputStream

客户

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();
DataOutputStream d = new DataOutputStream(sock.getOutputStream());
String s = "User";
d.writeUTF(s);
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;
       }

    }
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
(这里可能不是问题所在)