C# tcp/ip通信

关於 2012-11-01 12:32:04
上学的时候有tcp/ip这门课,当时没认真听,也不知道当时考试是怎么做到没挂科的,总之现在对tcp/ip一知半解。
也许在你看来我问的问题很简单,请不要回答让我多看看tcp/ip方面的书,我现在正在看。

问: OP.opSocket.SendData(Encoding.Default.GetBytes("$_f|_")); opSocket这是已建立的连接的对象,加入我开了多个线程多用这个opSocket对象发送数据,假设数据量很大,一个线程是发送图片的数据一个线程是接收文本的数据,那我在接收端接收到的字节可能同时包含图片的字节和文本的字节,这个要怎么区分???????。。。。。。。。。。。。。。。。。。。。。是不是要设计一种数据包接收包头就包含这段数据的信息比如:长度等等,那就算是这样也有问题啊,假设网速特别的慢,慢到每秒只有1bits的情况,同时又两个线程发送数据,其中一个线程发送了一个包头的第一个字节,另一个线程发送了包头的第二个字节,那接收端怎么判断。 ????????????????????????????????????????????????????????????????????????。。。。。。。。。。哎,真后悔当年不认真学tcp/ip...........
...全文
644 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wsxzz_1998 2013-05-17
  • 打赏
  • 举报
回复
好像一般是不会的
关於 2012-11-02
  • 打赏
  • 举报
回复
H_KingSoft :问问,两个线程用的都是同一个socket对象,那么会不会出现一个线程发送了一个数据包的第一个字节就切换到另一个线程,另一个线程发送了一个字节然后又切换。 那这样的话,接收端接收到的数据岂不是,两个数据包的混合,比如:图片的字节本来是这样new byte[]{1,2,3,4,5},文本的字节new byte[]{11,22,33,44,55}一个线程发送文本一个线程发送图片,那这样的话接收到的数据岂不是:1,11,2,33,4,44,5,55. 就算是字节里含有一个写其他信息,像长度类型这样的,但字节被混合了这样怎么区分呢
关於 2012-11-01
  • 打赏
  • 举报
回复
加入【假如】我开了多个线 一个线程是发送图片的数据一个线程是【发送】文本的
错别字 不好意思
KingSoft 2012-11-01
  • 打赏
  • 举报
回复
楼上的头像。。。好邪恶哦。。汗。
是下载积分吗,不知道呢,呵呵,以为是积分就行。下载积分怎么弄?不熟悉
chengmingwei11 2012-11-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

楼主,拜托你快点上线结贴给我积分吧,我等着积分下载东西呢。(挖鼻屎。。)
[/Quote]下载东西好像要下载积分吧.....
KingSoft 2012-11-01
  • 打赏
  • 举报
回复
楼主,拜托你快点上线结贴给我积分吧,我等着积分下载东西呢。(挖鼻屎。。)
KingSoft 2012-11-01
  • 打赏
  • 举报
回复
哇,40分我要了。
你必须要搞清楚的几点:
1、TCP/IP是一种传输协议,Socket是Windows平台上实现这种协议的接口。

2、Sockt只管把数据发送给windows,windows把数据组织成网络数据包格式,并立即或等待空闲时机把数据塞进网卡缓冲区,然后发送出去了。

3、系统组织的数据包格式只适用于传输、路由,而具体内容需要自己的程序识别。

基于你这个问题,你不应该把数据识别与Socket或网络环境的速度混淆而谈,因为你的问题仅仅涉及到数据的识别。而Socket的速度是很快的,事实上Socket也根本速度可说,速度的快慢完全是网络环境所影响。在网络游戏中,人物每点击一次地图上的位置就会发送一个数据包到服务器并返回到客户端,可想而知其速度之快。如果你要一个具体指标,你可以在Dos系统下Ping一个IP端,一般都在30毫秒一次来回,如果是网络游戏的服务器,1毫秒也能达到。

数据识别又叫数据解释,有格式才能解释,给你的数据定义一种格式,这种格式可以区分数据内容。在工业控制系统上,数据格式是必须的,如Modbus协议、CAN、M-Bus等。

有了上面的认识,你就可以想到你的问题的解决方案:

服务器只管把数据发出,图片数据和文字数据一起发,客户端照单全收,当然,接收的时候要堆积起来,直到
接收到结束标记便开始解释你所接收到的所有内容,从中抽取出文字数据、图片数据。
如你的通讯协议格式是这样 Start:SWD:这是我的照片EWD:SPD0x1A0x1B...EPD:End
客户端接收到哪里,下次接收总是在上次接收到的位置开始继续累积,直到收到End标记表示接收完毕。
maomixi 2012-11-01
  • 打赏
  • 举报
回复
你先把自己的协议定义好
lyx266 2012-11-01
  • 打赏
  • 举报
回复
tcp/ip 协议是通过ip+端口号来确定连接的,一个ip:端口 只能有一个连接,所以你多线程也不会有问题.你发送图片的socket不可能把数据发到 接受文件的socket中
Kation 2012-11-01
  • 打赏
  • 举报
回复
不会的。Socket会帮你搞定的
先发送完一个包,才会发第二个包

110,571

社区成员

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

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

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