gpt4 book ai didi

Java线程: How to find the right place in code to create a new thread for a program that allows multiple clients to connect to the server

转载 作者:太空宇宙 更新时间:2023-11-04 11:33:49 24 4
gpt4 key购买 nike

我正在创建两个程序文件(一个客户端一个服务器)。客户端代码必须能够创建多个客户端来连接到服务器(只有一台服务器,可以有多个和/或无限数量的客户端)。必须为连接到服务器的每个客户端创建一个新线程。创建客户端的方法是打开一个新的命令提示符/mac终端窗口并运行客户端文件。一旦客户端连接上,它就可以向服务器发送消息。它还将从服务器接收从其他连接的客户端发送的所有消息。

我们现在将重点关注客户端代码。 (还没有服务器代码)

在下面的代码中有两个地方我创建了新线程,我不确定它应该位于哪个地方,因为我在eclipse中运行程序时没有错误。

import java.io.*;
import java.net.*;
import java.util.*;
import static java.nio.charset.StandardCharsets.*;
public class ChatClient
{
private static Socket Socket;
static int numberOfClients = 0;
public static void main(String args[])
{


//If I wanted to create multiple clients, would this code go here? OR should the new thread creation be outside the while(true) loop?
while (true)
{
try
{
String host = "localhost";
InetAddress address = InetAddress.getByName(host);
numberOfClients += 1;
Thread ChatClient1 = new Thread ()
{
public void run()
{
ServerSocket serverSocket = null;
Socket socket = null;
try
{
int numberofmessages = 0;
String[] messagessentbyotherclients = null;
System.out.println("Try block begins..");
System.out.println("Chat client is running");
String port_number1= args[0];
System.out.println("Port number is: " + port_number1);
int port = Integer.valueOf(port_number1);
System.out.println("Listening for connections..");
System.out.println( "Listening on port: " + port_number1 );
serverSocket = new ServerSocket(port);
for(int i = 0; i < numberOfClients; i++)
{
System.out.println(messagessentbyotherclients);
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
};
ChatClient1.start();
}
catch (IOException e)
{
System.out.println("I/O error: " + e);
}
}
}

}我的问题是:线程应该在 main 函数下面还是在 while(true) 循环内部创建? (while true循环最终会被标准输入中的控制D退出)

最佳答案

您的代码距离可行的解决方案还很远,我认为此时对其进行评论对您没有帮助。正如评论中的人们已经解释的那样,您应该有 2 个用于客户端和服务器的可执行文件。您现在要做的就是在内循环中生成服务器线程,而不会创建多个连接到同一服务器的客户端。

编写每个客户端使用一个线程的多线程客户端/服务器应用程序的常用方法是编写一个服务器可执行文件,它打开一个 ServerSocket,它接受并生成一个新的Thread来循环处理客户端套接字。

然后编写一个客户端可执行文件,它使用Socket连接到服务器(在用于生成服务器的端口上),并与服务器对话。

可以使用从连接两端的套接字获得的输入/输出流来完成通信。

这看起来很像家庭作业,因此我不会提供工作代码,但您可以尝试按照以下步骤操作:

  • 创建两个类,每个类都有一个主方法
  • 在一个类中创建一个 Socket,它调用 connect 来连接服务器。尝试从客户端发送尽可能简单的消息,例如包含“hello world”的行。 PrintWriter 可以例如用于将套接字的 OutputStream 包装在更方便的接口(interface)中。
  • 在另一个类中创建一个 ServerSocket 并在循环中调用 accept,将返回的 Socket 交给新的 Thread,该线程循环处理来自客户端的输入,直到从客户端收到终止信号或关闭连接 (IOException)。您可以通过将 InputStream 包装在 BufferedReader 中并仅打印客户端发送的内容来开始逐行读取。
  • 通过发送/接收响应确保通信双向进行(服务器将响应写入与客户端关联的套接字的 OutputStream,客户端读取其套接字的 InputStream)
  • 通过连接实现应用程序的协议(protocol)

完成后,首先启动服务器,然后根据需要运行任意数量的客户端。需要首先启动服务器,因为 connect 调用将在内部打开一个连接,只有当服务器正在监听客户端连接的端口时,该连接才能完成。如果线程对您来说很复杂,请尝试编写一个仅接受连接的服务器,然后从中读取一行,并在添加线程逻辑之前关闭它。从您的代码来看,在我看来您似乎没有完全理解客户端/服务器连接的工作原理。现在你甚至不能有一个客户端,因为 - 抛开所有其他问题 - 你既不调用 accept 也不调用 connect

关于Java线程: How to find the right place in code to create a new thread for a program that allows multiple clients to connect to the server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43500676/

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