[英]How to restart a serverSocket in java
我試圖添加重新啟動服務器功能,該功能會彈出所有播放器和線程,然后為新播放器啟動新的服務器套接字。 這就是我嘗試過的方法,但是當我重新啟動時,嘗試添加更多他們沒有連接的播放器嗎?
任何幫助都會很棒,謝謝。 或者,有沒有辦法在不關閉套接字的情況下從服務器彈出所有連接?
private volatile ServerSocket ss;
private Socket p1;
private Socket p2;
private GameSession ses;
private ObjectOutputStream top1;
private ObjectOutputStream top2;
public void connectToClient() {
try {
ss = new ServerSocket(8000);
while (true) {
p1 = ss.accept();
top1 = new ObjectOutputStream(p1.getOutputStream());
p2 = ss.accept();
top2 = new ObjectOutputStream(p2.getOutputStream());
see = new GameSession(p1, p2, top1, top2);
new Thread(see).start();
}
} catch (IOException ex) {
System.err.println(ex);
}
}
private void restartServer() {
if (ss.isBound()) {
try {
ss.close();
ss = new ServerSocket(8000);
displayLog.append(new Date() + ": Server started at socket "
+ ss.getLocalPort() + '\n');
} catch (IOException ex) {
System.err.println(ex);
}
}
}
您的restartServer
方法不包含任何啟動新游戲的功能。 它所做的只是創建一個不執行任何操作的新ServerSocket
。 close
后,無需實例化新的ServerSocket
,而是調用connectToClient
。
private void restartServer() {
if (ss.isBound()) {
try {
ss.close();
connectToClient();
displayLog.append(new Date() + ": Server started at socket "
+ ss.getLocalPort() + '\n');
} catch (IOException ex) {
System.err.println(ex);
}
}
}
重新啟動ServerSocket
應該可以。 我假設您在與connectToClient
不同的線程中調用restartServer
? 另外ServerSocker
應該是volatile
。
關閉ServerSocket並創建一個新的容器並不能完成任何有用的工作。 這樣做的唯一作用是導致掛起的,不可接受的連接丟失。 刪除它。
您必須關閉可接受的套接字,並使客戶端通過嘗試重新連接對此作出反應。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.