【问题标题】:client/server to send a file get stuck somewhere发送文件的客户端/服务器卡在某处
【发布时间】:2013-11-25 03:08:52
【问题描述】:

我已经实现了一个客户端/服务器来发送文件。当发送文件后没有更多消息交换时,代码工作正常,但是如果客户端在接收文件的代码后直接向服务器发送一些字符串,客户端和服务器都停止做任何事情并且文件没有发送它是什么就像他们俩都陷入僵局但我不太确定:

这是发送文件而不发送任何内容的代码,它有效: 客户

String filename;
BufferedReader UIn = new BufferedReader(new InputStreamReader(System.in));
Socket peer = new Socket("localhost",9999);
System.out.print("Enter the file name to download :");
filename= UIn.readLine();

///////////////////////////////

DataOutputStream OutToServer;
OutToServer = new DataOutputStream(peer.getOutputStream());
OutToServer.writeBytes(filename+"\n");

FileOutputStream fos = new FileOutputStream(new File("D:/new.txt"));
BufferedOutputStream  out = new BufferedOutputStream(fos);
InputStream in = peer.getInputStream();
buffer = new byte[1024];

while((count=in.read(buffer))>0)
{
  fos.write(buffer, 0, count);
  System.out.println(buffer);
}

fos.close();
System.out.println("done");

服务器:

ServerSocket server =null; 
try {
  server = new ServerSocket(9999);
  while(true)
  {
    client= server.accept();
    //System.out.println("Connection accepted");
    BufferedReader inFromClient = new BufferedReader(new InputStreamReader(client.getInputStream()));
    DataOutputStream outToclient =new DataOutputStream(client.getOutputStream());
    String request=inFromClient.readLine();
    file = new File(request);

    if (file.exists())
    {
      OutputStream out = client.getOutputStream();
      BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));

      while((count =in.read(buffer)) >0)
      {
        out.write(buffer,0,count);
        out.flush();
      }
    }

    // System.out.println(request);
    // outToclient.writeBytes("alaa\n");

  }
} catch (IOException ex) {
  Logger.getLogger(ServerWork.class.getName()).log(Level.SEVERE, null, ex);
}

但是,如果我尝试在客户端和服务器之间的循环之后发送任何内容,它就会停止工作。是因为我用的是readLine()writeBytes()吗?

【问题讨论】:

  • 你不应该在这里开玩笑!

标签: java sockets readline


【解决方案1】:

您同时使用DataOutputStream and OutputStream。我认为他们 应该一起工作,但我想你应该做的是 flush 缓冲区(或关闭它)。

在您写完要发送的所有内容后,一些数据可能仍在缓冲区中。现在你必须刷新缓冲区,强制它发送所有数据。(as it is said here)

outToclient.writeBytes("alaa\n");
outToclient.flush();

【讨论】:

  • OutputStream 和 DataOutputStream 都使用有问题吗?
  • @Alaa 在客户端,您使用的是 InputStream,而不是 DataInputStream。因此,您无法在服务器端使用 DataOutputStream 的 writeBytes 方法。然后,您可以尝试找到另一种发送额外消息的方法,只需使用 OutputStream。
  • 那么现在如果我在两边都使用DataOutputStream,问题就解决了吗?非常感谢您帮助我首先了解问题,非常感谢
  • 我不确定,但应该可以。如果它不起作用,请不要忘记flush 缓冲区。无论如何,告诉我们结果。
  • 非常感谢您的帮助 .. 感谢您的笔记,我的所有问题都已解决。谢谢
猜你喜欢
  • 2018-07-23
  • 1970-01-01
  • 2013-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-03
  • 2015-05-02
  • 2023-04-03
相关资源
最近更新 更多