- 浏览: 228380 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
net_liu:
zxptian 写道楼主能把TransferFiles也贴出来 ...
c# Socket 文件的传输 -
zxptian:
楼主能把TransferFiles也贴出来分享下吗?
c# Socket 文件的传输
服务器端:
namespace Server { public delegate void ReceiveCompletedEventHandler(string bagSize, string Address, string SendedCount, string SendFileName, string bagCount, string bagLast); public partial class Form1 : Form { public Form1() { InitializeComponent(); this.dataGridView1.AllowUserToAddRows = false; this.ReceiveCompleted += new ReceiveCompletedEventHandler(Form1_ReceiveCompleted); } void Form1_ReceiveCompleted(string bagSize, string Address, string SendedCount, string SendFileName, string bagCount, string bagLast) { if (this.dataGridView1.InvokeRequired) { this.dataGridView1.Invoke(new ReceiveCompletedEventHandler(Form1_ReceiveCompleted), bagSize, Address, SendedCount, SendFileName, bagCount, bagLast); } else { this.dataGridView1.Rows.Add(bagSize, Address, SendedCount, SendFileName, bagCount, bagLast); } } Thread thread; private void Form1_Load(object sender, EventArgs e) { //开启接受线程 thread = new Thread(new ThreadStart(StartReceive)); thread.Start(); } private event ReceiveCompletedEventHandler ReceiveCompleted; private void Completed(string bagSize, string Address, string SendedCount, string SendFileName, string bagCount, string bagLast) { if (ReceiveCompleted != null) { ReceiveCompleted(bagSize, Address, SendedCount, SendFileName, bagCount, bagLast); } } Socket client; Socket server; #region 功能函数 /// <summary> /// 服务器端接收线程方法 /// </summary> private void StartReceive() { //创建一个网络端点 IPEndPoint ipep = new IPEndPoint(IPAddress.Any, int.Parse("2010")); //MessageBox.Show(IPAddress.Any); //创建一个套接字 server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //绑定套接字到端口 server.Bind(ipep); //开始侦听(并堵塞该线程) server.Listen(10); while (true) { //确认连接 client = server.Accept(); //获得客户端节点对象 Thread ThreadClient = new Thread(new ThreadStart(ClientMethod)); ThreadClient.Start(); } } private void ClientMethod() { IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint; //获得[文件名] string SendFileName = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client)); //MessageBox.Show("文件名" + SendFileName); //获得[包的大小] string bagSize = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client)); //MessageBox.Show("包大小" + bagSize); //获得[包的总数量] int bagCount = int.Parse(System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client))); //MessageBox.Show("包的总数量" + bagCount); //获得[最后一个包的大小] string bagLast = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client)); //MessageBox.Show("最后一个包的大小" + bagLast); string filepath = null; string fileName = SendFileName; string fileNameExt = fileName.Substring(fileName.LastIndexOf(".") + 1); if (fileNameExt == "svd") { filepath = @"D:\FileSave\SVD\"; if (!Directory.Exists(filepath)) Directory.CreateDirectory(filepath).ToString(); } else if (fileNameExt == "jpg") { filepath = @"D:\FileSave\JPG\"; if (!Directory.Exists(filepath)) Directory.CreateDirectory(filepath).ToString(); } else { filepath = @"D:\FileSave\File\"; if (!Directory.Exists(filepath)) Directory.CreateDirectory(filepath).ToString(); } //创建一个新文件 FileStream MyFileStream = new FileStream(filepath + 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); //显示已发送包的个数 //MessageBox.Show("已发送包个数"+SendedCount.ToString()); } } //关闭文件流 MyFileStream.Close(); //关闭套接字 client.Close(); Completed(bagSize, clientep.Address.ToString(), SendedCount.ToString(), SendFileName, bagCount.ToString(), bagLast); } #endregion private void Form1_FormClosing(object sender, FormClosingEventArgs e) { try { server.Close(); Application.Exit(); } catch (Exception) { throw; } } } }
客户端:
public Form1() { InitializeComponent(); this.textBox4.Text = Dns.GetHostByName(Dns.GetHostName()).AddressList[0].ToString(); } //发送 private void button2_Click(object sender, EventArgs e) { if (textBox7.Text.Trim() == "") { MessageBox.Show("接收端IP不能为空!"); return; } progressBar1.Value = 0; button2.Enabled = false; Thread TempThread = new Thread(new ThreadStart(this.StartSend)); TempThread.Start(); } /// <summary> /// 客户端文件传输子线程方法(上传方法) /// </summary> private void StartSend() { if (this.InvokeRequired) { this.Invoke(new ThreadStart(StartSend)); } else { //创建一个文件对象 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)); this.textBox8.Text = PacketCount.ToString(); this.progressBar1.Maximum = PacketCount; //最后一个包的大小 int LastDataPacket = (int)(EzoneStream.Length - ((long)(PacketSize * PacketCount))); this.textBox9.Text = LastDataPacket.ToString(); ////创建一个网络端点 //IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("192.168.1.136"), int.Parse(this.textBox5.Text)); ////MessageBox.Show(IPAddress.Any); ////创建一个套接字 //Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //MessageBox.Show(server.ToString()); //指向远程服务端节点 IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(textBox7.Text.Trim()), int.Parse(this.textBox5.Text)); //创建套接字 Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //连接到发送端 client.Connect(ipep); ////绑定套接字到端口 //client.Bind(ipep); //MessageBox.Show(ipep.ToString()); ////开始侦听(并堵塞该线程) //server.Listen(10); //确认连接 //Socket client = server.Accept(); //MessageBox.Show(client.ToString()); //获得客户端节点对象 IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint; //获得客户端的IP地址 //this.textBox7.Text=clientep.Address.ToString(); //发送[文件名]到客户端 CommonModule.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(EzoneFile.Name)); //发送[包的大小]到客户端 CommonModule.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketSize.ToString())); //发送[包的总数量]到客户端 CommonModule.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketCount.ToString())); //发送[最后一个包的大小]到客户端 CommonModule.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); //发送数据包 CommonModule.SendVarData(client, data); //显示发送数据包的个数 this.textBox10.Text = ((int)(i + 1)).ToString(); //进度条值的显示 this.progressBar1.PerformStep(); } //如果还有多余的数据包,则应该发送完毕! if (LastDataPacket != 0) { data = new byte[LastDataPacket]; EzoneStream.Read(data, 0, data.Length); CommonModule.SendVarData(client, data); this.progressBar1.Value = this.progressBar1.Maximum; } //关闭套接字 client.Close(); //server.Close(); //关闭文件流 EzoneStream.Close(); this.button2.Enabled = true; MessageBox.Show("文件传输完毕!"); } } //浏览文件 private void button1_Click(object sender, EventArgs e) { if (openFileDialog1.ShowDialog() == DialogResult.OK) { FileInfo info = new FileInfo(openFileDialog1.FileName); textBox1.Text = info.FullName; textBox2.Text = info.Name; textBox3.Text = info.Length.ToString(); } }
公共类代码:
class CommonModule { 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; } }
评论
2 楼
net_liu
2010-09-19
zxptian 写道
楼主能把TransferFiles也贴出来分享下吗?
把 CommonModule 这个公共类改成TransferFiles就可以了!!
1 楼
zxptian
2010-09-16
楼主能把TransferFiles也贴出来分享下吗?
相关推荐
C#Socket文件传输,将文件名和文件保存到一个byte[]中传输,再通过解析获取文件名和文件保存到本地文件夹中
c# socket 文件传输 源码 即时 中文 字符c# socket 文件传输 源码 即时 中文 字符c# socket 文件传输 源码 即时 中文 字符
c# socket 传输文件,c# socket 传输文件,c# socket 传输文件
C#socket 大文件传输 分段传输 C#DEMO
C#socket点对点文件传输几个源码及一些关于socket文件传输的文档
C# 写的基于socket的文件传输项目源码,可执行
C# 实现的SOCKET大文件传输,支持高并发,断点续传等,是学习SOCKET通信的经典案例,走过路过不要错过!!!!!!
C# socket TCP 大文件传输同时实现断点续传
C# Socket实现大文件的分包上传。基本原理:添加客户端缓存,计算上传文件的字节,计算包的数量 ,计算最后一个包的字节。
其中Model为模型项目,SocketProtocol为传输协议,Utility为帮助类 本案例通过一个基本协议,使用socket传送数据,能够达到大量数据发送不发生粘包等常见现象,在我本机测试,一次性能够传送的数据包大小为系统一次性能够...
实现服务器和客户端的文件异地备份,定时备份,但是只能备份文件夹下的文件,不能备份文件夹套文件夹,程序有待于进一步改进
有C#写的利用Soket Tcp传输文件的实例,带有时间统计和滚动条,如有疑问,请联系QQ:78499261
C# socket局域网内文件传输代码 使用 C#socket在局域网发送、接收文件等基本功能,下载 "android socket局域网内文件传输"可以在电脑和手机之间传输文件
C# UDP Socket 异步传输文件C# UDP Socket 异步传输文件
局域网socket文件传输(c#) 局域网socket文件传输(c#)
在研究C#IM的过程中,循序渐进的学习和研究C#网络编程,写成了本C#异步多线程文件传输和文字聊天系统,对刚刚学习网络编程的人有一定的帮助,因为是练习作品,所以请大家莫拍砖。
c# 异步socket(能发送文本,文件和数据流) 文本分析器等等...
C# Socket传输主机硬件配置信息 一、Server ---服务端,引用了xxbtool和datatool,主要功能:接收客户端XML文件与主机配置Model写入数据库。 二、Client ---客户端,引用xxbtool,暂时功能只有:与服务端消息通信、...
使用C#里面的socket 实现客户端与服务器端的文件传送
C# UDP Socket异步传输文件代码