c#下用socket传输

flytigerme 2010-11-06 03:55:15
用tcplistener和tcpclient,如果我要传送一个文件,和文件名,如何在同一次流传输中将2者都发送过去,接收端又如何识别流的哪一段是文件名,哪一段是文件?
...全文
140 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
phil999 2010-11-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sp1234 的回复:]
我是P哥!?
[/Quote]

对,你就是P哥
pedcode 2010-11-06
  • 打赏
  • 举报
回复
分段发送 记录字节大小
  • 打赏
  • 举报
回复
哦,sorry,修改一下举例的实体定义:

public class MyTransferDatas
{
public string[] FileNames;
public List<byte[]> FileBytes;
}

呵呵,随手的。我只强调设计方法,并没有去想给你抄代码。所以.....
  • 打赏
  • 举报
回复
再早期的协议,可能用一个枚举值来表达类型,而不是像我上面这样“奢侈”地使用128字节。但是其它部的概念基本上是一样的,就是任何协议大概都会分为“消息头”和“消息体”两部分,消息头传递固定的简单格式的信息内容,而消息体则传递需要更进一步解析的内容。
  • 打赏
  • 举报
回复
我是P哥!?


简单的关于协议的东西也许说着玄乎,举个(更适合最近几年的协议的)例子:如果你有一个对象其类型是这样定义的:

public class MyTransferDatas
{
public string[] FileNames;
public byte[] FileBytes;
}

其中第一个数组标记了多个文件,第二个数组标记了对应每一个文件的内容(每一个字节),那么当你new一个这样的对象并传递时,可以这样组织数据:

第1~128字节,保存这个类型的全名称,Encoding.Utf8.Getbytes来获得byte[]值。
之后的字节,保存这个对象的二进制序列化内容,BinaryFormatter.Serialize来获得byte[]值。

把这样的两个数据以Array.Copy方式写到一个buffer中,然后send给tcpclistener端,接收端首先读取类型全名称,然后反序列化之后的字节成为MyTransferDatas对象实例,也就知道传递什么了。

实际上我用这个例子要说明的是一个通用的设计。这里你可以传递任意实体对象,只要预先把实体类型放到一个工程中并且让c/s两端的程序都引用它就行了(保证两端都知道序列化、反序列化的类型)。


不过还有一点补充。其实单就这个设计来说,是不够的。因为我们不知道文件的大小,而我们不论客户端还是服务器端都需要较好的反应速度,网络也需要,所以实用真正程序传递的数据不应该太大。当重构这个设计时,其实应该修改为仅仅传递相应文件中一块数据,例如给出每一个数据块在文件中的起点字节数(实际上还需要给出每一个文件总的字节数)。这同时也可以实现断点续传。
phil999 2010-11-06
  • 打赏
  • 举报
回复
socket 传输的是字节流,怎么解释这个流要自己定义

110,538

社区成员

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

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

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