写了一个 类似QQ的文件传输的功能 利用socket 监听端口来完成的 TcpListener L = new TcpListener(IPAddress.Parse("127.0.0.1"), 59000); 监听59000 端口 Thread T = new Thread(new ThreadStart(this.SetFile));
T.Start();
放到线程里运行 不过碰到了个问题 如果我传输两个文件 因为是在同一个端口里传输 结构就是把 俩个文件写成一个了 路径是第一个文件的是在(第一个文件还没传玩的情况下 如果第一个传完了就正常了我的文件默认写成rar的)有什么办法可以在同一端口 上接收多个文件(不想做在开端口了) 不知道 异步能完成不 因为文件比较大我的缓存区时 byte[30000]用了一个
TcpListener L = new TcpListener(IPAddress.Parse("127.0.0.1"), 59000);
L.Start();
while(true)
{
Socket S = L.AcceptSocket();
}
来循环接收
下面是 监听方法的源代码该方法也是写出文件的方法
private void CL()
{
TcpListener L = new TcpListener(IPAddress.Parse("127.0.0.1"), 59000);
L.Start();
while (true)
{
Socket S = L.AcceptSocket();
byte[] sender = new byte[30000];
int count = S.Receive(sender, 30000, SocketFlags.None);
bool sfwjm = false;
string fn2 = "";
int x = 0;
for (int i = 0; i < sender.Length; i++) //文件名
{
if (sender[i] == '#')
{
x = i;
break;
}
if (sfwjm == true)
{
fn2 += Convert.ToChar(sender[i]).ToString();
}
if (sender[i] == '$')
{
sfwjm = true;
}
} this.saveFileDialog1.Filter = "文件|*." + fn2.Substring(fn2.Length - 3); //
this.saveFileDialog1.ShowDialog();
string fn = this.saveFileDialog1.FileName; FileStream fs = new FileStream(fn, FileMode.OpenOrCreate, FileAccess.ReadWrite); //读取流
BinaryWriter bw = new BinaryWriter(fs);
bw.Write(sender, x, count);
Prog pr = new Prog(Progress); //委托
while (true) //循环写出
{
count = S.Receive(sender, 30000, SocketFlags.None);
if (count == 0)
{
break;
} bw.Write(sender, 0, count);
BeginInvoke(pr); //委托调用方法 此方法用来增长进度条
}
fs.Close();
bw.Close();
MessageBox.Show("接收完毕");
NullProg np = new NullProg(NullProgress); //委托
BeginInvoke(np); // 调用方法 使控件隐藏}
T.Start();
放到线程里运行 不过碰到了个问题 如果我传输两个文件 因为是在同一个端口里传输 结构就是把 俩个文件写成一个了 路径是第一个文件的是在(第一个文件还没传玩的情况下 如果第一个传完了就正常了我的文件默认写成rar的)有什么办法可以在同一端口 上接收多个文件(不想做在开端口了) 不知道 异步能完成不 因为文件比较大我的缓存区时 byte[30000]用了一个
TcpListener L = new TcpListener(IPAddress.Parse("127.0.0.1"), 59000);
L.Start();
while(true)
{
Socket S = L.AcceptSocket();
}
来循环接收
下面是 监听方法的源代码该方法也是写出文件的方法
private void CL()
{
TcpListener L = new TcpListener(IPAddress.Parse("127.0.0.1"), 59000);
L.Start();
while (true)
{
Socket S = L.AcceptSocket();
byte[] sender = new byte[30000];
int count = S.Receive(sender, 30000, SocketFlags.None);
bool sfwjm = false;
string fn2 = "";
int x = 0;
for (int i = 0; i < sender.Length; i++) //文件名
{
if (sender[i] == '#')
{
x = i;
break;
}
if (sfwjm == true)
{
fn2 += Convert.ToChar(sender[i]).ToString();
}
if (sender[i] == '$')
{
sfwjm = true;
}
} this.saveFileDialog1.Filter = "文件|*." + fn2.Substring(fn2.Length - 3); //
this.saveFileDialog1.ShowDialog();
string fn = this.saveFileDialog1.FileName; FileStream fs = new FileStream(fn, FileMode.OpenOrCreate, FileAccess.ReadWrite); //读取流
BinaryWriter bw = new BinaryWriter(fs);
bw.Write(sender, x, count);
Prog pr = new Prog(Progress); //委托
while (true) //循环写出
{
count = S.Receive(sender, 30000, SocketFlags.None);
if (count == 0)
{
break;
} bw.Write(sender, 0, count);
BeginInvoke(pr); //委托调用方法 此方法用来增长进度条
}
fs.Close();
bw.Close();
MessageBox.Show("接收完毕");
NullProg np = new NullProg(NullProgress); //委托
BeginInvoke(np); // 调用方法 使控件隐藏}
解决方案 »
- C# GDI+绘图问题
- 寻求ComboTree控件源码,或者成熟的ComboTree
- 新手:HttpCookie c = new HttpCookie("User")中c和user分别是什么意思?
- 用Ajax技术遇到很奇怪的问题[走过路过不要错过]
- 两个不同的命名空间有一个相同的类,如何指定使用需要的那一个类?
- 水晶报表问题!~~~
- 能不能让几个验证控件的错误提示信息显示在同一个地方啊?
- 添加的文本文件的路径???
- 我想做个网游外挂,大概思路已经形成,细节向大家请教一下
- 如何用DataGridTextBoxColumn控制该列只可以输入数字数据
- 如何在Service中对远程网站代码进行分析提取【高分请教】
- winform 日志问题
参考
http://topic.csdn.net/u/20100802/11/95f12327-2889-4895-869d-5ff37bcbc719.htmlhttp://topic.csdn.net/u/20100804/15/76b6f8cb-72fc-4065-a5d9-4946908aee7a.html