Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用C通过套接字发送和接收图像#_C#_Sockets - Fatal编程技术网

C# 使用C通过套接字发送和接收图像#

C# 使用C通过套接字发送和接收图像#,c#,sockets,C#,Sockets,我正在尝试用C语言设置两个程序。基本上,是一个简单的客户机服务器,我希望服务器在其中侦听来自客户机的映像。然后,在收到图像后,会将其显示在一个PictureBox中 我一直遇到以下错误: 类型的第一次机会例外 中发生“System.ArgumentException” System.Drawing.dll 此错误发生在侦听此行的服务器代码上: Image bmp=Image.FromStream(ms); 有什么想法吗 侦听的服务器代码: using System; using System.C

我正在尝试用C语言设置两个程序。基本上,是一个简单的客户机服务器,我希望服务器在其中侦听来自客户机的映像。然后,在收到图像后,会将其显示在一个PictureBox中

我一直遇到以下错误:

类型的第一次机会例外 中发生“System.ArgumentException” System.Drawing.dll

此错误发生在侦听此行的服务器代码上: Image bmp=Image.FromStream(ms); 有什么想法吗

侦听的服务器代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net;
using System.Net.Sockets;

namespace NetView
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            startListening();
        }

        private void startListening()
        {
            ////////////////////////////////////////////

            Console.WriteLine("Server is starting...");
            byte[] data = new byte[1024];
            IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);

            Socket newsock = new Socket(AddressFamily.InterNetwork,
                            SocketType.Stream, ProtocolType.Tcp);

            newsock.Bind(ipep);
            newsock.Listen(10);
            Console.WriteLine("Waiting for a client...");

            Socket client = newsock.Accept();
            IPEndPoint newclient = (IPEndPoint)client.RemoteEndPoint;
            Console.WriteLine("Connected with {0} at port {1}",
                            newclient.Address, newclient.Port);

            while (true)
            {
                data = ReceiveVarData(client);
                MemoryStream ms = new MemoryStream(data);
                try
                {
                    Image bmp = Image.FromStream(ms);
                    pictureBox1.Image = bmp;
                }
                catch (ArgumentException e)
                {
                    Console.WriteLine("something broke");
                }


                if (data.Length == 0)
                    newsock.Listen(10);
            }
            //Console.WriteLine("Disconnected from {0}", newclient.Address);
            client.Close();
            newsock.Close();
            /////////////////////////////////////////////

        }

        private static byte[] ReceiveVarData(Socket s)
        {
            int total = 0;
            int recv;
            byte[] datasize = new byte[4];

            recv = s.Receive(datasize, 0, 4, 0);
            int size = BitConverter.ToInt32(datasize, 0);
            int dataleft = size;
            byte[] data = new byte[size];


            while (total < size)
            {
                recv = s.Receive(data, total, dataleft, 0);
                if (recv == 0)
                {
                    break;
                }
                total += recv;
                dataleft -= recv;
            }
            return data;
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

    }
}
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.Linq;
使用系统文本;
使用System.Windows.Forms;
使用System.IO;
Net系统;
使用System.Net.Sockets;
名称空间网络视图
{
公共部分类Form1:Form
{
公共表格1()
{
初始化组件();
惊人的倾听();
}
私人监听()
{
////////////////////////////////////////////
WriteLine(“服务器正在启动…”);
字节[]数据=新字节[1024];
IPEndPoint ipep=新IPEndPoint(IPAddress.Any,9050);
Socket newsock=新套接字(AddressFamily.InterNetwork,
流,ProtocolType.Tcp);
Newstock.Bind(ipep);
听(10);
Console.WriteLine(“等待客户…”);
套接字客户端=newsock.Accept();
IPEndPoint newclient=(IPEndPoint)client.RemoteEndPoint;
WriteLine(“在端口{1}与{0}连接”,
newclient.Address,newclient.Port);
while(true)
{
数据=接收变量数据(客户);
MemoryStream ms=新的MemoryStream(数据);
尝试
{
Image bmp=Image.FromStream(ms);
pictureBox1.Image=bmp;
}
捕获(e)
{
控制台。写线(“东西坏了”);
}
如果(data.Length==0)
听(10);
}
//WriteLine(“从{0}断开连接”,newclient.Address);
client.Close();
newsock.Close();
/////////////////////////////////////////////
}
专用静态字节[]ReceiveVarData(套接字)
{
int-total=0;
int recv;
字节[]数据大小=新字节[4];
recv=s.Receive(数据大小,0,4,0);
int size=BitConverter.ToInt32(数据大小,0);
int dataleft=大小;
字节[]数据=新字节[大小];
while(总尺寸<尺寸)
{
recv=s.Receive(数据,总计,数据左侧,0);
如果(recv==0)
{
打破
}
总+=recv;
dataleft-=recv;
}
返回数据;
}
私有void Form1\u加载(对象发送方、事件参数e)
{
}
}
}
客户端代码:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Drawing;
using System.IO;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            byte[] data = new byte[1024];
            int sent;
            IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);

            Socket server = new Socket(AddressFamily.InterNetwork,
                            SocketType.Stream, ProtocolType.Tcp);

            try
            {
                server.Connect(ipep);
            }
            catch (SocketException e)
            {
                Console.WriteLine("Unable to connect to server.");
                Console.WriteLine(e.ToString());
                Console.ReadLine();
            }


            Bitmap bmp = new Bitmap("c:\\eek256.jpg");

            MemoryStream ms = new MemoryStream();
            // Save to memory using the Jpeg format
            bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);

            // read to end
            byte[] bmpBytes = ms.GetBuffer();
            bmp.Dispose();
            ms.Close();

            sent = SendVarData(server, bmpBytes);

            Console.WriteLine("Disconnecting from server...");
            server.Shutdown(SocketShutdown.Both);
            server.Close();
            Console.ReadLine();
        }

        private static int SendVarData(Socket s, byte[] data)
        {
            int total = 0;
            int size = data.Length;
            int dataleft = size;
            int sent;

            byte[] datasize = new byte[4];
            datasize = BitConverter.GetBytes(size);
            sent = s.Send(datasize);

            while (total < size)
            {
                sent = s.Send(data, total, dataleft, SocketFlags.None);
                total += sent;
                dataleft -= sent;
            }
            return total;
        }
    }
}
使用系统;
Net系统;
使用System.Net.Sockets;
使用系统文本;
使用系统图;
使用System.IO;
命名空间控制台应用程序2
{
班级计划
{
静态void Main(字符串[]参数)
{
字节[]数据=新字节[1024];
int发送;
IPEndPoint ipep=新的IPEndPoint(IPAddress.Parse(“127.0.0.1”),9050;
套接字服务器=新套接字(AddressFamily.InterNetwork,
流,ProtocolType.Tcp);
尝试
{
服务器连接(ipep);
}
捕获(SocketException e)
{
Console.WriteLine(“无法连接到服务器”);
Console.WriteLine(如ToString());
Console.ReadLine();
}
位图bmp=新位图(“c:\\eek256.jpg”);
MemoryStream ms=新的MemoryStream();
//使用Jpeg格式保存到内存
保存(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
//通读
字节[]bmpBytes=ms.GetBuffer();
bmp.Dispose();
Close女士();
sent=SendVarData(服务器,字节);
Console.WriteLine(“从服务器断开连接…”);
server.Shutdown(SocketShutdown.Both);
server.Close();
Console.ReadLine();
}
私有静态int-SendVarData(套接字,字节[]数据)
{
int-total=0;
int size=data.Length;
int dataleft=大小;
int发送;
字节[]数据大小=新字节[4];
datasize=BitConverter.GetBytes(大小);
sent=s.Send(数据大小);
while(总尺寸<尺寸)
{
sent=s.Send(数据、总计、dataleft、SocketFlags.None);
总数+=已发送;
dataleft-=已发送;
}
返回总数;
}
}
}

ArgumentException告诉您流中的图像格式无效。这可能是因为客户端应用程序在发送数据之前关闭了内存流

尝试替换
byte[]bmpBytes=ms.GetBuffer()带有

byte[] bmpBytes = ms.ToArray();
或者在发送数据后关闭流


请记住,
.GetBuffer()
返回的字节数组返回的是底层数组,而不是它的副本(
.ToArray()
返回一个副本),只要父流是有效的。

使用Arul的代码来正确发送数据——您想要的是.ToArray(),而不是.GetBuffer()。然后,您需要在后台线程o上运行服务器的'startListening'方法
var t = new Thread(startListening);
t.IsBackground = true;
t.start();
        TcpClient client = new TcpClient();  
        try  
        {    
            client.Connect(address, port); 

            // Retrieve the network stream.  
            NetworkStream stream = client.GetStream();  
            MessageData data = new MessageData(imageToSend); 

            IFormatter formatter = new BinaryFormatter();

            while(true)
            {
                formatter.Serialize(stream, data);
                Thread.Sleep(1000);
                data.GetNewImage();
            }    
        } 
        TcpListener listener = new TcpListener(address, port);
        listener.Start();

        try
        { 
            using (TcpClient client = listener.AcceptTcpClient())
            {
                stream = client.GetStream();

                IFormatter formatter = new BinaryFormatter();
                while (true)
                {
                    MessageData data = (MessageData)formatter.Deserialize(stream);

                    if (ImageReceivedEvent != null) ImageReceivedEvent(data.Picture);
                }
            }
        }
    delegate void showMessageInThread(string message);
    UdpClient listener = null;
    IPEndPoint endpoint = null;
    Thread listenThread = null;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private void button1_Click(object sender, EventArgs e)
    {
        startServer();
    }
    private void startServer()
    {
        endpoint = new IPEndPoint(IPAddress.Any, 1234);
        listener = new UdpClient(endpoint);
        ShowMsg("Waiting for a client!");

        listenThread = new Thread(new ThreadStart(Listening));
        listenThread.Start();
    }
    private void Listening()
    {
        while (true)
        {
            //take the coming data
            byte[] comingDataFromClient = listener.Receive(ref endpoint);
            ImageConverter convertData = new ImageConverter();
            Image image =  (Image)convertData.ConvertFrom(comingDataFromClient);
            pictureBox1.Image = image;
        }
   private void ShowMsg(string msg)
   {
      this.richTextBox1.Text += msg + "\r\n";
   }
   Socket server = null;
    MemoryStream ms;
    IPEndPoint endpoint = null;
    public Form1()
    {
        InitializeComponent();
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        server = new Socket(AddressFamily.InterNetwork,
            SocketType.Dgram, ProtocolType.Udp);
        endpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1234);
    }
    private void btn_browse_Click(object sender, EventArgs e)
    {
        openFileDialog1.ShowDialog();
        string path = openFileDialog1.FileName;
        pictureBox1.Image = Image.FromFile(path);
        textPath.Text = path;
    }
    private void btn_send_Click(object sender, EventArgs e)
    {
        try
        {                
            ms = new MemoryStream();
            Bitmap bmp = new Bitmap(this.openFileDialog1.FileName);
            bmp.Save(ms, ImageFormat.Jpeg);
            byte[] byteArray = ms.ToArray();

            server.Connect(endpoint);
            server.SendTo(byteArray, endpoint);

            }
        }
        catch (Exception ex)
        {

        }