【问题标题】:why the server socket does not proceed?为什么服务器套接字不进行?
【发布时间】:2012-11-01 13:09:20
【问题描述】:

我的大学工作应用程序..

DOC 转 PDF

==

我的服务器:

每个申请一个线程

        server = new ServerSocket(5000);

        while (true) {
            Socket cliente = server.accept();
            Thread thread = new Thread(new Requisitor(cliente));
            thread.start();
        }

我的班级申请者(运行方法)

@Override
public void run() {
    // receive doc binary
    receive();
    // doc to pdf
    Conversor converson = new Conversor(new File("docs/"+cliente.getInetAddress().getHostAddress()+".doc"),new File("pdfs/"+cliente.getInetAddress().getHostAddress()+".pdf"));
    converson.converter();
    //response pdf binary to client
    response();
}

但是没有调用receive()方法..只有当我断开客户端套接字时。

我的客户端套接字:

    Client cliente = new Client();
    cliente.connect();
    cliente.send(); // send doc binary

    boolean flag = true;

    while (flag) {
        if(!cliente.streamIsEmpty()){ // wait for conversion
            cliente.receive(); // receive pdf
            flag = false;
        }
    }


    cliente.disconect()

我的接收方法

        InputStream in = cliente.getInputStream();
        BufferedInputStream stream = new BufferedInputStream(in);
        FileOutputStream out = new FileOutputStream("docs/"+cliente.getInetAddress().getHostAddress()+".doc");

        byte[] buffer = new byte[1024];
        int length = 0;

        while((length = stream.read(buffer, 0, 1024)) != -1) {
            out.write(buffer, 0, length);
        }

        out.flush();
        stream.close();

有什么想法吗? :(

【问题讨论】:

    标签: java sockets stream


    【解决方案1】:

    您的问题不清楚。看起来您有两种称为接收的方法(一种在客户端,一种在服务器中)。你说“方法 receive() 没有被调用”,但你没有说哪个没有被调用。

    但绝对错误的一件事是:

    boolean flag = true;
    while (flag) {
        if (!cliente.streamIsEmpty()) { // wait for conversion
            cliente.receive(); // receive pdf
            flag = false;
        }
    

    您的代码正忙于等待,这很糟糕。再说了,哪里没必要这么等。只需调用cliente.receive() ...这将阻塞直到有东西到达...或服务器断开连接。

    【讨论】:

      【解决方案2】:

      在此处读取,直到 -1 被读取的流返回。当套接字关闭时会发生这种情况。在写入文档后,尝试在 cliente.send() (而不是整个套接字)中关闭 OutputStream。

          while((length = stream.read(buffer, 0, 1024)) != -1) {
              out.write(buffer, 0, length);
          }
      

      【讨论】:

      • +1 - 如果他的客户端代码没有关闭其输出流,那肯定可以解释问题。
      • 另外,我注意到在等待响应时,你.. cliente.streamIsEmpty()) { // 等待转换 cliente.receive() - 这应该是不必要的。调用 stream.read(buffer) 将阻塞,直到服务器开始发送数据。
      • 关闭输出流也会关闭套接字。没有clos[ing] the OutputStream ... (not the whole socket) 这样的东西。没有答案。
      猜你喜欢
      • 1970-01-01
      • 2019-04-21
      • 2015-01-03
      • 2022-01-05
      • 2013-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      相关资源
      最近更新 更多