我现在想做一个Socket 服务器端与客户端,用来传输文件,求思路
服务器端读取本地文件,然后把数据流发送到客户端,客户端怎样才能把数据流转换成原始数据呢

解决方案 »

  1.   

    TcpClient,TcpListener用来监听和传输
    FileStream来读取和写入文件
      

  2.   

    如果想用socket ,那就只能通过字节流 ,也就是byte[],因为socket只能支持这个类型的数据 。然后你可以通过转换数据类型来办到 。其实用socket的还是挺多的 ,很好找 。
      

  3.   

    byte[] -> stream -> filestream ->file?
      

  4.   

    部分代码
    Dictionary<string, ConnectionClient> dictConn = new Dictionary<string, ConnectionClient>(); //选择要发送的文件
            private void btnChooseFile_Click(object sender, EventArgs e)
            {
                OpenFileDialog ofd = new OpenFileDialog();
                if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    txtFilePath.Text = ofd.FileName;
                }
            }        //发送文件
            private void btnSendFile_Click(object sender, EventArgs e)
            {
                    //拿到下拉框中选中的客户端IPPORT
                    string key = cboClient.Text;
                    if (!string.IsNullOrEmpty(key))
                    {
                        dictConn[key].SendFile(txtFilePath.Text.Trim());
                    }
            }
      

  5.   

    http://www.cnblogs.com/fence/archive/2010/01/11/1644244.html
      

  6.   

    1.读出文件到字节数组中--这里编码
    2.把字节数组发送出去,如6楼
    3.将数据接入到字节数组
    4.将字节数组存成文件--这里解码,(加码解码要统一,对应)
    5.附部分代码,存文件。System.Windows.Forms.SaveFileDialog DialogSave = new System.Windows.Forms.SaveFileDialog();
    DialogSave.Filter = "文本文件(*.txt)|*.txt|所有文件(*.*)|*.*";
    DialogSave.InitialDirectory = "c:";
    if (DialogSave.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
    byte[] outBytes = null;
    outBytes = System.Text.Encoding.Default.GetBytes(TextBoxRecieve.Text);
    string FileName = DialogSave.FileName;
    //    My.Computer.FileSystem.WriteAllBytes(FileName, outBytes, false);
    Stream fs = new FileStream(FileName, FileMode.Create, FileAccess.Write);
    fs.Write(outBytes, 0, outBytes.Length);
    fs.Flush();
    fs.Close();
    //   fs.Disppose()
    Interaction.MsgBox("数据保存到 " + FileName);
    }
      

  7.   

    说点原理吧,网络传输都是用二进制在传输。所以发送的时候必须以byte[],然后接收到后,再转换成对应的数据,这就是所谓的网络传输协议
    你可以看看C#里面所讲到的序列化,与反序列化,应该就可以进行实践了
      

  8.   


    //接收端代码
     void tcp_OnReceived(byte[] message)
            {
                try
                {
                    char[] charData;
                    byte[] bData;
                    // solve(message);
                    string datagramtext = "HX7070\n0001";
                    string replyMessage = Encoding.Default.GetString(message);
                  
                    string str = replyMessage.Substring(11, 8);
                    int oldcount = Convert.ToInt32(str,16) - 1;
                    string rMessage = replyMessage.Substring(19);
                    // string fileaddress=@"E:\TDDOWNLOAD\我爱你胜过你爱我1111.mp3";
                    string fileaddress = @"F:\13.56M各扇区控制块111.txt";
                    FileStream aFile = new FileStream(fileaddress, FileMode.Create,FileAccess.Write);
                    
                    datagramtext += tianchong(oldcount.ToString(), "0", 8, true);
                    bData = Fun.GetPartBtye(message, 19, message.Length-19);
                    aFile.Write(bData, 0, bData.Length);
                    aFile.Flush();
                    aFile.Close();
                    //tcp.SendRequestMessage(datagramtext);
                    this.AddInfo("reply message: " + replyMessage);
                }
                catch
                {
                }
            }//发送端代码
    string filename = @"F:\13.56M各扇区控制块.txt";
                        FileStream filestream = File.Open(filename, FileMode.Open);
                        byte[] allbyte = new byte[filestream.Length];
                        filestream.Read(allbyte, 0, Convert.ToInt32(filestream.Length));
                        long FileLeng = filestream.Length / 400;//总包数
                        long FileYuLeng = filestream.Length % 400;//不足一包
                        if (FileYuLeng != 0)
                        {
                            FileLeng += 1;
                        }                    for (int i = oldcount; i < FileLeng; i++)
                        {
                            long len = filestream.Length - i * 400;
                            string datagramtext = "HX7070\n0001";
                            datagramtext += tianchong((FileLeng - i).ToString(), "0", 8, true);
                            if (Convert.ToInt32(filestream.Length - i * 400) < 400)
                            {
                                byte[] bData = Fun.GetPartBtye(allbyte, i * 400, Convert.ToInt32(filestream.Length - i * 400)); //new byte[Convert.ToInt32(filestream.Length - i * 400)];
                                datagramtext += BitConverter.ToString(bData).Replace("-", "");
                            }
                            else
                            {
                                byte[] bData = Fun.GetPartBtye(allbyte, i * 400, 400);
                                datagramtext += BitConverter.ToString(bData).Replace("-", "");
                            }
                            this.SendDatagram(datagramtext);//发送
                            //Thread.Sleep(100);
                        }
                        filestream.Flush();
                        filestream.Close();
      

  9.   

    Server(Client) -> Stream -> byte[] ->    SOCKET    ->byte[] -> Stream -> Client(Server) 
      

  10.   

    有必要传输 字符串类型XML岂不更好
      

  11.   

    接收时,要将接到的字节,再转回字符串格式,就对上了。
    加上此条private List<byte> buffer = new List<byte>();
    private void ShowRecieveData(byte[] inbytes)
    {
    System.Text.StringBuilder instrs_temp = new System.Text.StringBuilder();
    buffer.AddRange(inbytes);
    //缓存
    instrs_temp.Append(System.Text.Encoding.Default.GetString(buffer.ToArray(), 0, buffer.Count));
    }
      

  12.   


     FtpWebRequest reqFTP;
    FileStream outputStream = new FileStream(filePath, FileMode.OpenOrCreate);
                    reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + fileName));
                    reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
                    reqFTP.UseBinary = true;
                    reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
                    reqFTP.ContentOffset = outputStream.Length;//断点续传
                    //21105512
                    FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                    
                    Stream ftpStream = response.GetResponseStream();
                    long cl = response.ContentLength;
                    
                    int bufferSize = 20480;//
                    int readCount;
                    
                    byte[] buffer = new byte[bufferSize];
                    readCount = ftpStream.Read(buffer, 0, bufferSize);
                    sqlstr = "update downloading set DownState='1' where id=" + id;//把此文件的状态改为正在下载
                    try
                    {
                        access.DoSQL(SQLConn, sqlstr);
                    }
                    catch (Exception exx)
                    {
                        Fun.MsgShow(exx.Message, false);
                    }
                    //sqlstr = "insert into downloading(uploadpath,bytecount,addtime,states)values('" + fileName + "',0,date(),'0')";
                    //id =Convert.ToInt32( access.GetLastSQL(SQLConn, sqlstr));
                    outputStream.Position = outputStream.Length;//断点续传
                    while (readCount > 0)
                    {
                        outputStream.Write(buffer, 0, readCount);
                        readCount = ftpStream.Read(buffer, 0, bufferSize);
                        writeCount += readCount;
                       
                    }