我正在尝试使用Socket实现Server Client应用程序。客户端向服务器请求指定文件,服务器将接受客户端请求并发送客户端请求的文件。但是当我运行我的代码时,我得到了错误"连接由peer重置:socket write error"在服务器端。为什么会这样?我的代码在
之下Server.java
package Client_Server;
import java.net.*;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Server extends Thread {
static Server s;
static ServerSocket ss;
static Socket clientSocket;
public static void main(String[] args) throws IOException {
s = new Server();
ss = new ServerSocket(1122);
while(true) {
System.out.println("waiting for a connection....");
clientSocket = ss.accept();
Thread thread = new Thread(s);
thread.start();
}
}
public void run() {
try {
server();
} catch (IOException ex) {
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void server() throws IOException {
System.out.println("accepted connection :"+clientSocket);
BufferedReader bfr = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String fileName = bfr.readLine();
System.out.println("server side got the file name : "+fileName);
File myFile = new File(fileName);
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(myFile));
OutputStream os = clientSocket.getOutputStream();
DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(clientSocket.getOutputStream()));
byte[] buffer = new byte[clientSocket.getSendBufferSize()];
long expect = myFile.length();
long left = expect;
int inlen = 0;
while (left > 0 && (inlen = bis.read(buffer, 0, (int)Math.min(left, buffer.length))) >= 0) {
dos.write(buffer, 0, inlen);
left -= inlen;
}
dos.flush();
if (left > 0) {
throw new IllegalStateException("We expected " + expect + " bytes but came up short by " + left);
}
if (bis.read() >= 0) {
throw new IllegalStateException("We expected only " + expect + " bytes, but additional data has been added to the file");
}
}
}
Client2.java
package Client_Server;
import static Client_Server.MainServer.sock;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
public class Client2 {
public static void main(String[] args) throws IOException {
File outdir = new File("copiedfiles");
if (!outdir.isDirectory()) {
outdir.mkdirs();
}
String fileName = "som.jpg";
Socket sock = new Socket("localhost", 1122);
System.out.println("connecting.....");
OutputStream os = sock.getOutputStream();
PrintWriter pw = new PrintWriter(os, true);
pw.println(fileName);
DataInputStream clientData = new DataInputStream(new BufferedInputStream(sock.getInputStream()));
OutputStream output = new BufferedOutputStream(new FileOutputStream(new File(outdir, "received_from_client_" + fileName)));
long size = clientData.readLong();
long bytesRemaining = size;
byte[] buffer = new byte[sock.getReceiveBufferSize()];
int bytesRead = 0;
while (bytesRemaining > 0 && (bytesRead = clientData.read(buffer, 0, (int) Math.min(buffer.length, bytesRemaining))) >= 0) {
output.write(buffer, 0, bytesRead);
bytesRemaining -= bytesRead;
}
output.flush();
if (bytesRemaining > 0) {
throw new IllegalStateException("Unable to read entire file, missing " + bytesRemaining + " bytes");
}
if (clientData.read() >= 0) {
throw new IllegalStateException("Unexpected bytes still on the input from the client");
}
}
}
请帮我解决这个问题。 例外是
Exception in thread "main" java.net.SocketException: Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109)
at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
at java.io.BufferedOutputStream.write(BufferedOutputStream.java:122)
at java.io.DataOutputStream.write(DataOutputStream.java:107)
at Client_Server.Server.server(Server.java:54)
at Client_Server.Server.main(Server.java:27)
Java Result: 1