C#如何同时发送图片文字甚至是视频?

liusa1997 2018-12-23 06:36:58
我在写这个时候,先写的是发送文字,发送接收都是netstream.write和netstream.read,但是现在想发送图片,如:****图片***。这种样式,图片是放在对应文字后面读出来自然也是原样读出,思路是:把他们转换成字节流,但是有个问题如何去区分里面到底是图片还是文字?或者说如何无损的把图片文字都读出来?
求代码指教!
...全文
1542 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
良朋 2018-12-27
  • 打赏
  • 举报
回复
这个不难

private void btn_ConvertAndSend_Click(object sender, EventArgs e)
{
//图片转成二进制流
MemoryStream ms = null;
try
{
if (rdo_Text.Checked)
{
byte[] byteImage = new Byte[ms.Length];
byteImage = ms.ToArray(); //发送byteImage
s.Send(byteImage);
}
else
{
Int64 JustTime = DateTime.Now.Ticks / 10000; //long相当于int64
//------------------------
ms = new MemoryStream();
mImage.Save(ms, ImageFormat.Bmp);
long msLength = ms.Length;
s.Send(BitConverter.GetBytes(msLength));
ms.Position = 0;

while (true)
{
byte[] bits = new byte[1024];
//int p =(int)ms.Position;
int r = ms.Read(bits,0, bits.Length);

if (r <= 0)
{
break; //如果从流中读取完毕,则break;
}
s.Send(bits, r, SocketFlags.None);
}
ms.Position = 0;
JustTime = DateTime.Now.Ticks / 10000 - JustTime;
tsl_ProcessTimer2.Text = JustTime.ToString();
}
}
catch (ArgumentNullException ex)
{
throw ex;
}
finally
{
ms.Close();
}
}


这是我之前写的一个测试,简单好用,可以发字符串,也可以发图片,等下我上传到下载资源,你可以去现在,包括了server端和client端。
qq_40108912 2018-12-25
  • 打赏
  • 举报
回复
好腻害,可以教教我嘛
丁劲犇 2018-12-25
  • 打赏
  • 举报
回复
JSON序列化是很不错的选择!
如果你用的是Qt,则可以利用Qt复杂对象的序列化技术了。不管是文本还是图形,全部通吃。不管是文件、TCP还是串口,全部通吃。
https://blog.csdn.net/redpetallsg/article/details/6171019
平底锅锅锅 2018-12-24
  • 打赏
  • 举报
回复
自定义协议,解析
疯狂学习中 2018-12-24
  • 打赏
  • 举报
回复
我记得可以插入的
xuzuning 2018-12-24
  • 打赏
  • 举报
回复
你可以套用 http 协议,如果是完全遵守,那么连数据解析都有人替你写好了
  • 打赏
  • 举报
回复
比如说传送一个对象,你说你用 json 格式序列化,人家就懂了、知道如何反序列化对象了。这比你说一堆什么自定义格式描述,更通用。所以不要只会传什么“文字”,要先把通讯信令概念提高到 xml、json 这个程度,先要收发 json 呢绒然后再考虑应用。
  • 打赏
  • 举报
回复
大致 20 年前,流行起来 xml,于是才有了一波各个公司开放平台的繁荣。你接收数据时,可以用 \r\n 作为每一个消息的分隔符,而消息就是 json 内容,就是序列化的业务 Model 对象。在这个基础上来在较高层次上来设计业务服务。
  • 打赏
  • 举报
回复
当序列化机制基于xml或者json等的时候,二进制数据可能用base64是比较标准的做法。当然对于比较大、比较频繁的二进制数据,也可以通过单独使用短链接、单独发送的方式,例如前4个字节是二进制数据 id 号,后边的是数据内容。
  • 打赏
  • 举报
回复
不都是定义socket前几个字节用来申明本次请求总长度的么? 你这只是在总长度之外,内部又进行了区分,那还是可以按同样的规则,第一个byte用于声明类型(图片,文字还是视频),第2至N个byte用于指明对应的内容长度 接收端按同样规则解析
  • 打赏
  • 举报
回复
引用 5 楼 qq_40258437 的回复:
自定义协议?嗯,不吝赐教,能怎么定义?
自定义二进制信令很麻烦。所以20年前流行起来xml,而10几年前流行起来json,都是用来标准化、格式化信令的。因此不用自定义二进制信令,但是要起码地懂点 json 或者 xml 概念。
  • 打赏
  • 举报
