带有await / async c#5.0的套接字客户端+服务器 [英] sockets client+server with await/async c# 5.0

查看:152
本文介绍了带有await / async c#5.0的套接字客户端+服务器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好,我尝试编写一个简单的异步客户端/服务器应用程序。我知道如何使用回调,但我想调用如何使用await / async和c#5.0编写客户端+服务器。请帮我。应该很简单。只连接和传输一些字节。

我知道这可以使用任务完成。

这样的东西:

Hello, i try to write a simple asynchronous client/server apps. I know how do it using callback, but i want to invistigate how write client+server using await/async and c# 5.0. Please, help me. It should be simple. Only connect and transfer some bytes.
I know that this can be done using Tasks.
Something like this:

public static Task ConnectAsync(this Socket socket, EndPoint remoteEP)
        {
            return Task.Factory.FromAsync(socket.BeginConnect, socket.EndConnect, remoteEP, null);
        }



我试着找一些例子,但这没有效果。

仅供参考。没有tcplistener和NetworkStream。


I try to find some examples, but this has no effect.
FYI. without tcplistener and NetworkStream.

推荐答案

现在服务器可以发送到客户端数组的字节。但是客户只收到了1次迭代。我该怎么做,如果客户端连接,那么它总是从服务器接收信息?

服务器:

now server can send to client array of byte. But client recieved only 1 iteration. How i can do, that if client connected then it always recieve information from server?
Server:
public ServerSocket(IPAddress ipAddress, int port)
        {
            _server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            _server.Bind(new IPEndPoint(ipAddress, port));
            _server.Listen(20);
            Console.WriteLine("Wait connection");
            Accept();
        }
        private async Task StartSend(int i)
        {
            try
            {
                CodingImage img = new CodingImage();
                var buffer = img.CodingImages("C:\\image\\file"+i+".bmp");
                Task<int> senTask = SendAsync.AsyncSend(client, buffer, 0, buffer.Length);
            }
            catch(Exception ex)
            {

            }
        }
        private async void Accept()
        {
            for (int i = 0 ;i<14 ;i++ )
            {
                client = await Task.Factory.FromAsync<socket>(_server.BeginAccept, _server.EndAccept, true);
                Console.WriteLine("Connected");
                await StartSend(i);

            }
        }

public static Task<int> AsyncSend(this Socket socket, byte[] buffer, int offset, int count)
        {
            return Task.Factory.FromAsync<int>(
                socket.BeginSend(buffer, offset, count, SocketFlags.None, null, socket),
                socket.EndSend);
        }
</int></int></socket></int>





客户:





Client:

private async void Form1_Load(object sender, EventArgs e)
        {
            IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
            IPAddress ipAddress = ipHostInfo.AddressList[0];
            ClientSocket cs = new ClientSocket();
            await cs.Connect(ipAddress, 11000);
            //await cs.StartRecieve();
        }
public ClientSocket()
        {
            _client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        }
        public async Task Connect(IPAddress ipAddress, int port)
        {
            _client.Connect(ipAddress, port);
            if (!_client.Connected)
            {
                Console.WriteLine("Can't connect");
            }else
            Console.WriteLine("Connected");
            int i=0;
            while(i<14)
            {
                await StartRecieve(i);
                i++;
            }
        }
        public async Task StartRecieve(int i)
        {
            try
            {
                var buffer = new byte[999999];
                //Console.WriteLine("Картинка под номером {0} сохранена", i);
                buffer2 = await _client.ReceiveTaskAsync(buffer,0,buffer.Length);
                EncodingImage enc = new EncodingImage();
                enc.EncodingImageForRecievedBuffer(buffer, i);
                Console.WriteLine("Картинка под номером {0} сохранена", i);
            }
            catch (Exception ex)
            {
            }
        }


连接成功。但是如何发送字节,我不知道

Connect success. But how to send bytes, i don't know
private readonly Socket _server;
        public ServerSocket(IPAddress ipAddress, int port)
        {
            _server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            _server.Bind(new IPEndPoint(ipAddress, port));
            _server.Listen(20);
            Console.WriteLine("Wait connection");
            Accept();
        }
        private async void Accept()
        {
            for (; ; )
            {
                var socket = await Task.Factory.FromAsync<Socket>(_server.BeginAccept, _server.EndAccept, true);
                Console.WriteLine("Connected");
            }
        }


这篇关于带有await / async c#5.0的套接字客户端+服务器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