java.net.Socket 线程"main"异常异常:连接重置 -



我创建了一个简单的客户端/服务器程序,其中客户端从命令行参数获取文件。然后,客户端将文件发送到服务器,在那里使用 GZIP 压缩文件并发送回客户端。

首先运行时的服务器程序很好,并且没有产生任何错误,但是在运行客户端后,我收到错误。

我收到一个错误,说连接已重置,并且我已经尝试了许多不同的端口,所以我想知道我的代码或关闭流的时间是否有问题?

任何帮助将不胜感激!

编辑 - 对两个程序进行了更改。

客户:

import java.io.*;
import java.net.*;
//JZip Client
public class NetZip {
    //Declaring private variables.
    private Socket socket = null;
    private static String fileName = null;
    private File file = null;
    private File newFile = null;
    private DataInputStream fileIn = null;
    private DataInputStream dataIn = null;
    private DataOutputStream dataOut = null;
    private DataOutputStream fileOut = null;

    public static void main(String[] args) throws IOException {
    try {
        fileName = args[0];
        }
    catch (ArrayIndexOutOfBoundsException error) {
        System.out.println("Please Enter a Filename!");
    }
    NetZip x = new NetZip();
    x.toServer();
    x.fromServer();
    }
    public void toServer() throws IOException{
    while (true){
    //Creating socket
       socket = new Socket("localhost", 4567);
       file = new File(fileName);
       //Creating stream to read from file.
       fileIn = new DataInputStream(
           new BufferedInputStream(
               new FileInputStream(
                   file)));
       //Creating stream to write to socket.
       dataOut = new DataOutputStream(
           new BufferedOutputStream(
               socket.getOutputStream()));
       byte[] buffer = new byte[1024];
           int len;
           //While there is data to be read, write to socket.
        while((len = fileIn.read(buffer)) != -1){
            try{
            System.out.println("Attempting to Write " + file
                + "to server.");
            dataOut.write(buffer, 0, len);
            }
            catch(IOException e){
            System.out.println("Cannot Write File!");
            }
           } 
        fileIn.close();
        dataOut.flush();
        dataOut.close();
        }
    }
  //Read data from the serversocket, and write to new .gz file.
    public void fromServer() throws IOException{
    dataIn = new DataInputStream(
           new BufferedInputStream(
                   socket.getInputStream()));
    fileOut = new DataOutputStream(
           new BufferedOutputStream(
               new FileOutputStream(
                   newFile)));
    byte[] buffer = new byte[1024];
        int len;
        while((len = dataIn.read(buffer)) != -1){
            try {
            System.out.println("Attempting to retrieve file..");
            fileOut.write(buffer, 0, len);
            newFile = new File(file +".gz");
            }
            catch (IOException e ){
            System.out.println("Cannot Recieve File");
            }
        } 
        dataIn.close();
        fileOut.flush();
        fileOut.close();
        socket.close();
    }

}

服务器:

import java.io.*;
import java.net.*;
import java.util.zip.GZIPOutputStream;
//JZip Server
public class ZipServer {
    private ServerSocket serverSock = null;
    private Socket socket = null;
    private DataOutputStream zipOut = null;
    private DataInputStream dataIn = null;
    public void zipOut() throws IOException {
    //Creating server socket, and accepting from other sockets.
    try{
    serverSock = new ServerSocket(4567);
    socket = serverSock.accept();
    }
    catch(IOException error){
        System.out.println("Error! Cannot create socket on port");
    }
    //Reading Data from socket
    dataIn = new DataInputStream(
           new BufferedInputStream(
                   socket.getInputStream()));
    //Creating output stream.
    zipOut= new DataOutputStream(
        new BufferedOutputStream(
            new GZIPOutputStream(
                socket.getOutputStream())));
    byte[] buffer = new byte[1024];
        int len;
        //While there is data to be read, write to socket.
        while((len = dataIn.read(buffer)) != -1){
            System.out.println("Attempting to Compress " + dataIn
                + "and send to client");
            zipOut.write(buffer, 0, len);
        } 
        dataIn.close();
        zipOut.flush();
        zipOut.close(); 
        serverSock.close();
        socket.close();
    }
    public static void main(String[] args) throws IOException{
    ZipServer run = new ZipServer();
    run.zipOut();
    }
}

错误信息:

Exception in thread "main" java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:196)
    at java.net.SocketInputStream.read(SocketInputStream.java:122)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:275)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:334)
    at java.io.DataInputStream.read(DataInputStream.java:100)
    at ZipServer.<init>(ZipServer.java:38)
    at ZipServer.main(ZipServer.java:49)

首先,发生错误是因为客户端在发送任何数据之前失败并结束,因此服务器想要读取时连接已关闭。
发生此错误的原因是您将 File 对象分配给未使用的局部变量(编译器是否未发出警告?

public File file = null;
public File newFile = null;
public static void main(String[] args) throws IOException {
try {
    String fileName = args[0];
    File file = new File(fileName);
    File newFile = new File(file +".gz");
    } 
catch (ArrayIndexOutOfBoundsException error) {
    System.out.println("Please Enter a Filename!");
}

但是在您的 toServer 方法中,您使用类变量文件作为 FileInputStream 的参数,并且此变量为 null,这会导致结束程序的错误。

其次,如果您完成了对输出流的写入,则应调用

socket.shtdownOutput();

否则,服务器将尝试读取,直到发生超时。

问题是服务器无法下载 apache maven

因此,您可以做的是复制apache maven文件夹并将其粘贴到项目内的包装器文件夹中。

它将手动下载 apache maven,它肯定会工作。

相关内容

  • 没有找到相关文章

最新更新