在做毕业设计,最后一个没弄好的,跪求个思路~
C/S结构,在用的是,服务器开始监听,然后如果客户机有请求发进来后,就开启一个接受线程来接收文件,自己电脑上测试的时候是好的,但去学校机房一试不行,第一个文件没接收完时,第二个文件要发送就出错了,貌似信道被占用的意思...
代码如下
struct jieshou
{
public Socket j_ip;
public string j_id;
public string j_size;
}//接收文件结构体,用于存储接收信息传递给线程
//...................监听线程里处理请求的
case "stu07":
{ jieshou _js=new jieshou();
_js.j_ip=clientSkt;
_js.j_id=_cmd[1];
_js.j_size=_cmd[2];
string sendTxt;
if (Int64.Parse(_cmd[2]) > Int64.Parse(textBox2.Text) * 1048576)
{
sendTxt = "tea07 0 0 ";
}
else
{
Thread js_xc = new Thread(js_hs);
js_xc.Start((object)_js);
sendTxt = "tea07 1 0 ";
} clientSkt.Send(Encoding.Unicode.GetBytes(sendTxt));
break;
}
//.....................................接收函数
private void js_hs(object obj)
{
jieshou _js = (jieshou)obj;
Socket s;
TcpListener tl;
if (!Directory.Exists(textBox1.Text))//如果文件夹不存在
{
textBox1.Text = "C:\\";
MessageBox.Show("由于你选择的文件夹有所变动,默认文件保存地址改为C盘");
}
string path = @" " + textBox1.Text + _js.j_id + ".rar"; //要传入文件的路径
//IPAddress.TryParse(_ip, out _ipAddr);
//IPAddress objIPAddress;
//objIPAddress = IPAddress.Parse("192.168.1.12");
tl = new TcpListener(9999);
tl.Start(); s = tl.AcceptSocket(); FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write); //注意这个的属性和send端有所不同 BinaryWriter binarywrite = new BinaryWriter(fs); int count; byte[] b = new byte[4098]; while ((count = s.Receive(b, 4098, SocketFlags.None)) != 0) //这个是接受文件流
{ binarywrite.Write(b, 0, count); //将接收的流用写成文件 } binarywrite.Close();
fs.Close();
s.Close();
tl.Stop();
Thread.CurrentThread.Abort();
}
C/S结构,在用的是,服务器开始监听,然后如果客户机有请求发进来后,就开启一个接受线程来接收文件,自己电脑上测试的时候是好的,但去学校机房一试不行,第一个文件没接收完时,第二个文件要发送就出错了,貌似信道被占用的意思...
代码如下
struct jieshou
{
public Socket j_ip;
public string j_id;
public string j_size;
}//接收文件结构体,用于存储接收信息传递给线程
//...................监听线程里处理请求的
case "stu07":
{ jieshou _js=new jieshou();
_js.j_ip=clientSkt;
_js.j_id=_cmd[1];
_js.j_size=_cmd[2];
string sendTxt;
if (Int64.Parse(_cmd[2]) > Int64.Parse(textBox2.Text) * 1048576)
{
sendTxt = "tea07 0 0 ";
}
else
{
Thread js_xc = new Thread(js_hs);
js_xc.Start((object)_js);
sendTxt = "tea07 1 0 ";
} clientSkt.Send(Encoding.Unicode.GetBytes(sendTxt));
break;
}
//.....................................接收函数
private void js_hs(object obj)
{
jieshou _js = (jieshou)obj;
Socket s;
TcpListener tl;
if (!Directory.Exists(textBox1.Text))//如果文件夹不存在
{
textBox1.Text = "C:\\";
MessageBox.Show("由于你选择的文件夹有所变动,默认文件保存地址改为C盘");
}
string path = @" " + textBox1.Text + _js.j_id + ".rar"; //要传入文件的路径
//IPAddress.TryParse(_ip, out _ipAddr);
//IPAddress objIPAddress;
//objIPAddress = IPAddress.Parse("192.168.1.12");
tl = new TcpListener(9999);
tl.Start(); s = tl.AcceptSocket(); FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write); //注意这个的属性和send端有所不同 BinaryWriter binarywrite = new BinaryWriter(fs); int count; byte[] b = new byte[4098]; while ((count = s.Receive(b, 4098, SocketFlags.None)) != 0) //这个是接受文件流
{ binarywrite.Write(b, 0, count); //将接收的流用写成文件 } binarywrite.Close();
fs.Close();
s.Close();
tl.Stop();
Thread.CurrentThread.Abort();
}
tl.Start();这个不能在每次接收发送时实例一次。。前前实例后就已占用了那个端口了。。再实例就报错!!
看看这个
http://www.cnblogs.com/sh_yao/archive/2010/11/29/1891166.html
一、tl = new TcpListener(9999);的端口就不直接指定,自己寻找一个没被使用的端口,然后通知客户机?
二、 tl = new TcpListener(9999); tl.Start();只用一次,然后把s = tl.AcceptSocket();发给接收文件的线程,接收文件时候就不需要监听,直接使用s来接收文件?这个不知道可以不?