如何在 UWP 项目中使用套接字发送文件的 byte[]?
How to send file's byte[] using sockets in a UWP project?
我在这里 https://msdn.microsoft.com/en-us/windows/uwp/networking/sockets 使用了 Microsoft 的这个样本来将数据从一个发送到另一个并且它有效。
但是,如何使用套接字发送字节 [] 或流(例如图像或视频)?
服务器:
private async void btnConnect_Click(object sender, RoutedEventArgs e)
{
try
{
StreamSocketListener socketListener = new StreamSocketListener();
socketListener.ConnectionReceived += SocketListener_ConnectionReceived;
Windows.Networking.HostName host = new Windows.Networking.HostName("192.168.1.4");
await socketListener.BindEndpointAsync(host, 8887.ToString());
}
catch (Exception ex)
{
//Handle exception.
}
}
private async void SocketListener_ConnectionReceived(StreamSocketListener sender,
StreamSocketListenerConnectionReceivedEventArgs args)
{
Stream inStream = args.Socket.InputStream.AsStreamForRead();
StreamReader reader = new StreamReader(inStream);
string request = await reader.ReadLineAsync();
Stream outStream = args.Socket.OutputStream.AsStreamForWrite();
StreamWriter writer = new StreamWriter(outStream);
await writer.WriteLineAsync(request);
await writer.FlushAsync();
}
客户:
private async void btnSend_Click(object sender, RoutedEventArgs e)
{
try
{
Windows.Networking.Sockets.StreamSocket socket = new Windows.Networking.Sockets.StreamSocket();
Windows.Networking.HostName serverHost = new Windows.Networking.HostName("192.168.1.4");
string serverPort = "8887";
await socket.ConnectAsync(serverHost, serverPort);
Stream streamOut = socket.OutputStream.AsStreamForWrite();
StreamWriter writer = new StreamWriter(streamOut);
string request = "test";
await writer.WriteLineAsync(request);
await writer.FlushAsync();
//Read data from the echo server.
Stream streamIn = socket.InputStream.AsStreamForRead();
StreamReader reader = new StreamReader(streamIn);
string response = await reader.ReadLineAsync();
}
catch (Exception ex)
{
//Handle exception here.
}
}
使用 Stream 的 Write
方法允许您传入字节数组。
streamOut.Write(myByteArray, 0, myByteArray.Length);
StreamWriter
更像是一个帮手。您不需要 StreamReader 或 StreamWriter 即可 read/write 到 Stream。他们很有帮助,但实际上并没有做你想做的事。
请记住,您可能不想一次发送大量款项。在那种情况下,您将循环直到完成所有发送。参考这个问题:sending a large amount of data throught TCP socket
我在这里 https://msdn.microsoft.com/en-us/windows/uwp/networking/sockets 使用了 Microsoft 的这个样本来将数据从一个发送到另一个并且它有效。 但是,如何使用套接字发送字节 [] 或流(例如图像或视频)?
服务器:
private async void btnConnect_Click(object sender, RoutedEventArgs e)
{
try
{
StreamSocketListener socketListener = new StreamSocketListener();
socketListener.ConnectionReceived += SocketListener_ConnectionReceived;
Windows.Networking.HostName host = new Windows.Networking.HostName("192.168.1.4");
await socketListener.BindEndpointAsync(host, 8887.ToString());
}
catch (Exception ex)
{
//Handle exception.
}
}
private async void SocketListener_ConnectionReceived(StreamSocketListener sender,
StreamSocketListenerConnectionReceivedEventArgs args)
{
Stream inStream = args.Socket.InputStream.AsStreamForRead();
StreamReader reader = new StreamReader(inStream);
string request = await reader.ReadLineAsync();
Stream outStream = args.Socket.OutputStream.AsStreamForWrite();
StreamWriter writer = new StreamWriter(outStream);
await writer.WriteLineAsync(request);
await writer.FlushAsync();
}
客户:
private async void btnSend_Click(object sender, RoutedEventArgs e)
{
try
{
Windows.Networking.Sockets.StreamSocket socket = new Windows.Networking.Sockets.StreamSocket();
Windows.Networking.HostName serverHost = new Windows.Networking.HostName("192.168.1.4");
string serverPort = "8887";
await socket.ConnectAsync(serverHost, serverPort);
Stream streamOut = socket.OutputStream.AsStreamForWrite();
StreamWriter writer = new StreamWriter(streamOut);
string request = "test";
await writer.WriteLineAsync(request);
await writer.FlushAsync();
//Read data from the echo server.
Stream streamIn = socket.InputStream.AsStreamForRead();
StreamReader reader = new StreamReader(streamIn);
string response = await reader.ReadLineAsync();
}
catch (Exception ex)
{
//Handle exception here.
}
}
使用 Stream 的 Write
方法允许您传入字节数组。
streamOut.Write(myByteArray, 0, myByteArray.Length);
StreamWriter
更像是一个帮手。您不需要 StreamReader 或 StreamWriter 即可 read/write 到 Stream。他们很有帮助,但实际上并没有做你想做的事。
请记住,您可能不想一次发送大量款项。在那种情况下,您将循环直到完成所有发送。参考这个问题:sending a large amount of data throught TCP socket