我正在开发一个我正在上课的游戏,它完成了大约99%。但是,我意识到存在一个问题:如果服务器和客户端断开连接,并且客户端尝试重新连接(并且服务器已备份且运行正常),则客户端不会建立新连接。
服务器和客户端都是多线程的。如果我向客户端发送Kick
消息,那么客户端将关闭其套接字。如果我重新连接,即使按下连接,我也会关闭SocketException
:套接字,构建一个新的Client,它基本上只是一个创建套接字并使用get / send线程连接到服务器的类。
你觉得我有什么不合逻辑吗?它就像它试图使用构造的旧Socket和Client,但如果我做了一些println
调用,我可以看到它确实构造了一个新的并且它们位于不同的内存位置。
谢谢!
答案 0 :(得分:8)
关闭套接字后,您无法重复使用它来共享服务器和客户端类之间的其他数据。从Java Socket API,关于close()
方法的说明:
此套接字上的I / O操作中当前阻塞的任何线程都将 抛出一个SocketException。
套接字关闭后,无法继续使用 网络使用(即不能重新连接或反弹)。一个新的插座 需要创建。
关闭此套接字也将关闭套接字的InputStream和 的OutputStream。
如果此套接字具有关联的通道,则关闭该通道 同样。
然后,无法关闭套接字并重新打开。我认为这就是抛出异常的原因。
答案 1 :(得分:2)
这很容易!我制作了这个程序(服务器端):
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声明大量的套接字,所以例如这也适用:
ServerSocket ss = new ServerSocket(1300);
Socket a = ss.accept();
Socket b = ss.accept();
Socket c = ss.accept();
你有3个插座...... 记住:当你声明一个Socket时,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");
}
}