tcp协议下socket编程数据包的定义接收和发送

liutao8984908 2010-11-03 10:56:16
最近开始做socket方面的研究,帖子发了一个又一个!问题通过各位高手的帮助也基本解决!首先感谢csdn给我们提供了这个交流平台,其次感谢帮助我的人!
感谢说完开始说正事:原来我的考虑是我只做个服务端程序,利用多线程无论客户端有多少,我都给他分配个线程,也无论你是长连接还是短连接,只要你发送数据我照单全收。。
呵呵~~
不知道我说的对不对,因为还处在测试阶段加上用户数量不能达到很多!所以目前看不出什么毛病!唯一毛病就是只要客户端来个无限发送,cpu使用率马上达到100%!这应该就是缺点了!
于是我想找到解决办法?先说下领导告诉我的方法(也许就是他在误导我),首先他告诉我说客户端不固定,有可能只是一个有可能多个!于是我用的方法是死循环等待客户连接!然后他告诉我说客户端要实时(时时)回传数据,所以我就写了个判断!收到数据回复“收到”,然后客户继续传,客户端的程序是用其他语言来写入信息采集设备中,我还没接触,所以自己模拟的客户端是收到确认继续发。。。这样无限发下去。。我想知道是不是不用这样?我可以控制时间段发送?或是其他方法不立即发送?也就是说长连接没错,但频率不要很快的!
...全文
811 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
liutao8984908 2010-11-06
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 sp1234 的回复:]
引用 14 楼 aofengdaxia 的回复:
接受数据使用一个线程足矣。如果每个客户端一个线程的话,自然是不行的,CPU过高,运行效率过低。为什么要开多个线程呢?
使用一个线程,每个客户端数据中格式化下,在头部加上自己的标号即可。或者根据ip过来。
QQ的是定时通信,比如说:3秒钟通信一次,然后没三秒去请求下服务器,问下是否有人发过来信息


服务器经常要并行处理几十个客户会话请求……
[/Quote]
看了你的回复我有种豁然开朗的感觉!确实是在网上学那种一对一的误导了我!如果是每一个客户请求我就给分配一个线程确实浪费资源效率低,而每当有一个客户请求就把这个请求扔进线程池是不是就好点了?
“ThreadPool类会在线程的托管池中重用已有的线程,使用完线程后,线程就会返回线程池,供以后使用;”这句话是刚查的!不知道是不是解决了多余线程的问题?
至于你说的一个线程保持1000个socket的方法我真的不太懂!
Kation 2010-11-05
  • 打赏
  • 举报
回复
http://vbnet.5d6d.com/thread-7-1-1.html
异步的Socket,高手做的
不需要进程
全部通过事件完成……
alian_1126 2010-11-05
  • 打赏
  • 举报
回复
帮楼主顶
liutao8984908 2010-11-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zenglizhi1989 的回复:]
你可以试一下线程暂时休眠一下啊,如果只是休眠一分钟,客户端是没有什么感觉的,这样内存就不会消耗的那么大啊
[/Quote]
还有个问题,比如我们上qq,我们登陆账号后,服务端给我们分配了个线程,但是我上了qq以后我不想说话,只是挂着。。但是别人还可以和我说话,这个挂号时用的什么原理?是sleep吗?要是的话我要怎么控制这个时间呢?因为我也不知道我什么时候有事要说!就是我想让线程休眠,但是还不想他浪费资源!
p332718873 2010-11-05
  • 打赏
  • 举报
回复
很感兴趣,参考参考!
zy7866zhou473 2010-11-05
  • 打赏
  • 举报
回复
我是菜鸟围观一下
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 aofengdaxia 的回复:]
QQ的是定时通信,比如说:3秒钟通信一次,然后没三秒去请求下服务器,问下是否有人发过来信息[/Quote]

那么QQ通信就会是“一抖一抖”的,即使是在局域网上也要延迟至少3秒,而不是即时通信了。

