首页 新闻 会员 周边 捐助

C# socket 客户端程序使用 NetworkStream 问题

0
悬赏园豆:50 [已解决问题] 解决于 2018-09-19 14:15

请问在 C# socket 客户端程序中,同一个 NetworkStream 是否既可以用于发送数据也可以用于接收数据?

dudu的主页 dudu | 高人七级 | 园豆:30948
提问于:2018-09-14 10:56
< >
分享
最佳答案
0

可以,networkstream是封装成了全双工的, 可以一边发一边收的。

收获园豆:30
天方 | 大侠五级 |园豆:5432 | 2018-09-18 22:54

的确可以,验证代码

class Program
{
    static async Task Main(string[] args)
    {
        var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        var sae = new SocketAsyncEventArgs();
        sae.RemoteEndPoint = new IPEndPoint(IPAddress.Loopback, 5678);

        using (var mres = new ManualResetEventSlim())
        {
            sae.Completed += (s, e) => mres.Set();
            if (socket.ConnectAsync(sae))
            {
                if (!mres.Wait(30))
                {
                    throw new TimeoutException("Could not connect to " + sae.RemoteEndPoint);
                }
            }
        }

        var stream = new NetworkStream(socket);
        ReadOnlyMemory<byte> buffer = Encoding.UTF8.GetBytes("Hello World!");
        Console.WriteLine("Sending data...");
        await stream.WriteAsync(buffer);

        Memory<byte> readBuffer = new byte[1024];
        await stream.ReadAsync(readBuffer);
        Console.WriteLine("Recieved data: " + Encoding.UTF8.GetString(readBuffer.Span));

        Console.Read();
        socket.Close();
    }
}
dudu | 园豆:30948 (高人七级) | 2018-09-19 14:14
其他回答(3)
0

好像我记得可以,2年前弄个

收获园豆:10
程序员修炼之旅 | 园豆:976 (小虾三级) | 2018-09-14 11:03
0

可以。但注意不要并发操作。http慢原因之一就是因为 等待接收这个过程耗时,http 你就可以认为是客户端 写 读的过程(服务器端反之)。

收获园豆:10
花飘水流兮 | 园豆:13615 (专家六级) | 2018-09-14 11:15
0

……du总

日暮青色 | 园豆:495 (菜鸟二级) | 2018-09-14 12:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册