常见问题。你在读一行,但你没有写一行。在发送的消息中添加一个行终止符。
我正在尝试进行视频文件传输,但在让服务器开始发送字节时遇到问题。
第一步是客户端连接,套接字被接受。然后客户端发送视频文件名,但服务器从不读取该名称。
这是服务器的代码,直到它被阻止:
try(ServerSocket serverSocket = new ServerSocket(4005))
{
Socket socket = serverSocket.accept();
System.out.println("accepted");
OutputStream os = socket.getOutputStream();
BufferedReader receiveReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println("This gets printed");
String request = receiveReader.readLine();//never passes this line
System.out.println("This doesn't get printed");
这是客户端,直到它阻止等待服务器发送视频字节:
try(Socket socket = new Socket(IPAddress, 4005))
{
byte[] messageBytes = new byte[10000];
DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());
outputStream.writeBytes("REQUEST;"+videoPath);//This is the line that should send the bytes for the server to read, so it won't block.
String home = System.getProperty("user.home");
String path = home+"\Downloads" + videoName;
path = path.trim();
FileOutputStream fos = new FileOutputStream(path);
BufferedOutputStream bos = new BufferedOutputStream(fos);
InputStream is = socket.getInputStream();
int bytesRead = 0;
System.out.println("Downloading file...");
while((bytesRead = is.read(messageBytes))!=-1)//This blocks here
服务器究竟为什么不读取服务器发送的"Request" + videoPath
字节?我也试过outputStream.flush()
,运气不好。
当你修复这个问题时,你会发现你不能在同一个套接字上混合缓冲流和读卡器。我建议您通过DataInput/OutputStream
类执行所有I/O,使用read/writeUTF()
作为名称。
如果你发送多个文件,请在那里查看我的答案。