前天通过http协议把上传文件功能做好了,我们老大说要简单点,无需装iis的用socket方式做。
我之前没用socket方式做过。找了些资料看得头晕晕的了。
所以过来求助一下。
实现功能:
      局域网内实现定时扫描指定文件夹(分多级目录)下所有文件上传至服务器。
服务器端接受文件保存至指定文件夹下。
求大虾们赐教,在下感激不尽

解决方案 »

  1.   

    Socket sendSocket = null;
                try
                {
                    sendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    sendSocket.Connect(IP);                string fileName = Path.GetFileName(filePath);                byte[] buffCompanyID = new byte[4];
                    buffCompanyID = BitConverter.GetBytes(fCompanyID);                byte[] buffImageLength = new byte[4];
                    buffImageLength = BitConverter.GetBytes(fileName.Length);
                    byte[] buffImageName = new byte[fileName.Length];
                    buffImageName = Encoding.Default.GetBytes(fileName);                Stream s = File.Open(filePath, FileMode.Open);
                    int leng = 0;
                    if (s.Length < int.MaxValue)
                        leng = (int)s.Length;
                    byte[] by = new byte[leng];
                    s.Read(by, 0, leng);
                    s.Close();                MemoryStream ms = new MemoryStream();
                    ms.Write(buffCompanyID, 0, 4);
                    ms.Write(buffImageLength, 0, 4);
                    ms.Write(buffImageName, 0, fileName.Length);
                    ms.Write(by, 0, leng);
                    byte[] anotherBytes = ms.GetBuffer();                sendSocket.Send(anotherBytes, 8 + fileName.Length + leng, SocketFlags.None);
                }
                catch (System.Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    if (sendSocket != null)
                    {
                        sendSocket.Shutdown(SocketShutdown.Both);
                        sendSocket.Close();
                    }
                }
                return true;
            }
    。我这个是将文件流和文件名字。文件名字长度。和客户id.合并成的一个大流。一次性传到服务器上去的。你看下吧。。希望对你有用。
      

  2.   

    问这个问题的不少啊,看例子socket点对点传输文件
    http://www.netxk.cn/?p=145
      

  3.   

    之前用web方式做好了一个,现在要换成socket文件传输了
      

  4.   

    给你个建议,将要发送的信息,定义成一个类,这个类里包含 文件信息(还可以有MD5),其中主要的一个字段就是发送的内容byte[](文件序列化的流)  ,
    发送文件时将这个类序列化后发送,这样接收后就比较容易解释信息,省的还得定义几个字节是文件信息,还方便以后扩展.
    如果是大文件的话就多读几次,记得在类里做个标记
      

  5.   

    现在我的socket传输已经差不多了,服务端代码如下:private void btnStartServer_Click(object sender, EventArgs e)
            {
                this.btnStartServer.Enabled = false;
                //开启接收线程   
                Thread TempThread = new Thread(new ThreadStart(this.StartReceive));
                TempThread.Start();
            }        private void StartReceive()
            {
                //创建一个网络端点   
                IPEndPoint ipep = new IPEndPoint(IPAddress.Any, int.Parse("1005"));            //创建一个套接字   
                Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            //绑定套接字到端口   
                server.Bind(ipep);            //开始侦听(并堵塞该线程)   
                server.Listen(10);            while (true)
                {
                    try
                    {
                        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));
                        //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 fileFullName =txtFileSaveDir.Text + "\\"+ SendFileName;
                        FileStream MyFileStream = new FileStream(fileFullName, 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);
                                //将文件信息保存至数据库
                                this.fileAdd(SendFileName,fileFullName);
                            }
                        }
                        //关闭文件流   
                        MyFileStream.Close();                    //关闭套接字   
                        client.Close();                     
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, "error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }        }
    问题就在我该如何结束这个线程呢
      

  6.   

      while (true)//把true换成 bool类型的变量 ,要结束线程只要在外部把 变量的值设置为false就可以了
                        {                        byte[] data = TransferFiles.ReceiveVarData(client);
                            if (data.Length == 0)
                            {
                                break;
                            }
                            else
                            {
                                SendedCount++;
                                //将接收到的数据包写入到文件流对象   
                                MyFileStream.Write(data, 0, data.Length);
                                //将文件信息保存至数据库
                                this.fileAdd(SendFileName,fileFullName);
                            }
                        }
      

  7.   

    http://download.csdn.net/detail/chenandczh/3661723 功能强大
      

  8.   

    为什么不是最外层的while呢。