【问题标题】:Java server program doesn't accept the input from client at second run of clientJava 服务器程序在客户端第二次运行时不接受来自客户端的输入
【发布时间】:2013-05-26 14:08:40
【问题描述】:

我用 Java 编写了一个小型客户端服务器程序。服务器在某个端口上创建一个ServerSocket 并继续监听它。 Client 向该服务器发送一些示例信息。 当我运行Client 第一次连接被服务器接受并且信息由服务器打印。然后Client 程序退出。当我再次运行Client 时,连接被接受,但是没有打印数据。 请检查以下代码。

服务器程序

package javadaemon;

import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class MyDaemon {
    public static void main(String [] args) throws IOException {
            ServerSocket ss = new ServerSocket(9879);
            ss.setSoTimeout(0);
        while(true) {
            Socket s = ss.accept();
            System.out.println("socket is connected? "+s.isConnected());
            DataInputStream dis = new DataInputStream(s.getInputStream());
            System.out.println("Input stream has "+dis.available()+" bytes available");
            while(dis.available() > 0) {
                System.out.println(dis.readByte());
            }
        }
    }
}

客户计划

package javadaemon;

import java.io.*;
import java.net.Socket;

public class Client {
public static void main(String [] args) {
    try {
        System.out.println("Connecting to " + "127.0.0.1"
                            + " on port " + 9879);
        Socket client = new Socket("127.0.0.1", 9879);
        System.out.println("Just connected to "
                    + client.getRemoteSocketAddress());
        OutputStream outToServer = client.getOutputStream();
        DataOutputStream out = new DataOutputStream(outToServer);

        for(int i=0; i<100; i++ ) {
            out.writeUTF("Syn "+i);
        }

    } catch(IOException e) {
    }
}
}

请帮我找出下一次服务器没有收到数据的原因。

【问题讨论】:

  • 在 for 循环之后调用 out.flush()out.close()
  • 避免使用空的 catch 块,它们破坏了异常处理的目的
  • 顺便说一下,当你的程序不能正常工作并且你想调试它时,吃异常并没有任何好处。

标签: java sockets serversocket


【解决方案1】:

原因是在服务器端接收数据之前,客户端已经退出,我只是调试它。 (无法解释为什么它第一次起作用。) 只需像下面这样更改您的代码,它就可以工作了。

package javadaemon;

import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;



public class MyDaemon {
    public static void main(String [] args) throws IOException {
            ServerSocket ss = new ServerSocket(9879);
            ss.setSoTimeout(0);
        while(true) {
            Socket s = ss.accept();
            System.out.println("socket is connected? "+s.isConnected());
            DataInputStream dis = new DataInputStream(s.getInputStream());
            System.out.println("Input stream has "+dis.available()+" bytes available");
            while(true) {
                try {
                    System.out.println(dis.readByte());
                } catch (Exception e) {
                    break;
                }
            }
        }
    }
}

客户端必须在退出前添加flush,

package javadaemon;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

public class Client {
public static void main(String [] args) {
    try {
        System.out.println("Connecting to " + "127.0.0.1"
                            + " on port " + 9879);
        Socket client = new Socket("127.0.0.1", 9879);
        System.out.println("Just connected to "
                    + client.getRemoteSocketAddress());
        OutputStream outToServer = client.getOutputStream();
        DataOutputStream out = new DataOutputStream(outToServer);

        for(int i=0; i<100; i++ ) {
            out.writeUTF("Syn "+i);
        }
        out.flush();
        try {
             Thread.sleep(1000L);
        } catch (InterruptedException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
    } catch(IOException e) {
        e.printStackTrace();
    }
}
}

【讨论】:

  • 我从像stackoverflow.com/questions/11982693/… 这样的其他几个来源看到,DataInputStream 的 .available() 方法在与套接字一起使用时不可靠。也许这就是导致问题的原因
  • 他不是flushing 流和closing client 套接字。那是他的问题。
【解决方案2】:

放置Client 程序中for 循环之后:

out.flush();
out.close();
client.close();

您需要flush 您的 以便向前推送数据并清理流。此外,您需要close 您的客户端套接字

我刚刚测试这个成功了。

【讨论】:

    猜你喜欢
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 2015-06-13
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多