gpt4 book ai didi

java ;试图建立一个接受多个客户端连接的服务器

转载 作者:行者123 更新时间:2023-11-30 04:52:25 25 4
gpt4 key购买 nike

我最近开始尝试建立服务器-客户端连接。我能够毫无问题地建立一对一连接,但现在我正在尝试创建一个接受多个客户端的服务器,但我遇到了一个问题,即我无法让服务器在有连接的情况下监听连接一个已建立...我不确定我是否说清楚了,但这是我的代码:

-等待连接的主循环:

public class ChatMultiServer {

public static void main(String []args){

int socknum = 124;
ServerSocket serverSocket;
Socket clientSocket;

while(true){

////opens socket
try{
System.out.println("Opening port...");
new ServerSocket(124).close();
serverSocket = new ServerSocket(socknum);
}catch(Exception e){System.out.println("Error 101 = failed to bind to port "+socknum+"."); break;}
//////accepts connection
try{
System.out.println("Waiting for connections...");
clientSocket = serverSocket.accept();
}catch(Exception e){System.out.println("Error 102 = failed to accept port "+socknum+"."); break;}
/////
try{
System.out.println("Initializing thread...");
new Thread(new CMSThread(clientSocket));
}catch(Exception e){System.out.println("Error 103 = failed to create thread."); break;}
try{
serverSocket.close();
}catch(Exception e){System.out.println("Error 105 = failed to close socket.");}
}
}

}

-处理连接的线程:

public class CMSThread extends Thread{
Socket socket;
BufferedReader in;
PrintWriter out;
String username;
char EOF = (char)0x00;
public CMSThread(Socket s){
socket = s;
run();
}
public void run(){
try{
System.out.println("Setting up streams...");
in = (new BufferedReader(new InputStreamReader(socket.getInputStream())));
out = new PrintWriter(socket.getOutputStream());
}catch(Exception e){System.out.println("Error 204 = failed to get streams");}
try{
out.print("Welcome! you can quit at any tyme by writing EXIT.\nLet me introduce myself, I'm 'testprogram 1', but that doesn't really matter since you'll do the talking.\nWhat's your name?"+EOF);
out.flush();
username = in.readLine();
out.print("<b>"+username+"</b>, that's a nice name.\nWell, i'll shut up now. Have fun talking to yourself while whoever is running the server observes your conversation.\n"+EOF);
out.flush();
}catch(Exception e){System.out.println("Are you effin kidding me!? -.- whatever... Error 666 = failed to chat.");}
}

}

我的问题再次是,当服务器与客户端建立连接时(我为客户端使用 ActionScript 只是因为它更容易制作 GUI),它只是等待线程运行完毕才能启动再次循环。我试图让它在线程处理聊天的同时循环。

我在想也许我需要为循环创建一个线程以及用于处理连接的线程,但我不确定我将如何去做......请告诉我如果我的假设在某种程度上是正确的,如果是的话,对答案的一些指导会很好。

PS:如果我的代码有点乱或者这是一个愚蠢的问题,我很抱歉,我已经有一段时间没有编写java程序了......

最佳答案

您实际上并没有启动新线程 - 您只是直接调用 run()。据我所知,这意味着您将在创建每个 CMSThread 对象的主线程中执行 run() 。

要启动线程,您必须调用thread.start()

另外,我不确定为什么您将 CMSThread 包装在另一个线程中 - CMSThread 扩展了 Thread,以便它可以以自己的方式启动。包装线程也没有启动。

所以你需要:

        new CMSThread(clientSocket).start();

并从 CMSThread 的构造函数中删除 run() 调用

关于 java ;试图建立一个接受多个客户端连接的服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9549764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com