我练习做网络传送图片
问题1:为什么我收到的图片上部五分之一左右是漆黑一片?
问题2,接收端如何能知道发送端图片大小以便设定接收数组大小?谢谢!    界面很简单:
    1.发送端一个picturebox内有一幅图,一个button为发送按钮。
    2.接收端一个picturebox、一个button为接收按钮,接收后picturebox的image赋为传过来的图片。下面是源程序:
发送端:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim sendsocket As New Net.Sockets.Socket(Net.Sockets.AddressFamily.InterNetwork, Net.Sockets.SocketType.Stream, Net.Sockets.ProtocolType.Tcp) '实例化socket   
        Dim ipendpiont As New Net.IPEndPoint(Net.IPAddress.Parse("192.168.0.1"), 8888) '建立终结点
        
        Dim Stream As New IO.MemoryStream
        PictureBox1.Image.Save(Stream, System.Drawing.Imaging.ImageFormat.Bmp)
        Dim b As Byte() = Stream.ToArray        sendsocket.Connect(ipendpiont) '连接远程计算机
        sendsocket.Send(b) '发送
       
        Stream.Close()
        sendsocket.Shutdown(Net.Sockets.SocketShutdown.Send) '关闭发送连接
        sendsocket.Close() '关闭本
    End Sub
’接收端
    Dim receivesocket As New Net.Sockets.Socket(Net.Sockets.AddressFamily.InterNetwork, Net.Sockets.SocketType.Stream, Net.Sockets.ProtocolType.Tcp)    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim hostipendpiont As New Net.IPEndPoint(Net.IPAddress.Parse("192.168.0.1"), 8888)
        receivesocket.Bind(hostipendpiont)  '建立远程计算机的的socket
        receivesocket.Listen(2) '监听socket
    End Sub    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Try
            Dim b(1765106) As Byte ‘如何确定该数组大小
            Dim fs As New System.IO.MemoryStream
            Dim hostsocket As Net.Sockets.Socket = receivesocket.Accept()   '同意和发送端计算机建立连接
            hostsocket.Receive(b)
            fs.Write(b, 0, b.Length)            Dim Img As New Bitmap(fs)
            PictureBox1.Image = Img            fs.Close()
            hostsocket.Shutdown(Net.Sockets.SocketShutdown.Receive)
            hostsocket.Close()        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

解决方案 »

  1.   

    1)可能是你丢包引起的
    2)发送图片时,你可以自己定义一个结构,前面2字节用来指示图片长度.还原前面两字节为整数
    (第一字节<<8 ) + 第二字节
      

  2.   

    //获取p1的图片流
    System.IO.MemoryStream m=new MemoryStream();
    System.IO.MemoryStream m2=new MemoryStream();
    p1.Image.Save(m,System.Drawing.Imaging.ImageFormat.Jpeg);
    m.Flush();
    //转化成数组
    Byte[] b=m.ToArray();
    //中间可以传输数组
    //MessageBox.Show("数据大小为:"+ (b.Length/1024).ToString()+"KB");
    //接受
    m2.Write(b,0,b.Length);
    m2.Flush();
    Bitmap map=new Bitmap(m2);
    p2.Image=map;