7

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

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

你觉得我有什么不合逻辑的事情吗?就像它试图使用构建的旧 Socket 和 Client 一样,但是如果我进行一些println调用,我可以看到它确实构建了一个新的并且它们位于不同的内存位置。

谢谢!

4

2 回答 2

12

关闭套接字后,您不能重用它来在服务器和客户端类之间共享其他数据。从Java Socket API,关于close()方法的描述:

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

一旦套接字被关闭,它就不能用于进一步的网络使用(即不能重新连接或重新连接)。需要创建一个新的套接字。

关闭此套接字也会关闭套接字的 InputStream 和 OutputStream。

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

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

于 2011-12-11T16:29:15.893 回答
4

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

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

public class Host{
    public static void main(String[] args) throws Exception{
        while(true){
            ServerSocket ss = new ServerSocket(1300);
            Socket s = ss.accept();
            DataInputStream din = new DataInputStream(s.getInputStream());
            String msgin = din.readUTF();
            System.out.println(msgin);
            ss.close();
            s.close();
            din.close();
        }
    }
}

客户端:

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 声明大量的 Socket,因此例如这也可以:

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");
    }
}
于 2016-05-24T22:08:05.630 回答