TcpListener - C#
Формулировка задачи:
можно примерчик сервера с использованием TcpListener? я не очень понимаю, вот вызвал ты Start, а дальше что? в цикле проверять Pending? а если асинхронно? там есть вроде асинхронные варианты, но я не вижу никаких событий у него, ведь асинхронность обычно связана с событиями которые вызываются например при подключении клиента (например как у Socket.AsyncAccept), а тут нету...
актуально!!!
Решение задачи: «TcpListener»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace learning3
{
class Server
{
byte[]buufer=new byte[1024];
private TcpListener listener;
public event EventHandler<DataEventArgs> ClientConnecting;
public Server()
{
listener = new TcpListener(new IPEndPoint(IPAddress.Any, 6565));
ClientConnecting += Server_ClientConnecting;
}
private async void Server_ClientConnecting(object sender, DataEventArgs e)
{
using (var str = e.Client.GetStream())
{
int count = await str.ReadAsync(buufer, 0, buufer.Length);
var data = buufer.Take(count).ToArray();
var ms = Encoding.Default.GetString(data);
Console.WriteLine(ms);
string res = "We got your massage " + ms;
await str.WriteAsync(Encoding.Default.GetBytes(res.ToCharArray()),0,res.Length);
}
}
public async Task Start()
{
listener.Start();
for(int i=0;i<200;i++)
{
TcpClient client = await listener.AcceptTcpClientAsync();
if (ClientConnecting != null)
{
var tmp = ClientConnecting;
tmp(this,new DataEventArgs(client));
}
}
}
}
class Client
{
TcpClient tcp=new TcpClient();
byte[]buffer=new byte[1024];
public Client()
{
tcp.Connect("localhost",6565);
using (var stream=tcp.GetStream())
{
string s = $"Hello.I am a new client,and my id {Guid.NewGuid()}";
byte[] send = Encoding.Default.GetBytes(s);
stream.Write(send,0,send.Length);
int length= stream.Read(buffer, 0, buffer.Length);
Console.BackgroundColor = ConsoleColor.DarkGray;
Console.WriteLine(Encoding.Default.GetString(buffer.Take(length).ToArray()));
Console.BackgroundColor = ConsoleColor.DarkGreen;
}
}
}
internal class DataEventArgs : EventArgs
{
public TcpClient Client { get; private set; }
public DataEventArgs(TcpClient t)
{
Client = t;
}
}
class Program
{
static void Main(string[] args)
{
Server ser=new Server();
Task t = ser.Start();
Client[] client = Enumerable.Range(0, 200).Select(i => new Client()).ToArray();
t.Wait();
Console.ReadKey();
}
}
}