套接字 readInt 并不总是有效

科西莫·斯关奇

我正在构建一个客户端 - 服务器 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...
用户85421

将 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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

scrollTop()并不总是有效

来自分类Dev

SendKeys并不总是有效

来自分类Dev

QProcess()并不总是有效

来自分类Dev

按钮并不总是有效

来自分类Dev

CellContentClick事件并不总是有效

来自分类Dev

jQuery preventDefault并不总是有效

来自分类Dev

尝试更新DispatcherTimer的间隔,但并不总是有效

来自分类Dev

gulp手表并不总是有效

来自分类Dev

image.convertTo并不总是有效

来自分类Dev

角表并不总是有效

来自分类Dev

Grep:星号(*)并不总是有效

来自分类Dev

Python PyQt信号并不总是有效

来自分类Dev

绑定到窗口标题并不总是有效

来自分类Dev

电子webContents.send并不总是有效

来自分类Dev

Grep:星号(*)并不总是有效

来自分类Dev

CSS规则阴影并不总是有效

来自分类Dev

image.convertTo并不总是有效

来自分类Dev

Vim配色方案并不总是有效

来自分类Dev

$(window).load并不总是有效

来自分类Dev

访问DOM元素并不总是有效-jQuery

来自分类Dev

串行通信 write() 并不总是有效

来自分类Dev

bashrc 音量更改并不总是有效

来自分类Dev

强制下载 csv 文件并不总是有效

来自分类Dev

ajaxStart - 更改显示并不总是有效

来自分类Dev

为什么连续前瞻并不总是有效

来自分类Dev

大数乘法算法并不总是有效

来自分类Dev

Android FusedLocationProviderClient 并不总是有效

来自分类Dev

使用 ssl 重定向并不总是有效

来自分类Dev

VBA excel 模块并不总是有效