C#中Socket的运用

来源:互联网 发布:网络盒子接电脑显示器 编辑:程序博客网 时间:2024/06/05 10:29

C#中Socket的运用

流的说明:数据的传输都会用到流,一般的文件如文本、图片等,可以运用FileStream类来完成。对象的传输也要转换成流,只不过我们称之为对象的序列化。所以不管是文件还是内存中的对象,要实现传输都会转换成有序列的二进制数组,然后在进行传输。
C#中可运用socket对象来完成计算机之间的数据传输。
发送数据主机:
1、创建socket对象
Socket socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
2、远程IP和端口号
PEndPoint remotePoint = new IPEndPoint(IPAddress.Parse(远程IP), 8002);
3、连接远程主机
socketSend.Connect(remotePoint);
4、信息转换成字节数组
byte[] buff = System.Text.Encoding.Default.GetBytes(信息));
5、发送数据
socketSend.Send(buff);
6、关闭Socket
socketSend.Close();
接送数据主机
1、创建Socket对象
Socket socketListen = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
2、本机IP和端口号
IPEndPoint hostPoint = new IPEndPoint(Dns.GetHostEntry(Dns.GetHostName()).AddressList[0], 8002);
3、Socket绑定到该结点上
socketListen.Bind(hostPoint);
4、让Socket对象处于监听状态
socketListen.Listen(50);
5、建立连接请求
while (true)
{
Socket socket = socketListen.Accept();//建立连接并返回连接的socket对象
Thread thrAccept = new Thread(new ParameterizedThreadStart(DataProcess));
thrAccept.Start(socket);//另一线程处理此次连接。这里也可以运用创建对象传参,线程执行对象的方法
}
6、处理数据
public void DataProcess(object obj)
{
Socket socket = (Socket)obj;
byte[] buff = new byte[1024];//创建缓存空间
int len =socket.Receive(buff);//把接收的数据放入字节数组中
string s = System.Text.Encoding.Default.GetString(buff, 0, len);
}




C#中Socket的运用(二)
2010-08-31 14:38
在做Socket编程时,我们一般会遇到以下问题:
1、如何判断发送方发送的是文字信息还是文件
可以先发送判断类型的字符串如:"MSG"或"FILE",再发送相关信息,另一方接送到后先解析类型,在处理接收到的信息。
发送发:
socketSend.Send(System.Text.Encoding.Default.GetBytes("MSG"));
Thread.Sleep(100);//这里一定要Sleep一会,不然接收到的可能有后面发送的信息
socketSend.Send(其他信息);
接收方:
byte[] buff = new byte[1024];
int len =socket.Receive(buff);//进行第一次Receive,获取类型字符串,若发送时没有Sleep一会,这里可能接送到所有信息,可通过截取字符串判断。
string type= System.Text.Encoding.Default.GetString(buff, 0, len);
if (type == "MSG")
{
int mLen = socket.Receive(buff);//第二次Receive,则获取内容
string msg = System.Text.Encoding.Default.GetString(buff, 0, mLen);
MessageBox.Show(sb.ToString());
}
发送文件则是同样的原理。

2、传输大数据的处理
在进行数据传输时,我们会去创建临时的缓存区域,用于数据的读写,当传输大数据时,只需循环完成读写操作。
例如:传输大量文字信息
socketSend.Send(System.Text.Encoding.Default.GetBytes(大量信息));
接收方:
byte[] buff = new byte[1024];//创建缓存区域
int mLen = 0;
StringBuilder sb = new StringBuilder();
while ((mLen = socket.Receive(buff)) != 0)//循环读取数据
{
sb.Append(System.Text.Encoding.Default.GetString(buff, 0, mLen));
}
MessageBox.Show(sb.ToString());

传输文件:
发送方
FileStream fs = new FileStream(this.cOrPath, FileMode.Open, FileAccess.Read);//文件流
byte[] buff = new byte[1024];//发送数据的缓存区域
int len;
while ((len = fs.Read(buff, 0,1024)) != 0)//循环把数据读入数组中
{
socketSend.Send(buff, len, SocketFlags.None);//读一次发送一次
}
fs.Close();//发送完关闭文件流
Thread.Sleep(100);
string end = "END";//表示发送完
socketSend.Send(System.Text.Encoding.Default.GetBytes(end));
socketSend.Close();
接收方:
//创建写入文件流
FileStream fs = new FileStream("d://" + fileName, FileMode.OpenOrCreate, FileAccess.Write);
int mLen = 0;
while ((mLen = socket.Receive(buff)) != 0)//循环读取
{
string end = System.Text.Encoding.Default.GetString(buff, 0, mLen);
if (end == "END")//判断是否结束
{
break;
}
fs.Write(buff, 0, mLen);//读一次写一次
}
fs.Close();
MessageBox.Show("文件传输完成");


原创粉丝点击