如何通过socket传输xml
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过socket传输xml相关的知识,希望对你有一定的参考价值。
socket传文件private string path = "F:\\SmartMovie.EXE"; //要发送的文件
private Socket s;
private void listen()
string ip = "127.0.0.1"; //远程IP 这里定义为自己的机器
IPAddress[] ih = Dns.GetHostAddresses(ip); //获得IP列表
IPAddress newip = ih[0]; //获取IP地址
int port = 6789; //定义端口
IPEndPoint Conncet = new IPEndPoint(newip, port); //构造结点
s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //初始化socket
try
s.Connect(Conncet); //连接远程服务器
if (s.Connected) //如果连接成功 s.Connected 则为true 否则为 false
Console.WriteLine("连接成功");
Thread t = new Thread(new ThreadStart(set)); //创建进程
t.Start(); //开始进程
Console.WriteLine("发送完毕")
catch(NullReferenceException e)
Console.WriteLine("0",e);
private void set() //创建set函数
Console.WriteLine("开始发送数据");
byte[] b = new byte[10000000]; //创建文件缓冲区,这里可以认为文件的最大值
FileStream file = File.Open(path, FileMode.Open,FileAccess.Read); //创建文件流
int start = 0;
int end = (int)file.Length; //获取文件长度文件传送如果有需要超过int的范围估计就要改写FileStream类了
try
while (end != 0)
int count = file.Read(b, start, end); //把数据写进流
start += count;
end -= count;
while (start != 0)
int n = s.Send(b, end, start, SocketFlags.None); //用Socket的Send方法发送流
end += n;
start -= n;
file.Close(); //关闭文件流
s.Close(); //关闭Socket
catch (NullReferenceException e)
Console.WriteLine("0", e);
这样文件发送的模型就实现了
接下去实现文件的接收,首先要确定对方发送文件的长度,其实上面的那段还要加入发送文件长度的功能,实现很简单,就是发送int变量end ,然后要求接收代码返回一个Boolean确定是否发送,这里为了更简明的说清楚原理并没有实现
private void get()
string path = "G:\\da.exe"; //接收的文件
FileStream file = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write); //写入文件流
TcpListener listen = new TcpListener(6789); //监听端口
Socket s1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //定义Socket并初始化
try
listen.Start(); //开始监听
s1 = listen.AcceptSocket(); //获取Socket连接
byte[] data = new byte[10000000]; //定义缓冲区
int longer = data.Length;
int start = 0;
int mid = 0;
if (s1.Connected) //确定连接
Console.WriteLine("连接成功");
int count = s1.Receive(data, start, longer, SocketFlags.None); //把接收到的byte存入缓冲区
mid += count;
longer -= mid;
while (count != 0)
count = s1.Receive(data, mid, longer, SocketFlags.None);
mid += count;
longer -= mid;
file.Write(data, 0, 1214134); //写入文件,1214134为文件大小,可以用socket发送获得,代码前面已经说明。
s1.Close();
file.Close();
catch(NullReferenceException e)
Console.WriteLine("0",e);
参考技术A 把sml格式的文件当作应用层负载(SDU),下面直接用TCP/UDP的socket传即可。
根据XML格式做一个协议,根据协议组包和解包!!
http和socket
要弄明白 http 和 socket 首先要熟悉网络七层
HTTP 协议:超文本传输协议,对应于应用层,用于如何封装数据.
TCP/UDP 协议:传输控制协议,对应于传输层,主要解决数据在网络中的传输。
IP 协议:对应于网络层,同样解决数据在网络中的传输。
Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议
HTTP 协议
http 为短连接:客户端发送请求都需要服务器端回送响应.请求结束后,主动释放链接,因此为短连接。
HTTP连接使用的是"请求-响应"方式,不仅在请求时建立连接,而且客户端向服务器端请求后,服务器才返回数据。
Socket 连接
要想明白 Socket,必须要理解 TCP 连接。
TCP 三次握手:
第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握手过程中并不传输数据,在握手后服务器与客户端才开始传输数据,理想状态下,TCP 连接一旦建立,在通讯双方中的任何一方主动断开连接之前 TCP 连接会一直保持下去。
创建 Socket 连接的时候,可以指定传输层协议,可以是 TCP 或者 UDP,当用 TCP 连接,该Socket就是个TCP连接,反之。
Socket适用场景:网络游戏,银行交互,支付。
http适用场景:公司OA服务,互联网服务。
以上是关于如何通过socket传输xml的主要内容,如果未能解决你的问题,请参考以下文章