首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >客户机/服务器程序中的线程

客户机/服务器程序中的线程
EN

Stack Overflow用户
提问于 2010-05-22 21:23:43
回答 2查看 4.6K关注 0票数 5

为了上大学,我正在开发一个本地接力聊天。我必须编程一个聊天服务器和客户端,将只在同一计算机上的线程和FIFO不同的终端窗口发送消息。

FIFO部分我没有问题,线程部分就是让我头疼的部分。

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

对于每个连接的客户端,我需要知道某个特定的信息。首先,我使用了全局变量,只要只有一个客户端连接,这就相当于一个聊天,这样就可以单独聊天。

所以,理想情况下,我应该有一些数据,比如:

-nickname

-name

-email

-etc...

每个已连接的客户端。然而,我不知道该怎么做。

我可以创建一个client_dataMAX_NUMBER_OF_THREADS,其中client_data是一个结构,其中包含我需要访问的所有内容,但这需要在服务器和客户机之间的每次通信中请求数组client_data中客户机的id,这似乎不太实际

我也可以在创建线程后立即实例化client_data,但它只在该块中可用,这也不是很实用。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-05-24 23:14:19

下面是一些几乎可以运行的伪代码。注意,我没有释放我分配的东西,我没有检查错误,我只是试图演示如何将结构传递给线程并使用简单的互斥锁。

有一件事需要注意,线程的函数指针指定了一个void *参数,这个参数可以是任何类型。在线程中,我们假设将线程参数转换为我们定义的要使用的类型是安全的。如果要传递多个可能的类型,则必须小心:)

我不太确定你的程序的结构,或者你是如何处理线程的,但这里有一个简短的与方法无关的例子,告诉你如何将数据传递给线程:

代码语言:javascript
运行
复制
typedef struct client {
    char *firstname;
    char *lastname;
    char *email;
    char *nickname
} client_t;


pthread_mutex_t client_lock = PTHREAD_MUTEX_INITIALIZER;

void *client_thread(void *threadarg)
{
    client_t *client = (client_t *) threadarg;

    pthread_mutex_lock(&client_lock);
    /* read and write to client structure */
    pthread_mutex_unlock(&client_lock);

    /* do some other stuff */
    pthread_exit(NULL);
}

int main(void)
{
    client_t *client;
    pthread_t cthread;

    client = (client_t *)malloc(sizeof(struct client));
    if (client == NULL)
      return 1;

    client->firstname = strdup("Joe Public");
    /* set the rest of the data */

    pthread_create(&cthread, NULL, (void *)client_thread, (void *)client);
    /* join / detach / etc */

    /* Free all the structure members and the structure itself */

   return 0;
}

我很确定这就是你要问的?

票数 1
EN

Stack Overflow用户

发布于 2010-05-23 15:17:24

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

  • 在线程(可能是您的主线程)中启动服务器。
  • 服务器的while循环将在接受套接字时阻塞。套接字连接被接受后,应生成一个新线程来处理与新线程中的客户端进行通信的while。

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

代码语言:javascript
运行
复制
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,这样当你的应用关闭时,线程就会关闭,也就是说,没有挂起的线程。

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

在C#中:

服务器聊天客户端:http://www.geekpedia.com/tutorial239_Csharp-Chat-Part-1---Building-the-Chat-Client.html

  • The Chat

  • http://www.geekpedia.com/tutorial240_Csharp-Chat-Part-2---Building-the-Chat-Server.html

  • A Basic客户端/服务器:http://www.dreamincode.net/forums/topic/33396-basic-clientserver-chat-application-in-c%23/

在Java中:

http://pirate.shu.edu/~wachsmut/Teaching/CSAS2214/Virtual/Lectures/chat-client-server.html

  • Nakov Chat客户端/服务器:http://inetjava.sourceforge.net/lectures/part1_sockets/InetJava-1.9-Chat-Client-Server-Example.html

  1. Chat客户端/服务器

在C++中

代码项目上的

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

更新

不做全局变量,只需为客户端帐户定义一个帐户,并为每个用户声明一个struct变量……下面是如何定义帐户信息的方法:

代码语言:javascript
运行
复制
struct account {
   char nickname[32];
   char first_name[32];
   char last_name[32];
   char e_mail[32];
   char password[32];
};

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

代码语言:javascript
运行
复制
struct message{
   char nickname_from[32];
   char nickname_to[32]; // optional
   char msg_content[256];
};

将每个message放在先进先出队列中,您就有了识别发送它的人所需的所有信息。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2888244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档