在做毕业设计,最后一个没弄好的,跪求个思路~
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();
        }

解决方案 »

  1.   

    tl = new TcpListener(9999);
      tl.Start();这个不能在每次接收发送时实例一次。。前前实例后就已占用了那个端口了。。再实例就报错!!
      

  2.   

    你可以看看多线程的
    看看这个
    http://www.cnblogs.com/sh_yao/archive/2010/11/29/1891166.html
      

  3.   

    这么说来,想到两个办法
    一、tl = new TcpListener(9999);的端口就不直接指定,自己寻找一个没被使用的端口,然后通知客户机?
    二、 tl = new TcpListener(9999); tl.Start();只用一次,然后把s = tl.AcceptSocket();发给接收文件的线程,接收文件时候就不需要监听,直接使用s来接收文件?这个不知道可以不?
      

  4.   

    你的代码是在是乱 看不明白 但是可以告诉你 你要用异步的方式来接受数据 还有就是监听端口一次就行了 不用每次接收数据都设置这些东西,多次监听一个端口也会出错,去msdn上应该就有例子 好好看看吧!