通过对等方重置连接:套接字写入错误(套接字编程)

时间:2016-10-12 11:37:13

标签: java sockets

我正在尝试使用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

0 个答案:

没有答案