java - 如何修复 SocketException 连接重置问题?
问题描述
尝试与服务器通信时连接重置。但是客户端执行代码没有任何异常。成功执行客户端后打印终端中的所有字节。但是,在服务器端首先创建了两个连接。实际上我想为服务器和客户端编写一个程序来实现来自客户端的并行连接。为什么 ScocketException:连接重置发生在服务器端?我该如何解决这个问题?
服务器:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.zip.Adler32;
import java.util.zip.CRC32;
import java.util.zip.Checksum;
public class Server {
private static String dir = "E:\\DestinatioFolder\\";
public static void main(String[] args) throws IOException {
ServerSocket servsock = new ServerSocket(5050);
Socket socket = null;
while(true) {
socket = servsock.accept();
System.out.println("New Connection....");
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
DataInputStream dis = new DataInputStream(bis);
Thread t = new ClientHandler(socket, bis, dis);
t.start();
}
}
}
class ClientHandler extends Thread {
final String dir = "E:\\DestinationFolder\\"; // you may change this
final BufferedInputStream bis;
final DataInputStream dis;
final Socket socket;
public ClientHandler(Socket socket, BufferedInputStream bis, DataInputStream dis ) {
this.socket = socket;
this.bis = bis;
this.dis = dis;
}
@Override
public void run() {
try{
long fileLength = dis.readLong();
String fileName = dis.readUTF();
System.out.println("FILE Name: "+fileName);
File file = new File(dir + fileName);
FileOutputStream fos = new FileOutputStream(file);
BufferedOutputStream bos = new BufferedOutputStream(fos);
for(int i=0;i<fileLength; i++) {
int b = bis.read();
bos.write(b);
System.out.println("Byte:"+b);
}
bos.close();
} catch(Exception e){
System.out.println("Server: "+e);
}
}
}
客户:
import java.io.*;
import java.net.Socket;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Client1 {
private static String dir = "E:\\SourceFolder\\";
public static void main(String[] args) throws IOException, InterruptedException {
Socket[] sock = new Socket[5];
for(int i=0;i<2;i++) {
sock[i] = new Socket("localhost",5050);
}
File[] files = new File(dir).listFiles();
sendFile(files,sock);
}
private static void sendFile(File[] files, Socket[] sock) throws InterruptedException, IOException {
for(int i=0;i<2;i++) {
BufferedOutputStream bos = new BufferedOutputStream(
sock[i].getOutputStream());
DataOutputStream dos = new DataOutputStream(bos);
Thread t = new ClientThread(files[i], bos, dos, i);
t.start();
}
}
}
class ClientThread extends Thread {
final BufferedOutputStream bos;
final DataOutputStream dos;
final File file;
final int t;
public ClientThread(File file, BufferedOutputStream bos,
DataOutputStream dos, int t) {
this.dos = dos;
this.bos = bos;
this.file = file;
this.t = t;
}
@Override
public void run() {
try {
long length = file.length();
System.out.println("Thread: "+this.t+ " FILE Length: "+length);
dos.writeLong(length);
String fileName = file.getName();
System.out.println("Thread: "+this.t+ " FILE: "+fileName);
dos.writeUTF(fileName);
FileInputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis);
int b = 0;
while((b = bis.read()) > 0) {
bos.write(b);
System.out.println("Thread: " + this.t + " Byte:"+b);
}
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
解决方案
推荐阅读
- flutter - 来自firebase实时颤动的数据在Tabbar中显示不正确
- reactjs - 反应TypeError:无法读取未定义的属性'id'
- python - QScrollArea:从一个项目滚动到另一个项目
- python - Python结合了两个类
- javascript - Cordova (PhoneGap):如何在运行 cordova run ios 时查看错误或 console.log
- javascript - 在 JavaScript 中调用静态函数?
- c# - Compiler.cs 报告 Dafny 3.0.0 中已验证程序的错误
- android - AAPT:错误:找不到资源 android:attr/android:progressBarStyle
- javascript - 在括号之间声明一个 javascript 对象以仅选择与其索引对应的元素
- reactjs - 为什么 react 函数组件在初始渲染时会执行两次内部代码?