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