原文网址:http://hi.baidu.com/eleven%5F2020/blog/item/8217de2e8a8c093a359bf763.html
C#中Socket的运用
2010-08-31 12:01
流的说明:数据的传输都会用到流,一般的文件如文本、图片等,可以运用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("文件传输完成");
|