在Java中接收套接字错误

在Java中接收套接字错误,java,multithreading,sockets,proxy,Java,Multithreading,Sockets,Proxy,我在Java中收到套接字错误,它每次都用不同的代理连接到套接字,并返回一个错误,我检查了代理,所以它们没有死。我不确定这是什么原因造成的 以下是主要功能 public static Socket proxiedSocket(String[] con, String[] Prox) { int port = Integer.parseInt(Prox[1]); int chatport = Integer.parseInt(con[1]); InetSocketAddres

我在Java中收到套接字错误,它每次都用不同的代理连接到套接字,并返回一个错误,我检查了代理,所以它们没有死。我不确定这是什么原因造成的

以下是主要功能

public static Socket proxiedSocket(String[] con, String[] Prox)
{
    int port = Integer.parseInt(Prox[1]);
    int chatport = Integer.parseInt(con[1]);
    InetSocketAddress SOCKS = new InetSocketAddress(Prox[0], port);
    Proxy proxy = new Proxy(Proxy.Type.SOCKS, SOCKS);
    Socket socket = new Socket(proxy);
    InetSocketAddress inet = new InetSocketAddress(con[0], chatport);
    try
    {
        socket.connect(inet, 7000); // 5 Second Timeout
    }
    catch(SocketTimeoutException e)
    {
        log("Could not connect connect to socket! Reason: timed out!");
        try
        {
            socket.close();
        }
        catch(Exception ee) { log("Could not close socket!"); }
    }
    catch(IOException e)
    {
        log(e.getMessage());
        return socket;
    }
    return socket;
}

public static void send(Socket socket, String data)
{
    try
    {
        DataOutputStream dOut = new DataOutputStream(socket.getOutputStream());

        // Send first message
        dOut.writeByte(1);
        dOut.writeUTF(data);
        dOut.flush(); // Send off the data

        // Send the exit message
        dOut.writeByte(EOF);
        dOut.flush();
        dOut.close();
    }
    catch (Exception e)
    {
        log("Error sending data to server: " + e.getMessage());
    }
}

public static String read(Socket socket)
{
    try
    {
        int b;
        ByteArrayOutputStream ba = new ByteArrayOutputStream(200);
        InputStream reader = socket.getInputStream();
        String packet = "";
        while((b = reader.read()) > 0)
        {
            ba.write(b);
        }
        if(b == -1)
        {
            ba.close();
            return "False";
        }
        packet = ba.toString("UTF-8");
        ba.flush();
        ba.close();
        return packet;
    }
    catch(Exception e)
    {
        log("Error while reading from server: " + e.getMessage());
        return "False"; 
    }
}
顺便说一下,这是多线程

因此,在每个线程调用这个之后:Socket Socket=core.proxiedSocketthis.chatcon,this.proxy

这些是我犯的错误

从服务器读取时出错:套接字已关闭

来自SOCKS服务器的错误回复

连接被拒绝:连接

向服务器发送数据时出错:套接字未连接

从服务器读取时出错:套接字未连接

连接重置

连接超时

提前感谢,如果有不清楚的地方,请在评论中注明

插座已关闭

您关闭了插座并继续使用它

来自SOCKS服务器的错误回复

您连接的可能不是SOCKS服务器

拒绝连接

目标IP:端口上没有侦听内容

插座未连接

你没有连接插座

连接重置

造成这种情况的原因很多,但最常见的是将数据发送到已被对等方关闭的连接。换句话说,应用程序协议错误

连接超时

可能是防火墙阻止您连接到目标


其中几个错误的原因是您正在接受异常并返回套接字。不要这样写代码。让调用方处理异常。不要返回不可用的套接字。

因此,与其在返回套接字的函数中执行try catch,不如执行try{call to function}catch?我不明白“让调用方处理异常”可能意味着什么。在某些情况下,在您退出此代码之前,套接字已经被终止。例如,连接超时:套接字未连接,您关闭了它,但仍然返回它。。。如果我只使用工作的,它们肯定不会全都死。。它一定是因为代码中的错误而被杀死了,因为我在读取/发送后打印状态,它说它是活动的。。。