回复
引用 楼主 qq_40258437 的回复:
我在写这个时候,先写的是发送文字,发送接收都是netstream.write和netstream.read,但是现在想发送图片,如:****图片***。这种样式,图片是放在对应文字后面读出来自然也是原样读出,思路是:把他们转换成字节流,但是有个问题如何去区分里面到底是图片还是文字?或者说如何无损的把图片文字都读出来? 求代码指教!
先搞懂通讯 json 内容,这样可以序列化对象。如果你只会发送“文字”,相当于一个人学编程结果只知道 string 类型,别的类型根本没学过。
  • 打赏
  • 举报
回复
你要是实在不会自定义协议,你会不会压缩成zip发送?这样还省点发送流量。
liusa1997 2018-12-24
  • 打赏
  • 举报
回复
引用 23 楼 以专业开发人员为伍 的回复:
[quote=引用 20 楼 qq_40258437 的回复:]
[quote=引用 16 楼 以专业开发人员为伍 的回复:]
比如说传送一个对象,你说你用 json 格式序列化,人家就懂了、知道如何反序列化对象了。这比你说一堆什么自定义格式描述,更通用。所以不要只会传什么“文字”,要先把通讯信令概念提高到 xml、json 这个程度,先要收发 json 呢绒然后再考虑应用。

大大,能否推荐下要完成这个功能需要具体的那些知识点呢?我想来一个系统百度学习下,感谢[/quote]

.net 对象进行 json 序列化、反序列化。[/quote]
哦,大大,我想请教下,文字图片一起发送,这个可行吗?:文字1图片1文字2,一个byte1[]存一个判断0000(文字)然后里面放入文字1,同样byte2[]存一个1111(图片)然后里面放图片这样有实现性吗?
  • 打赏
  • 举报
回复
引用 20 楼 qq_40258437 的回复:
[quote=引用 16 楼 以专业开发人员为伍 的回复:] 比如说传送一个对象,你说你用 json 格式序列化,人家就懂了、知道如何反序列化对象了。这比你说一堆什么自定义格式描述,更通用。所以不要只会传什么“文字”,要先把通讯信令概念提高到 xml、json 这个程度,先要收发 json 呢绒然后再考虑应用。
大大,能否推荐下要完成这个功能需要具体的那些知识点呢?我想来一个系统百度学习下,感谢[/quote] .net 对象进行 json 序列化、反序列化。
Sqsdhc 2018-12-24
  • 打赏
  • 举报
回复
建议楼主可以使用json
liusa1997 2018-12-24
  • 打赏
  • 举报
回复
引用 10 楼 xomix 的回复:
你要是实在不会自定义协议,你会不会压缩成zip发送?这样还省点发送流量。

实在抱歉,的确不知道怎么自定义协议..
liusa1997 2018-12-24
  • 打赏
  • 举报
回复
引用 16 楼 以专业开发人员为伍 的回复:
比如说传送一个对象,你说你用 json 格式序列化,人家就懂了、知道如何反序列化对象了。这比你说一堆什么自定义格式描述,更通用。所以不要只会传什么“文字”,要先把通讯信令概念提高到 xml、json 这个程度,先要收发 json 呢绒然后再考虑应用。

大大,能否推荐下要完成这个功能需要具体的那些知识点呢?我想来一个系统百度学习下,感谢
wangmoxhn 2018-12-23
  • 打赏
  • 举报
回复
哥再给你个详细的 还看不懂就不说了。
比如你要发送一个字符串和一张图 字符串是1223 图片的大小是0x1000

那么你发送的时候数据是这样的:

00(字符) 04 00 00 00(长度为4) 31 32 32 33(字符:1223) 01(图片) 00 10 00 00(长度0x1000) 00 00 00 .................................................(图片数据)

你收到的也会是上面的数据

然后解析了。取出第一个字节,判断是0,那么说明后面的数据是字符串。然后取出第二到第五个字节,得到字符串长度4,然后再读出第六到第九个字节 得到字符串 1223 字符串解析完毕

再取一个字节,判断是1 说明后面是图片 再取四个字节 长度0x1000 图片的大小就是0x1000 然后再取出后面的0x1000个字节 转化为图片 就行了

如果后面还有数据,继续这套流程。
wangmoxhn 2018-12-23
  • 打赏
  • 举报
回复
你自己定。就像上面我说,第一个字节如果为0,就表示后面的是字符,然后你又定义下怎么解析字符就好了。
加载更多回复(6)

110,538

社区成员

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

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

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