socket服务器端多线程是什么设计思路呢 请指教 多谢

power08111 2010-02-03 12:07:24
我要做一个socket多线程服务端 一般是怎么做的呢
能否详细解释一下 我不明白的有以下几点:

1, server端启动时是否本身就是启动多个线程来监听同一端口还是说server端启动后 如果有客户端连接才启动一个线程跟这个client端通信, 如果两个都可以 那么监听同一端口 他们是怎么做到互斥的

2, server端的线程在获得数据后 如何下发给指定的client端的 会不会有好几个client端发送过来数据,线程在处理后 发送回给client端时出现顺序错误 比如:A client端请求的数据,在多线程server端处理后却发给了B client端,如何保证他们发送的正确呢

3,如果第1个疑问是两个都可以的话 哪个好呢 另一方面 一般server端多线程是怎么做的, client端又是怎么做的 是不是client端也是多线程的呢

4,如果client端时多线程 server端也是多线程的话 那么client端多个线程发送数据给server端 那么server端又是如何保证返回给client端的线程数据顺序肯定是正确的呢

多谢指教 我没做过多线程通信这方面 麻烦说的尽量详细些 最好有linuc c的这方面的例子 万分感谢
...全文
1173 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
DontKissBossAss 2010-02-03
  • 打赏
  • 举报
回复
如果对回答满意,请结贴。。。

睡觉了
DontKissBossAss 2010-02-03
  • 打赏
  • 举报
回复
1: 在没有相关代码的情况下,server 也是在主线程里面实现 会话,接受发送,没有多线程。

2:关键区域枷锁

3:用非阻塞编程的话,如果同在一个聊天室的人多的话,这就需要多线程来处理单一事件了(收信,发信,退出。。。),比如,一个人在1000人的聊天室里面给所有人发个图片,这可能需要当回调函数收到这个消息以后,把这个“图片”交给多个等待(专门)给别人发信的“线程”来处理了。还有一种可能就是同时说话的人很多,这个么,也要在回调得到消息以后,把向任务列表里面添加任务的任务交给等待的多线程了
其他情况下(比如总共5人在线的程序),感觉,不用多线程就能够处理了



4:客户端多线程发信有什么意义?你一个人同时打五句话,自己跟自己玩么?什么?一句话用多个线程发给server?天哪,无语了。
sicxun 2010-02-03
  • 打赏
  • 举报
回复
只有一个线程在监听
收到连接后accept()会返回一个新的socket_id
然后把这个id放到新的线程中去处理
主线程继续监听
power08111 2010-02-03
  • 打赏
  • 举报
回复
还能说的再详细些么 谢谢
olla168 2010-02-03
  • 打赏
  • 举报
回复
路过,学习了
xylicon 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用楼主 power08111 的回复:]
我要做一个socket多线程服务端 一般是怎么做的呢
能否详细解释一下 我不明白的有以下几点:

1, server端启动时是否本身就是启动多个线程来监听同一端口还是说server端启动后 如果有客户端连接才启动一个线程跟这个client端通信, 如果两个都可以 那么监听同一端口 他们是怎么做到互斥的

监听用一个线程就够了,其他的向客户端收发数据才需要多线程。有的时候如果是使用异步,如果数据量不大,甚至不需要用多线程。

2, server端的线程在获得数据后 如何下发给指定的client端的 会不会有好几个client端发送过来数据,线程在处理后 发送回给client端时出现顺序错误 比如:A client端请求的数据,在多线程server端处理后却发给了B client端,如何保证他们发送的正确呢

服务器端要对相应的数据进行保存,并且对应每个客户端保存一个数据,可以用map,key是客户端的socket,value是相应的数据。如果有多个相同的数据分包接收的话,就合并value,等保存完了,或者处理完了,再按照key,找到对呀的client端,发送数据回去。

3,如果第1个疑问是两个都可以的话 哪个好呢 另一方面 一般server端多线程是怎么做的, client端又是怎么做的 是不是client端也是多线程的呢

一般client端不需要多线程。用异步io就可以了。而服务器的多线程,可以做一个线程池。也是线程管理器,对各个任务(一般是IO操作)进行处理。

4,如果client端时多线程 server端也是多线程的话 那么client端多个线程发送数据给server端 那么server端又是如何保证返回给client端的线程数据顺序肯定是正确的呢

如上所述,client端是不需要用多线程的,而TCP连接是能够保证数据顺序的,所以这个不成问题。但要是udp的吧,就够呛,也许需要模仿tcp那样用一个包头标识封包,然后在服务器端那边判断包头顺序处理。服务器那边需要进行保存数据,然后排序处理了。

多谢指教 我没做过多线程通信这方面 麻烦说的尽量详细些 最好有linuc c的这方面的例子 万分感谢
[/Quote]
DontKissBossAss 2010-02-03
  • 打赏
  • 举报
回复
没人评价下啊,别说我误导
DontKissBossAss 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 power08111 的回复:]
还能说的再详细些么 谢谢
[/Quote]
最主要还是楼主自己看书。在不创建多线程的情况下,程序只适用主线程或者说,没有多线程这个概念。
一下缪论在讲述一个聊天室

1: 一般书里讲的,多是阻塞socket,只需要一问一答这种循环就能完成一个简单的网络通信。当然这讲的只是一个原理。这个时候,没有多线程(你根本没有创建线程,只有主线程).楼主会通信,应该知道这点

2:保证顺序正确,需要线程同步。使用锁,临界区。找本多线程的书或者google搜索线程同步。

3:Server多线程的话,我上边说的应该差不多了,比如要是我的话,肯定有3类线程
3.1.1: 主线程
3.1.2: 接受消息线程
3.1.3: 发送消息线程

我肯定有以下数据结构
3.2.1 UI 以及在线socket 队列 //主线程 维护更新
3.2.2 消息队列(这是个桥梁,保存服务器没有传递完的聊天信息任务)//3.1.2 描述的线程操作:recv消息到的时候,往里添加
3.2.3 传递消息 //3.1.3描述的线程完成

PS:我没有做过这么大的项目,只是凭空想象,我甚至不知道这种结构和线程存在到底会不会增加性能。这只是一个假设。我目前的认识内,这是最好的了。。。(悲哀)

4:客户端只是聊天或者发送文件的话,没有多线程必要,甚至,多线程完整这个操作,还可能会降低性能。

高手评价下三。没做过,这设想成立么


69,370

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