java-通过套接字接收文件,TCP连接冻结
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-通过套接字接收文件,TCP连接冻结,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3870字,纯文字阅读大概需要6分钟。
内容图文
![java-通过套接字接收文件,TCP连接冻结](/upload/InfoBanner/zyjiaocheng/696/8224da524ea84900b1d431331e673d4c.jpg)
我已经在套接字上停留了4h,我使用的方式是只有一个应用程序作为客户端和服务器,一旦客户端连接,它将与新客户端一起打开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;
}
}
服务器支持2条消息,第一条是“列表”,发送一条命令是“获取值”.
如果客户端将请求命令“列表”,它将运行以下命令:
有一个“服务器/客户端”,它正在发送请求并接收一个行字符串,并且它没有任何问题,我正在从服务器接收文件列表.
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”命令收到的字节,您有什么想法吗?
我知道只有“ receve”功能无法正常工作,因为如果我通过telnet登录到应用程序,则可以在控制台中获取文件,但无法达到目标.从cli看屏幕.
解决方法:
您不能在同一套接字上混合使用缓冲和未缓冲的流/读取器/写入器.您将丢失缓冲区中的数据.在套接字的使用寿命内使用相同的流对.在这种情况下,我将使用DataInputStream和DataOutputStream以及消息和文件名的readUTF()/ writeUTF()方法.您还需要在文件之前发送文件长度,除非文件是通过连接发送的最后一件事:否则,对等方将不知道何时停止读取文件并返回并重新开始读取消息.
内容总结
以上是互联网集市为您收集整理的java-通过套接字接收文件,TCP连接冻结全部内容,希望文章能够帮你解决java-通过套接字接收文件,TCP连接冻结所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。