java - 通过 java 套接字发送文件详细信息失败

标签 java sockets

下面的代码是更大尝试的一部分;它尝试在服务器和客户端之间传输文件的详细信息,但惨败。服务器向套接字写入 3 个元素,客户端应该接收相同的 3 个元素。客户端在读取第一个元素后阻塞。我做错了什么?!?

public class SocketIssues {

    static void client() throws Exception {

        new Thread() {

            @Override
            public void run() {

                try {
                    Thread.sleep(1000); // enough time for server to open its socket
                    Socket s = new Socket("localhost", 50001);

                    final DataInputStream dis = new DataInputStream(s.getInputStream());
                    final BufferedReader in = new BufferedReader(new InputStreamReader(dis));
                    System.out.println("CLIENT STARTED");
                    System.out.println("Operation: " + in.readLine());
                    System.out.println("Length: " + dis.readLong());
                    System.out.println("Name: " + dis.readUTF());
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }

        }.start();

    }

    static void server() throws Exception {

        ServerSocket ss = new ServerSocket(50001);
        Socket s = ss.accept();
        System.out.println("SERVER: client connected");
        DataOutputStream dos = new DataOutputStream(s.getOutputStream());
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(dos));
        long l = 2194;
        String nume = "The file name";

        out.write("FILE1" + System.lineSeparator());
        out.flush();
        dos.writeLong(l);
        dos.flush();
        dos.writeUTF(nume);
        dos.flush();
        System.out.println("SERVER: done sending" + System.lineSeparator());
    }

    public static void main(String[] args) throws Exception {
        client();
        server();

    }
}

最佳答案

尝试仅使用DataOutputStream,而不是在数据和缓冲写入器之间混合它们,并使用读/写 UTF() 方法,就像您已经对最后一个对象所做的那样:

    DataOutputStream dos = new DataOutputStream(s.getOutputStream());
    long l = 2194;
    String nume = "The file name";

    dos.writeUTF("FILE1");
    dos.flush();
    dos.writeLong(l);
    dos.flush();
    dos.writeUTF(nume);
    dos.flush();
    System.out.println("SERVER: fisier trimis" + System.lineSeparator());

然后在客户端:

                final DataInputStream dis = new DataInputStream(s.getInputStream());
                System.out.println("CLIENT STARTED");
                System.out.println("Operation: " + dis.readUTF());
                System.out.println("Length: " + dis.readLong());
                System.out.println("Name: " + dis.readUTF());

本质上,有两层缓冲正在进行。当您从 BufferedReader 调用 readLine() 时,它可能会继续从底层流中窃取更多字节,因为这就是它应该做的事情。然后,当您返回 DataInputStream 并尝试读取对象时,前导码消失了(BufferedReader 窃取了它),并且它将阻塞等待它,即使流中有字节。

关于java - 通过 java 套接字发送文件详细信息失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20253354/

相关文章:

java - JMX本地监控的访问控制

python - 从 Socket.File.Read 部分读取

javascript - 如何从虚拟专用服务器检索文本文件?

c - 如何在流中部分发送文本文件?

java - Android 上的批量/通配 rune 件删除

java - 如何从弹性负载均衡器中分离实例?

java - C++ 程序员是否模拟 Java 的特性?

java - 使用扩展类时不调用 JAXB afterUnmarshall

sockets - 二郎打开 socket 还是知道的

php:如何保存客户端套接字(未关闭),以便进一步的脚本可以检索它以发送答案?