gpt4 book ai didi

c - 客户端/服务器程序中的线程

转载 作者:太空狗 更新时间:2023-10-29 15:05:01 25 4
gpt4 key购买 nike

为了上大学,我正在开发本地中继聊天。我必须编写一个聊天服务器和客户端,它们只能在具有线程和 FIFO 的同一台计算机上的不同终端窗口上发送消息。

FIFO 部分我没有问题,线程部分让我有些头疼。

服务器有一个线程用于从 FIFO(所有客户端使用)接收命令,另一个线程用于每个连接的客户端。

对于每个连接的客户端,我需要知道特定的信息。首先,我使用的是全局变量,只要只有一个客户端连接,它就可以工作,这很像聊天,可以单独聊天。

所以,理想情况下,我会有一些数据,例如:

-昵称
-名字
-电子邮件
-等等……

每个连接的客户端。但是,我不知道该怎么做。

我可以创建一个 client_data[MAX_NUMBER_OF_THREADS],其中 client_data 是一个包含我需要访问的所有内容的结构,但这需要在服务器和客户端之间的每次通信中询问数组 client_data 中的客户端 ID这似乎不太实用

我也可以在创建线程后立即实例化一个 client_data,但它只能在那个 block 中可用,这也不是很实用。

如您所见,我在这里需要一些指导。非常感谢任何评论、代码片段或任何相关信息的链接。

最佳答案

我不知道你使用的是什么语言,但这里有一些基本的想法:

  • 在一个线程(可能是您的主线程)中启动您的服务器。
  • 服务器的 while 循环将在接受套接字连接时阻塞。
  • 当套接字连接被接受时,它应该产生一个新线程来处理连接。
  • 在新线程中开始与客户沟通。

一个简单的套接字服务器循环看起来像这样(在 Java 中):

while(true){
ClientWorker w;
try{
//server.accept returns a client connection
w = new ClientWorker(server.accept(), textArea);
Thread t = new Thread(w);
t.start();
} catch (IOException e) {
// log the exception or something...
}
}

如果您想知道它的作用 - ClientWorker 可用 here .在 C# 中,如果您正在创建一个 new Thread,请不要忘记将其 IsBackground 属性设置为 true,以便在您的应用程序关闭时关闭该线程向下,即没有挂线。

记住:接受套接字连接或从套接字接收数据通常是阻塞调用,这意味着您的线程将阻塞直到有人连接到套接字或数据通过 socket 。

在 C# 中:

  1. 聊天客户端:http://www.geekpedia.com/tutorial239_Csharp-Chat-Part-1---Building-the-Chat-Client.html
  2. 聊天服务器:http://www.geekpedia.com/tutorial240_Csharp-Chat-Part-2---Building-the-Chat-Server.html
  3. 基本客户端/服务器:http://www.dreamincode.net/forums/topic/33396-basic-clientserver-chat-application-in-c%23/

在 Java 中:

  1. 聊天客户端/服务器:http://pirate.shu.edu/~wachsmut/Teaching/CSAS2214/Virtual/Lectures/chat-client-server.html
  2. Nakov 聊天客户端/服务器:http://inetjava.sourceforge.net/lectures/part1_sockets/InetJava-1.9-Chat-Client-Server-Example.html

在 C++ 中

  1. 代码项目:http://www.codeproject.com/KB/cpp/chat_client_server.aspx
  2. 另一个代码项目 TCP/IP 聊天客户端/服务器:http://www.codeproject.com/KB/IP/ipchat.aspx

更新

不用做全局变量,只需为客户账户定义一个struct 并为每个用户声明一个账户变量...这里是定义账户信息的方法:

struct account {
char nickname[32];
char first_name[32];
char last_name[32];
char e_mail[32];
char password[32];
};

当客户端发送消息时,它应该具有标准格式:FROM|TO|CONTENT

struct message{
char nickname_from[32];
char nickname_to[32]; // optional
char msg_content[256];
};

将每条 消息 放入 fifo [队列],您将获得所有需要的信息来确定是谁发送的。

关于c - 客户端/服务器程序中的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2888244/

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