通过网络上的套接字发送图像

时间:2015-04-04 20:13:59

标签: c# sockets

所以,我终于设法做了一个连接,但现在我试图通过服务器传递图像。

代码如下所示:

private void Form1_Load(object sender, EventArgs e)
    {
        //StartConnectionVideo();
    Client = new TcpClient();
     Client.Connect("10.0.0.3", 456);
     //Connect to 127.0.0.1 on port 3700
     readingThread = new Thread(new ThreadStart(StartReading));
     //Start a new thread to receive images

     readingThread.Start();
 }

private void StartReading()
    {
        while (true)
        {
            MessageBox.Show("D");
            NetworkStream stream = Client.GetStream();


                BinaryFormatter formatter = new BinaryFormatter();

                Image img = Image.FromStream(stream);
                MessageBox.Show("D");
                    //Deserialize the image from the NetworkStream

                    MessageBox.Show(img.Width.ToString());
                    pictureBox1.Image = img; //Show the image in the picturebox

              }

        }
    }

第一个消息框工作(循环后直接),但第二个消息。 它只是挂在这一行

        Image img = Image.FromStream(stream);

服务器端是这个..

      Image img=Image.FromFile(@"C:\Users\איתמר\Desktop\air\amumu_0.jpg");
        VideoServer a = new VideoServer(img ,this);
        a.StartListening();
        //a.padre.pictureBox1.Image = img;
        a.SendImage(img);
videoerver是我写的一个类...我会在这里写出主要的重要代码

    public void StartListening()
    {
        // Create the TCP listener object using the IP of the server and the specified port
        tlsClient = new TcpListener (IPAddress.Any, 456);

        // Start the TCP listener and listen for connections
        tlsClient.Start();

        // The while loop will check for true in this before checking for connections
        ServRunning = true;

        thrListener = new Thread(KeepListening);
        thrListener.Start();

    }  

   public void SendImage(Image img)
    {
        for (int i = 0; i < ClientList.Count; i++)
        {
            TcpClient tempClient = (TcpClient)ClientList[i];
            if (tempClient.Connected) //If the client is connected
            {

                BinaryFormatter formatter = new BinaryFormatter();


                formatter.Serialize(tempClient.GetStream(), img);
                //Serialize the image to the tempClient NetworkStream
            }
            else
            {
                ClientList.Remove(tempClient);
                i--;
            }

        }

我想我已经展示了主要代码......其余部分并不是那么重要,因为im prettry确定问题出现在这段代码中......

我赞美你们的任何帮助,让我们在一周内打破了我的头脑:D

1 个答案:

答案 0 :(得分:0)

您正在使用BinaryFormatter序列化图片,但使用Image.FromStream对其进行反序列化。这是两种不兼容的格式。您必须两次使用相同的格式。

据我所知,Image.FromStream没有记录以应对无限流。事实上,我非常确定它并不是因为原则上它不能避免读取两个(除非它是按字节方式读取,这是一场性能噩梦)。因此,您无法直接使用Image.FromStream

我首先将图片转换为byte[]MemoryStream。然后我首先写出图像数据的长度,然后写入数据。长度前缀是序列化事物的常用方法。

或者,使用更高级别的抽象,例如protobuf。