流程:客户端发送图片 服务器端接收图片显示
代码:                    
                            Image img = Screenshots.getScreen();//得到Image对象
                            MemoryStream ms = new MemoryStream();
                            img.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
                            
                            byte[] buffer = new byte[ms.Length];
                            ms.Read(buffer, 0, (int)ms.Length);
                            ms.Close();
                            try
                            {
                                
                                stm.Write(buffer, 0, buffer.Length);
                                stm.Close();
                            }
                            catch (Exception ex)
                            {
                                Console.WriteLine(ex.ToString());
                            }
                            stm是已经连接好的NetworkStream对象服务器端接收代码:
                           byte[] tempBuffer = new byte[4096];
                        //FileStream fs = File.Open(new Random().Next().ToString() + ".gif", FileMode.CreateNew);
                        MemoryStream memStream = new MemoryStream();
                        int bytesRead = 0;
                        int length = 0;
                        while ((length = client.Receive(tempBuffer)) > 0)
                        {
                            memStream.Write(tempBuffer, 0, length);
                        }
                        memStream.Flush();                        错误行:Image picture = Image.FromStream(memStream);
                        pictureBox1.Image = picture;
                        memStream.Close();
                        client.Close();
                        client是已连接的socket对象现在服务器端接收时在错误行报参数错误 client.Receive()根本没有接收到 请高手帮忙看看是哪里的代码写的不对!

解决方案 »

  1.   

    http://www.congci.com/item/socketimagedemo
      

  2.   

    接收不到估计是连接问题,Flush是多余的,你还要检查你Send了没有
      

  3.   

    while ((length = client.Receive(tempBuffer)) > 0)
      {
      memStream.Write(tempBuffer, 0, length);
      }
    这不对,如果循环两次第二次会把第一次的覆盖,第二次不能从0开始写,应该从第一次的结尾开始写!!
    设个计数器
      

  4.   

    我不知道楼主的具体想法,如果是我,思路会这样:
    所有的文件以二进制方式读取,发送,写入。
    最近也在写sock通信,贴一下我的发送和接受方面的代码,希望对楼主有用。
      

  5.   


    //发送端
    FileStream fs = new FileStream(@strSourcefile, FileMode.Open, FileAccess.Read, FileShare.Read);
                                                const int nLength = 1024;
                                                byte[] szContent = new Byte[nLength];
                                                msgContent.bEnd = 0;
                                                msgContent.nMessageTypes = 5;
                                                int i = 0;
                                                while (fs.Read(szContent, 0, nLength) != 0)
                                                {
                                                    msgContent.content = szContent;
                                                    szContent = new Byte[nLength];
                                                    MyDict.Remove(f.ToString());
                                                    if (fs.Length == fs.Position)
                                                    {
                                                        msgContent.bEnd = 1;
                                                        data = Tool.StructToBytes(msgContent);
                                                        if (data.Length > 0)
                                                        {
                                                            i = server.Send(data, data.Length, 0);
                                                            MyDict.Add(f.ToString(), System.DateTime.Now);//最后一次发送成功,则标志写入字典
                                                            WriteDirectory(iniDicPath, MyDict);
                                                            break;
                                                        }
                                                    }
                                                    else
                                                    {
                                                        msgContent.bEnd = 0;
                                                        data = Tool.StructToBytes(msgContent);
                                                        if (data.Length > 0)
                                                            server.Send(data, data.Length, 0);                                                    while (server.Connected)
                                                        {
                                                            if (server.Available > 0)//从客户端接收消息
                                                            {
                                                                server.Receive(data, data.Length, 0);
                                                                bLinsten = true;
                                                                break;
                                                            }
                                                            else if (!bConnect)
                                                            {
                                                                fs.Close();
                                                                Log("接收端断开482");
                                                                return false;
                                                            }
                                                            Thread.Sleep(1);
                                                        }
                                                        CP2PMessage msgConAns = new CP2PMessage();
                                                        msgConAns = (CP2PMessage)Tool.BytesToStruct(data, msgConAns.GetType());
                                                        if (msgConAns.bReceive != 1)
                                                        {
                                                            break;
                                                        }
                                                    }
                                                }
                                                fs.Close();
    ////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////
    //接受端
    strAimfile = strAimPath[nIndex] + "\\" + msg.filePath;
                                        FileStream fs = new FileStream(strAimfile, FileMode.Create, FileAccess.Write,FileShare.Read);//如果文件不存在的话,新建一个。存在的话,直接写入。
                                        while (newsock.Connected)
                                        {
                                            if (newsock.Available > 0)
                                            {
                                                data = new Byte[1024 * 10];
                                                newsock.Receive(data, data.Length, 0);//从客户端接收消息
                                                bLinsten = true;
                                                CP2PMessage msgConReq = new CP2PMessage();
                                                msgConReq = (CP2PMessage)Tool.BytesToStruct(data, msgConReq.GetType());
                                                strContent += msgConReq.content;
                                                fs.Write(msgConReq.content, 0, msgConReq.content.Length);
                                                if (msgConReq.bEnd == 1)
                                                {
                                                    break;
                                                }                                            CP2PMessage msgConAns = new CP2PMessage();
                                                msgConAns.bReceive = 1;//表示收到包,请继续发
                                                data = Tool.StructToBytes(msgConAns);
                                                if (data.Length > 0)
                                                {
                                                    newsock.Send(data, data.Length, 0);
                                                }
                                            }
                                            if (!bConnect)
                                            {
                                                fs.Close();
                                                Log("发送断开278");
                                                return false;
                                            }
                                            Thread.Sleep(1);
                                        }
                                        fs.Close();
      

  6.   

    我描述的不对,应该说是memStream的长度要和发送前MemoryStream ms 的长度一致
      

  7.   

    还有在错误行之前加上memStream.Position = 0;
      

  8.   

    byte[] buffer = new byte[ms.Length];
    ms.Seek(0, SeekOrigin.Begin);
    ms.Read(buffer, 0, (int)ms.Length);
    ms.Close();