C# 如何为套接字传输序列化媒体对象(音频和图片)?
我希望我的应用程序能够通过套接字与pc客户端通信。 我已经知道如何处理字符串了 我的问题是,我想能够发送音频文件和图片,如何将iamge/音频文件转换为字符串/位流并发送 下面是我的套接字类:C# 如何为套接字传输序列化媒体对象(音频和图片)?,c#,silverlight,sockets,windows-phone-7,C#,Silverlight,Sockets,Windows Phone 7,我希望我的应用程序能够通过套接字与pc客户端通信。 我已经知道如何处理字符串了 我的问题是,我想能够发送音频文件和图片,如何将iamge/音频文件转换为字符串/位流并发送 下面是我的套接字类: public class SocketClient { Socket socket = null; static ManualResetEvent clientDone = new ManualResetEvent(false); const int TIMEOUT_MILLISE
public class SocketClient
{
Socket socket = null;
static ManualResetEvent clientDone = new ManualResetEvent(false);
const int TIMEOUT_MILLISECONDS = 5000;
const int MAX_BUFFER_SIZE = 2048;
public SocketClient()
{
socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
}
public string Send(string serverName, int portNumber, string data)
{
string response = "Timeout";
if (socket != null)
{
SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
socketEventArg.RemoteEndPoint = new DnsEndPoint(serverName, portNumber);
socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
{
response = e.SocketError.ToString();
clientDone.Set();
});
byte[] payload = Encoding.UTF8.GetBytes(data);
socketEventArg.SetBuffer(payload, 0, payload.Length);
clientDone.Reset();
socket.SendToAsync(socketEventArg);
clientDone.WaitOne(TIMEOUT_MILLISECONDS);
}
else
{
response = "not initialized";
}
return response;
}
public string Recieve(int portNumber)
{
string response = "Timeout";
if (socket != null)
{
SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
socketEventArg.SetBuffer(new Byte[MAX_BUFFER_SIZE], 0, MAX_BUFFER_SIZE);
socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
{
if (e.SocketError == SocketError.Success)
{
response = Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred);
response.Trim('\0');
}
else
{
response = e.SocketError.ToString();
}
clientDone.Set();
});
socketEventArg.RemoteEndPoint = new IPEndPoint(IPAddress.Any, portNumber);
clientDone.Reset();
socket.ReceiveFromAsync(socketEventArg);
clientDone.WaitOne(TIMEOUT_MILLISECONDS);
}
return response;
}
public void Close()
{
socket.Close();
}
}
公共类SocketClient
{
套接字=空;
静态ManualResetEvent客户端完成=新的ManualResetEvent(错误);
const int TIMEOUT_毫秒=5000;
const int MAX_BUFFER_SIZE=2048;
公共SocketClient()
{
套接字=新套接字(AddressFamily.InterNetwork、SocketType.Dgram、ProtocolType.Udp);
}
公共字符串发送(字符串服务器名、int端口号、字符串数据)
{
字符串响应=“超时”;
if(套接字!=null)
{
SocketAsyncEventArgs socketEventArg=新的SocketAsyncEventArgs();
SocketEventTarget.RemoteEndPoint=新的DnsEndPoint(服务器名、端口号);
SocketEventTarget.Completed+=新事件处理程序(委托(对象s,SocketAsyncEventArgs e)
{
响应=e.SocketError.ToString();
clientDone.Set();
});
byte[]有效负载=Encoding.UTF8.GetBytes(数据);
SocketEventTarget.SetBuffer(有效载荷,0,有效载荷.长度);
clientDone.Reset();
socket.SendToAsync(socketEventArg);
clientDone.WaitOne(超时\u毫秒);
}
其他的
{
response=“未初始化”;
}
返回响应;
}
公共字符串接收(int端口号)
{
字符串响应=“超时”;
if(套接字!=null)
{
SocketAsyncEventArgs socketEventArg=新的SocketAsyncEventArgs();
SocketEventTarget.SetBuffer(新字节[最大缓冲区大小],0,最大缓冲区大小);
SocketEventTarget.Completed+=新事件处理程序(委托(对象s,SocketAsyncEventArgs e)
{
如果(e.SocketError==SocketError.Success)
{
response=Encoding.UTF8.GetString(e.Buffer,e.Offset,e.bytesttransfered);
响应。修剪('\0');
}
其他的
{
响应=e.SocketError.ToString();
}
clientDone.Set();
});
SocketEventTarget.RemoteEndPoint=新的IPEndPoint(IPAddress.Any,端口号);
clientDone.Reset();
socket.receivefromsync(socketEventArg);
clientDone.WaitOne(超时\u毫秒);
}
返回响应;
}
公众假期结束()
{
socket.Close();
}
}
我想修改它,以便能够发送图片和音频文件。您当前的发送方法对数据使用字符串属性。您可以使用包含数据的字节数组或流来重新构建它 您可以使用此示例来了解如何从映像到流和流,尽管这不使用套接字,而是使用本地存储。关于如何做到这一点的原则保持不变: