通过Socket通讯,贴出源程序来,希望能给大家带来方便. Server端 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Net; using System.Threading; using System.Net.Sockets; using System.IO; namespace FileSocketServer { public partial class Form1 : Form { Socket ClientSocket; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { //开启接收线程 Thread TempThread = new Thread(new ThreadStart(this.StartReceive)); TempThread.Start(); } #region 功能函数 private void StartReceive() { //创建一个网络端点 IPEndPoint ipep = new IPEndPoint(IPAddress.Any, int.Parse("1005")); //MessageBox.Show(IPAddress.Any); //创建一个套接字 Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //绑定套接字到端口 server.Bind(ipep); //开始侦听(并堵塞该线程) server.Listen(10); while (true) { try { Socket client = server.Accept(); ClientSocket = client; Thread TempThread = new Thread(new ThreadStart(this.Create)); TempThread.Start(); } catch (Exception ex) { int k = 0; } } } #endregion public void Create() { Socket client = ClientSocket; //确认连接 //Socket client = server.Accept(); //获得客户端节点对象 IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint; //获得[文件名] string SendFileName = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client)); //获得[包的大小] string bagSize = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client)); //获得[包的总数量] int bagCount = int.Parse(System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client))); //获得[最后一个包的大小] string bagLast = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client)); //创建一个新文件 FileStream MyFileStream = new FileStream(SendFileName, FileMode.Create, FileAccess.Write); //已发送包的个数 int SendedCount = 0; while (true) { byte[] data = TransferFiles.ReceiveVarData(client); if (data.Length == 0) { break; } else { SendedCount++; //将接收到的数据包写入到文件流对象 MyFileStream.Write(data, 0, data.Length); //显示已发送包的个数 } } //关闭文件流 MyFileStream.Close(); //关闭套接字 client.Close(); } } } Client界面如下 Client端 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using System.Net; using System.Net.Sockets; using System.Threading; namespace FileClientSocket { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { //获得本机的IP地址 this.textBox4.Text = Dns.GetHostByName(Dns.GetHostName()).AddressList[0].ToString(); } private void StartSend() { //创建一个文件对象 FileInfo EzoneFile = new FileInfo(this.textBox1.Text); //打开文件流 FileStream EzoneStream = EzoneFile.OpenRead(); //包的大小 int PacketSize = int.Parse(this.textBox6.Text); //包的数量 int PacketCount = (int)(EzoneStream.Length / ((long)PacketSize)); //最后一个包的大小 int LastDataPacket = (int)(EzoneStream.Length - ((long)(PacketSize * PacketCount))); //指向远程服务端节点 IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(txtIP.Text.Trim()), int.Parse(this.textBox5.Text)); //创建套接字 Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //连接到发送端 client.Connect(ipep); //获得客户端节点对象 IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint; //发送[文件名]到客户端 TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(EzoneFile.Name)); //发送[包的大小]到客户端 TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketSize.ToString())); //发送[包的总数量]到客户端 TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketCount.ToString())); //发送[最后一个包的大小]到客户端 TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(LastDataPacket.ToString())); //数据包 byte[] data = new byte[PacketSize]; //开始循环发送数据包 for (int i = 0; i < PacketCount; i++) { //从文件流读取数据并填充数据包 EzoneStream.Read(data, 0, data.Length); //发送数据包 TransferFiles.SendVarData(client, data); } //如果还有多余的数据包,则应该发送完毕! if (LastDataPacket != 0) { data = new byte[LastDataPacket]; EzoneStream.Read(data, 0, data.Length); TransferFiles.SendVarData(client, data); } //关闭套接字 client.Close(); //关闭文件流 EzoneStream.Close(); MessageBox.Show("文件传输完毕!"); } private void button1_Click(object sender, EventArgs e) { //选择要进行传输的文件 if (this.openFileDialog1.ShowDialog() == DialogResult.OK) { FileInfo EzoneFile = new FileInfo(this.openFileDialog1.FileName); this.textBox1.Text = EzoneFile.FullName; this.textBox2.Text = EzoneFile.Name; this.textBox3.Text = EzoneFile.Length.ToString(); } } private void button2_Click(object sender, EventArgs e) { //开启文件传输子线程 Thread TempThread = new Thread(new ThreadStart(this.StartSend)); TempThread.Start(); } } } 共用类 using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; using System.Windows.Forms; namespace FileClientSocket { public class TransferFiles { public static int SendData(Socket s, byte[] data) { int total = 0; int size = data.Length; int dataleft = size; int sent; while (total < size) { sent = s.Send(data, total, dataleft, SocketFlags.None); total += sent; dataleft -= sent; } return total; } public static byte[] ReceiveData(Socket s, int size) { int total = 0; int dataleft = size; byte[] data = new byte[size]; int recv; while (total < size) { recv = s.Receive(data, total, dataleft, SocketFlags.None); if (recv == 0) { data = null; break; } total += recv; dataleft -= recv; } return data; } public static int SendVarData(Socket s, byte[] data) { int total = 0; int size = data.Length; int dataleft = size; int sent; byte[] datasize = new byte[4]; datasize = BitConverter.GetBytes(size); sent = s.Send(datasize); while (total < size) { sent = s.Send(data, total, dataleft, SocketFlags.None); total += sent; dataleft -= sent; } return total; } public static byte[] ReceiveVarData(Socket s) { int total = 0; int recv; byte[] datasize = new byte[4]; recv = s.Receive(datasize, 0, 4, SocketFlags.None); int size = BitConverter.ToInt32(datasize, 0); int dataleft = size; byte[] data = new byte[size]; while (total < size) { recv = s.Receive(data, total, dataleft, SocketFlags.None); if (recv == 0) { data = null; break; } total += recv; dataleft -= recv; } return data; } } } 源程序下载地址:http://download.csdn.net/source/1195621