带有await / async c#5.0的套接字客户端+服务器 [英] sockets client+server with await/async c# 5.0
本文介绍了带有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屋!
查看全文