Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何正确关闭套接字,然后重新打开它?_Java_Sockets_Client_Socketexception - Fatal编程技术网

Java 如何正确关闭套接字,然后重新打开它?

Java 如何正确关闭套接字,然后重新打开它?,java,sockets,client,socketexception,Java,Sockets,Client,Socketexception,我正在为我所在的班级开发一个游戏,大约99%完成了。但是,我意识到存在一个问题:如果服务器和客户端断开连接,并且客户端尝试重新连接(并且服务器已备份并正常运行),则客户端不会建立新连接 服务器和客户端都是多线程的。如果我向客户端发送一条Kick消息,则客户端将关闭其套接字。如果我重新连接,我会得到一个SocketException:socket关闭,即使每次按下connect,都会构造一个新的客户端,它基本上只是一个创建套接字并使用get/send线程连接到服务器的类 你认为我做了什么不合逻辑的

我正在为我所在的班级开发一个游戏,大约99%完成了。但是,我意识到存在一个问题:如果服务器和客户端断开连接,并且客户端尝试重新连接(并且服务器已备份并正常运行),则客户端不会建立新连接

服务器和客户端都是多线程的。如果我向客户端发送一条
Kick
消息,则客户端将关闭其套接字。如果我重新连接,我会得到一个
SocketException
:socket关闭,即使每次按下connect,都会构造一个新的客户端,它基本上只是一个创建套接字并使用get/send线程连接到服务器的类

你认为我做了什么不合逻辑的事吗?这就像它试图使用构建的旧套接字和客户端,但是如果我执行一些
println
调用,我可以看到它确实构建了一个新的套接字和客户端,它们位于不同的内存位置


谢谢

关闭套接字后,不能将其重新用于在服务器和客户端类之间共享其他数据。从中,关于
close()
方法的说明:

当前在此套接字上的I/O操作中阻塞的任何线程都将 抛出一个SocketException

一旦插座关闭,就无法进行进一步的操作 网络使用(即无法重新连接或反弹)。新插座 需要创建

关闭此套接字还将关闭套接字的InputStream和 输出流

如果此套接字具有关联的通道,则该通道将关闭 还有


然后,关闭套接字并重新打开它是不可能的。我认为,这就是引发异常的原因。

这很容易!我制作了这个程序(服务器端):

客户端:

import java.net.Socket;
import java.io.DataInputStream;
import java.io.DataOutputStream;

public class Client{
    public static void main(String[] args) throws Exception{
        while(true){
            Socket s = new Socket("localhost", 1300);
            DataOutputStream dout = new DataOutputStream(s.getOutputStream());
            dout.writeUTF("hello");
            s.close();
            dout.close();
        }
    }
}
它是有效的,因为您可以使用相同的ServerSocket声明成吨的套接字,因此,例如,它也有效:

ServerSocket ss = new ServerSocket(1300);
Socket a = ss.accept();
Socket b = ss.accept();
Socket c = ss.accept();
你有3个插座。。。 记住:当您声明套接字时,java会等待客户端连接! 代码:

客户:

import java.net.Socket;

public class client {
    public static void main(String[] args) throws Exception{
        Socket a = new Socket("localhost", 1300);
        Thread.sleep(3000);
        Socket b = new Socket("localhost", 1300);
        Thread.sleep(3000);
        Socket c = new Socket("localhost", 1300);
        Thread.sleep(3000);
        a.close();
        b.close();
        c.close();
    }
}
服务器:

import java.net.ServerSocket;
import java.net.Socket;

public class server {
    public static void main(String[] args) throws Exception{
        ServerSocket ss = new ServerSocket(1300);
        System.err.println("Listening...");
        Socket a = ss.accept();
        System.err.println("1");
        Socket b = ss.accept();
        System.err.println("2");
        Socket c = ss.accept();
        System.err.println("3");
    }
}

检查此问题-->似乎没有帮助。我已经意识到新客户端正在连接,因为如果我使用不同的名称连接,新名称将在发送的数据上实现。我忘了提到,无论出于何种原因,数据都可以正常接收。每当我尝试写入outputstream时,就会出现socketclosed异常。感谢您的输入。我正在构造一个新的套接字,最奇怪的是,在我构造了一个新的套接字之后,如果我在连接后立即向它的outputstream写入一些东西,它就会写入它,我会正确地收到一个响应。但是如果我稍后调用writeObject,它会给出错误@用户1089097对不起,我在看到你的评论后添加了我的问题。这真是个奇怪的问题。可能在写入outputstream之前关闭了服务器套接字。你能在你的问题中贴些代码吗?我已经大致弄清楚问题出在哪里了。聊天室正在发送到错误的客户端--客户端或服务器中没有任何错误。我不知道如何解决这个问题,因为我用客户端构建视图……但至少我知道为什么。谢谢。@user1089097不客气。现在我很高兴你知道问题发生的原因。如果我理解的很好,您正在开发一个简单的聊天应用程序。不久前,我编写了一个像您这样的简单程序,套接字管理并不容易,但是,有了承诺,就有可能解决问题。如果您有疑问,可以在这里询问。;-)我知道程序仍然将新客户端识别为以前断开连接的旧客户端。但如果我看不到一些代码,我会比你更困惑,我无法正确地帮助你!
import java.net.ServerSocket;
import java.net.Socket;

public class server {
    public static void main(String[] args) throws Exception{
        ServerSocket ss = new ServerSocket(1300);
        System.err.println("Listening...");
        Socket a = ss.accept();
        System.err.println("1");
        Socket b = ss.accept();
        System.err.println("2");
        Socket c = ss.accept();
        System.err.println("3");
    }
}