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("文件传输完成");
- C#中Socket的运用
- C#中Socket的运用
- C#中TIMER的运用
- C#中委托的运用
- C#中split的运用
- C#中XML的运用
- C#中数据库的运用
- c#中operator的运用
- java中运用socket通信,http和socket的区别
- C#中Xml文档的运用
- c#语言编程中GDI+的运用
- socket运用中需要注意的一个问题
- C# datatable的运用
- C#反射的运用
- C#中Socket.Receive()的超时问题
- C# 中运用函数指针
- C#中运用全局钩子
- 在C#中运用 SQLite
- Java Design Demo -Runnable的使用方式 多线程
- TCP的状态变迁
- poj 2255
- 黑马程序员 java 基础面试常考题目总结
- 关于request对象的方法返回值类型问题
- C#中Socket的运用
- 设计要支持变化
- JAVA基础知识梳理(一)
- BGColror jsp传入参数改变背景色(43)
- 启动和关闭数据库
- 黑马程序员 GUI开发总结 毕向东
- 上传GAE程序遇到HTTPError: HTTP Error 403: Forbidden问题解决
- 重复读幻读区别
- linux 系统用户权限