用轮询数据库的思路可以作为确立业务逻辑的最初手段,但是绝非产品化解决方案的最低标准。最低标准也是一些消息从服务器及时通知到客户端。
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 aofengdaxia 的回复:]
接受数据使用一个线程足矣。如果每个客户端一个线程的话,自然是不行的,CPU过高,运行效率过低。为什么要开多个线程呢?
使用一个线程,每个客户端数据中格式化下,在头部加上自己的标号即可。或者根据ip过来。
QQ的是定时通信,比如说:3秒钟通信一次,然后没三秒去请求下服务器,问下是否有人发过来信息
[/Quote]

服务器经常要并行处理几十个客户会话请求,而不是排队一个一个处理。
aofengdaxia 2010-11-05
  • 打赏
  • 举报
回复
接受数据使用一个线程足矣。如果每个客户端一个线程的话,自然是不行的,CPU过高,运行效率过低。为什么要开多个线程呢?
使用一个线程,每个客户端数据中格式化下,在头部加上自己的标号即可。或者根据ip过来。
QQ的是定时通信,比如说:3秒钟通信一次,然后没三秒去请求下服务器,问下是否有人发过来信息
  • 打赏
  • 举报
回复
再具体一点,当一个socket有数据可以读取,那么.net框架就会使用一个系统线程调用你的回调方法,于是你就可以读取数据、解析数据、返回结果,然后return。

这不是什么你的程序去new一个线程然后循环。假设系统线程池中有1000个线程,其中有50个专门用于通讯,.net框架会自动复用它们来执行你定义的回调方法,然后当执行完方法之后线程被归还到系统线程池,用于其它的异步回调。
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 liutao8984908 的回复:]
还有个问题,比如我们上qq,我们登陆账号后,服务端给我们分配了个线程,但是我上了qq以后我不想说话,只是挂着。。但是别人还可以和我说话,这个挂号时用的什么原理?是sleep吗?要是的话我要怎么控制这个时间呢?因为我也不知道我什么时候有事要说!就是我想让线程休眠,但是还不想他浪费资源![/Quote]
别学网上那种几乎只是一对一的所谓“聊天”程序!那种程序“分配了个线程”是错误的。

如果有1000万用户不定时地访问服务器,往往也只需要几十个线程就足够了。你才有几个CPU?通常每一个CPU使用30或者50个线程足够了,如果线程多了反而浪费大量时间在干线程管理的事情。

保持通讯,就是保持socket对象,即使只有一个线程也不妨碍你的服务器程序保持1000个socket。这可不能变成在一个一个线程中弄了个什么循环。
  • 打赏
  • 举报
回复
你的领导说的很对,一个服务器它可能只有1个客户端,也可能有几亿的客户端(比如网站服务器)。
zhaodongbo567 2010-11-05
  • 打赏
  • 举报
回复
这个CPU使用率 随着时间增加不断的增加 这个应该是 内存没有被释放问题吧 只要在接受的时候释放内存就行了.
zenglizhi1989 2010-11-04
  • 打赏
  • 举报
回复
你可以试一下线程暂时休眠一下啊,如果只是休眠一分钟,客户端是没有什么感觉的,这样内存就不会消耗的那么大啊
liutao8984908 2010-11-04
  • 打赏
  • 举报
回复
高手?没人顶我自己顶。。
liutao8984908 2010-11-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zenglizhi1989 的回复:]
你可以试一下线程暂时休眠一下啊,如果只是休眠一分钟,客户端是没有什么感觉的,这样内存就不会消耗的那么大啊
[/Quote]
呵呵 休眠的问题我现在就是这么做到这个问题解决了!数据包的问题不知道你有没有研究?
liutao8984908 2010-11-03
  • 打赏
  • 举报
回复
上面只是说了接收和发送!那个所谓发送频率如果是客户端控制话就暂时放下,以后学习用,毕竟现在不用我做!然后就是想解决下数据包的定义问题了!我现在模拟做的很简单,字符串写入数组,转码发送!但是看的越多需要掌握的也就越多,首先我想了解下我们传输的数据是什么?就是我们用NetworkStream写入数据流或是用socket.send发送的数据就是数据包?
那所谓的包结构是说自己给自己的数组加上定义吗?比如网上所说的包头包体是自己定义的吧?
数据包嵌套?也就是数组嵌套数组?
呵呵不知道我的理解对不对?

110,500

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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