网络通信一般都是通过Socket进行的,称为进程通信机制,通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。
先学习一下socket基本原理:
socket原理:
在Internet上有很多这样的主机,这些主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原意那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。
Socket的形像理解:
socket非常类似于电话插座。以一个国家级电话网为例。
电话的通话双方相当于相互通信的2个进程,区号是它的网络地址;区内一个单位的交换机相当于一台主机,主机分配给每个用户的局内号码相当于socket号。
任何用户在通话之前,首先要占有一部电话机,相当于申请一个socket;同时要知道对方的号码,相当于对方有一个固定的socket。
然后向对方拨号呼叫,相当于发出连接请求(假如对方不在同一区内,还要拨对方区号,相当于给出网络地址)。
对方假如在场并空闲(相当于通信的另一主机开机且可以接受连接请求),拿起电话话筒,双方就可以正式通话,相当于连接成功。
双方通话的过程,是一方向电话机发出信号和对方从电话机接收信号的过程,相当于向socket发送数据和从socket接收数据。
通话结束后,一方挂起电话机相当于关闭socket,撤消连接。
Socket 通信应用示图

TCP/IP 客户端/服务端通信流程图

发送文件代码片段:
/// <summary> /// 发送文件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnSentFile_Click(object sender, EventArgs e) { //打开文件 OpenFileDialog dlg = new OpenFileDialog(); if (dlg.ShowDialog() == DialogResult.OK) { for (int i = 0; i < lvwDisplayUser.SelectedItems.Count; i++) { string ip = this.lvwDisplayUser.SelectedItems[i].SubItems[2].Text; //初始化接受套接字:寻址方案,以字符流方式和Tcp通信 socketSent = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //设置服务器IP地址和端口 ipSent = new IPEndPoint(IPAddress.Parse(ip), 8001); //与服务器进行连接 LanSocket socketConnet = new LanSocket(socketSent, ipSent); Thread tConnection = new Thread(new ThreadStart(socketConnet.SocketConnect)); tConnection.Start(); Thread.Sleep(100); //将要发送的文件加上"DAT"标识符 SentLanFile sentFile = new SentLanFile(dlg, socketSent); Thread tSentFile = new Thread(new ThreadStart(sentFile.SentFile)); tSentFile.Start(); } } }
/// <summary> /// 发送文件 /// </summary> public void SentFile() { string msg = "0DAT " + dlg.FileName; //将 "msg" 转化为字节流的形式进行传送 socketSent.Send(Encoding.Default.GetBytes(msg)); //定义一个读文件流 FileStream read = new FileStream(dlg.FileName, FileMode.Open, FileAccess.Read); //设置缓冲区为1024byte byte[] buff = new byte[1024]; int len = 0; while ((len = read.Read(buff, 0, 1024)) != 0) { //按实际的字节总量发送信息 socketSent.Send(buff, 0, len, SocketFlags.None); } //将要发送信息的最后加上"END"标识符 msg = "END"; //将 "msg" 发送 socketSent.Send(Encoding.Default.GetBytes(msg)); socketSent.Close(); read.Close(); }
原文:http://www.cnblogs.com/cgli/archive/2011/05/03/2035563.html
