我已经实现了一个客户端/服务器来发送文件。当发送文件后没有更多的消息交换时,代码工作正常,但如果客户端在接收文件的代码之后直接向服务器发送一些字符串,客户端和服务器都停止做任何事情并且文件没有被发送它的东西就好像他们都陷入僵局但我不确定:
以下是发送文件而不在其后发送任何内容的代码,其工作原理如下: 客户端
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()
?
答案 0 :(得分:1)
您正在使用DataOutputStream and OutputStream。我认为他们
应该一起工作,但我想你应该做的是flush
缓冲区(或关闭它)。
完成编写要发送的所有内容后,某些数据可能仍在缓冲区中。现在您必须刷新缓冲区,强制它发送所有数据。(as it is said here)。
outToclient.writeBytes("alaa\n");
outToclient.flush();