java - 传输文件的 Java 聊天
问题描述
我刚开始学习编程,我想在 java 中创建聊天,你可以在其中发送文件等。当我尝试创建文件传输时,我收到了这个错误
java.net.SocketException: Socket closed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:170)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:161)
at java.io.BufferedReader.readLine(BufferedReader.java:324)
at java.io.BufferedReader.readLine(BufferedReader.java:389)
at lab03.ReadThread.run(ReadThread.java:26)
BUILD STOPPED (total time: 16 seconds)
这是我的客户代码:
Thread socketReader = new ReadThread(socket);
socketReader.start();
Scanner scanner = new Scanner(System.in);
boolean files =false;
String s="";
while(true){
if(files)
{
File file = new File("C:\\Users\\Kostar\\Desktop\\asd.txt");
long length = file.length();
byte[] bytes = new byte[16 * 1024];
InputStream in2 = new FileInputStream(file);
OutputStream out2 = socket.getOutputStream();
int count;
while ((count = in2.read(bytes)) > 0) {
out2.write(bytes, 0, count);
}
out2.close();
in2.close();
files=false;
}
else
{
s=scanner.nextLine();
if(s.startsWith("/sf"))
{
files=true;
out.println(s);
}
else
out.println(s);
}
}
}catch(Exception ex){ex.printStackTrace();}
和 ReadThread:
public ReadThread(Socket socket) throws IOException{
this.socket = socket;
this.in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
this.out = new PrintStream(socket.getOutputStream());
}
String s="";
public void run() {
try{
while(true){
s=in.readLine();
System.out.println(s);
}
}catch(Exception ex){ ex.printStackTrace();
}finally{
Close();
}
}
public void Close(){
try{
in.close();
out.close();
socket.close();
}catch(Exception ex){ ex.printStackTrace();}
}
基本上该文件是在那之后创建的,它具有应具有的所有内容,但是正如您所见,客户端断开连接并且服务器正在接收 NULL。谁能帮我?我知道粘贴代码墙不是很有帮助/很好,但我想我必须这样做
解决方案
问题是您没有检查流的结尾。从套接字读取后,您应该检查您的字符串
- 编辑 -
道歉。上面的建议对于文件读取是正确的,但对于套接字读取是不正确的。对于套接字,您应该专门捕获 SocketException。SocketException 是你的朋友——它是你收到套接字已关闭的通知的方式,它释放了等待输入流的线程。我在下面提供了处理说明。
public void run() {
try{
while(true){
s=in.readLine();
System.out.println(s);
}
} catch (SocketException se) {
//potentially add a logging message that socket (socketnumber) has closed
//socket is closed. You can exit out of the read loop
return;
} catch(IOException ex){ ex.printStackTrace();
}finally{
Close();
}
}
推荐阅读
- java - ArrayUtils 无法解析
- javascript - 如何从 Elasticsearch 查询中的嵌套范围访问父字段?
- scala - 为什么需要模式匹配来保留存在类型信息?
- matlab - Matlab中等效的Excel求解器函数
- android - 类型无效 - 需要一个字符串,react-native 错误
- java - 如何在 spring-boot 2.2.* 中将 @ConfigurationProperties bean 自动连接到 SpEL 表达式中?
- javascript - Javascript 动画计数器不够具体
- python - 如果不存在熊猫,则插入多个列
- c# - TextBlock 绑定在开始时只更新一次
- python - django rest 未显示 API 根中的端点之一