所以,我终于设法做了一个连接,但现在我试图通过服务器传递图像。
代码如下所示:
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
答案 0 :(得分:0)
您正在使用BinaryFormatter
序列化图片,但使用Image.FromStream
对其进行反序列化。这是两种不兼容的格式。您必须两次使用相同的格式。
据我所知,Image.FromStream
没有记录以应对无限流。事实上,我非常确定它并不是因为原则上它不能避免读取两个(除非它是按字节方式读取,这是一场性能噩梦)。因此,您无法直接使用Image.FromStream
。
我首先将图片转换为byte[]
或MemoryStream
。然后我首先写出图像数据的长度,然后写入数据。长度前缀是序列化事物的常用方法。
或者,使用更高级别的抽象,例如protobuf。