gpt4 book ai didi

java - 通过套接字接收文件,TCP 连接卡住

转载 作者:可可西里 更新时间:2023-11-01 02:44:52 27 4
gpt4 key购买 nike

我已经在套接字上坚持了 4 小时,我使用的方式是只有一个应用程序作为客户端和服务器,一旦客户端连接,它就会用新客户端打开 Theard 并等待消息.

一旦消息发送到服务器,客户端将收到响应,这部分工作没有任何问题。

Theard部分客户:

while (true)
{
InputStreamReader IR = new InputStreamReader(clientSocket.getInputStream());
BufferedReader BR = new BufferedReader(IR);
PrintStream PS = new PrintStream(clientSocket.getOutputStream());
String message = BR.readLine();
if (message != null)
{
System.out.println(clientSocket.getInetAddress() + ":" + clientSocket.getPort() + " has connected."+message);
if (message.equals("exit"))
{
PS.println("Exiting...");
exit();
}
else if (message.equals("list"))
{
getList(PS);
}
else if ((message.contains("get") && (message.contains(",") && (message.contains(" ")))))
{
String[] spliter = message.split(" ");
String[] file = spliter[1].split(",");
String file_name = file[0];
String file_md5 = file[1];
getFile(file_name, file_md5, clientSocket);
}
}
else
{
break;
}

}

服务器支持两种消息,第一种是“list”,发送的命令是“get with values”。

如果客户端请求命令“list”,它将运行:有一个“服务器/客户端”,它正在发送请求并接收一行字符串,它工作正常,我正在从服务器接收文件列表。

PrintStream PS = new PrintStream(clientSocket.getOutputStream());
PS.println("list");
InputStreamReader IR = new InputStreamReader(clientSocket.getInputStream());
BufferedReader BR = new BufferedReader(IR);
String lista_plikow = BR.readLine();
if ( lista_plikow != null)
{
return lista_plikow;
}

但我在使用在 stackoverflow 上找到的代码通过套接字发送文件时遇到问题,但是“接收”不起作用,我的接收函数是循环始终为 0(即使第一个字节长度是正确的),但字节长度是正确的,它正在使用新创建的文件但没有任何反应,该文件始终在使用中,并且有 0 个字节而不是内容PS.println。

PrintStream PS = new PrintStream(clientSocket.getOutputStream());
PS.println("get "+filename+","+file_md5);
int bytesRead;
int current = 0;
FileOutputStream fos = null;
BufferedOutputStream bos = null;
try
{
byte [] mybytearray = new byte [Integer.parseInt(size)];
InputStream is = clientSocket.getInputStream();
fos = new FileOutputStream(filename + ".recived");
bos = new BufferedOutputStream(fos);
bytesRead = is.read(mybytearray,0,mybytearray.length);
current = bytesRead;
System.out.println("X" + bytesRead);
do {
bytesRead =
is.read(mybytearray, current, (mybytearray.length-current));
System.out.println(bytesRead + " = " + current + " " + (mybytearray.length-current));

if(bytesRead >= 0) current += bytesRead;
System.out.println(bytesRead);
} while(bytesRead > -1);
bos.write(mybytearray, 0 , current);
bos.flush();
System.out.println("File " + "recived." +filename.replace(":", " ")
+ " downloaded (" + current + " bytes read)");
}catch (Exception e)
{
System.out.println(e.getMessage());
}

脚本的最后一部分是 "PS.println("get "+filename+","+file_md5);"正在做这个,发送工作正常:

FileInputStream fis = null;
BufferedInputStream bis = null;
OutputStream os = null;

String the_file = TorrentAppGui.folder+"\\"+file_name.replace(":", " ");
File myFile = new File (the_file);
byte [] mybytearray = new byte [(int)myFile.length()];
fis = new FileInputStream(myFile);
bis = new BufferedInputStream(fis);
bis.read(mybytearray,0,mybytearray.length);
os = clientSocket.getOutputStream();
System.out.println("Sending " + the_file + "(" + mybytearray.length + " bytes)");
os.write(mybytearray, 0, mybytearray.length);
os.flush();
System.out.println("Done.");

我不知道为什么我不能保存“get”命令接收到的字节,你有什么想法吗?我知道只有“接收”功能不起作用,因为如果我通过 telnet 访问应用程序,我可以在控制台中获取文件,但它没有达到我的目标。从 cli 查看屏幕。

Connection via telnet is working file

最佳答案

您不能在同一个套接字上混合缓冲和非缓冲流/读取器/写入器。您将丢失缓冲区中的数据。在套接字的生命周期内使用相同的流对。在这种情况下,我将使用 DataInputStreamDataOutputStream,以及用于消息和文件名的 readUTF()/writeUTF() 方法。您还需要在文件之前发送文件长度,除非文件是通过连接发送的最后一件事:否则对等方将不知道何时停止读取文件并返回并再次开始读取消息。

关于java - 通过套接字接收文件,TCP 连接卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34689262/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com