TO kosterorc а что тебе мешает использовать асинхронные методы BeginAccept и EndAccept вот примеры прог где всё выполняется в разных потоках
сервер
| Код | using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading;
namespace AsyncServer { class Program { public static byte[] buffer = new byte[1024]; public static ManualResetEvent SocketEvent = new ManualResetEvent(false); public static string content = String.Empty; static void Main(string[] args) { Console.WriteLine("идентификатор потока ID: " + AppDomain.GetCurrentThreadId().ToString()); byte[] bytes=new byte[1024];
IPHostEntry ipHost = Dns.Resolve(Dns.GetHostName()); IPAddress ipAdd = ipHost.AddressList[0]; IPEndPoint endPoint = new IPEndPoint(ipAdd, 11000);
Socket sListerner = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); sListerner.Bind(endPoint); sListerner.Listen(10); Console.WriteLine("ожидание соединения"); AsyncCallback callback = new AsyncCallback(Acceptcallback); sListerner.BeginAccept(callback, sListerner); SocketEvent.WaitOne(); Console.ReadLine(); } public static void Acceptcallback(IAsyncResult ar) { Console.WriteLine("идентификатор потока Acceptcallback ID: " + AppDomain.GetCurrentThreadId().ToString()); Socket sListern = (Socket)ar.AsyncState; Socket handler = sListern.EndAccept(ar); handler.BeginReceive(buffer, 0, buffer.Length, 0, new AsyncCallback(Receivecallback), handler); } public static void Receivecallback(IAsyncResult ar) { Console.WriteLine("идентификатор потока Receive ID: " + AppDomain.GetCurrentThreadId()); Socket handler = (Socket)ar.AsyncState; int byteread = handler.EndReceive(ar); if (byteread > 0) { content += Encoding.Unicode.GetString(buffer, 0, byteread); if (content.LastIndexOf("<TheEnd>") > -1) { Console.WriteLine("прочтено {0} байтов; мессага\n{1}", content.Length, content); byte[] byteData = Encoding.Unicode.GetBytes(content); handler.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(Sendcallback), handler); } else { handler.BeginReceive(buffer, 0, buffer.Length, 0, new AsyncCallback(Receivecallback), handler); } } } public static void Sendcallback(IAsyncResult ar) { Console.WriteLine("идентификатор потока Send ID: " + AppDomain.GetCurrentThreadId()); Socket handler = (Socket)ar.AsyncState; int byteSend = handler.EndSend(ar); Console.WriteLine("отправлено {0} байт клиенту",byteSend); handler.Shutdown(SocketShutdown.Both); handler.Close(); SocketEvent.Set(); } } }
|
клиент
| Код | using System; using System.Collections.Generic; using System.Text; using System.Threading; using System.Net; using System.Net.Sockets;
namespace AsyncClient { class Program { public static string theResponse = ""; public static byte[] bufer = new byte[1024];
public static ManualResetEvent ConnectDone = new ManualResetEvent(false); public static ManualResetEvent SendDone = new ManualResetEvent(false); public static ManualResetEvent ReceiveDone = new ManualResetEvent(false); static void ConnectCallBack(IAsyncResult ar) { Thread thr = Thread.CurrentThread; Console.WriteLine("состояние потока в калбеке Connect: " + thr.ThreadState); Socket sClient = (Socket)ar.AsyncState; sClient.EndConnect(ar); Console.WriteLine("сокет подсоеденился к удалённой точке: " + sClient.RemoteEndPoint.ToString()); ConnectDone.Set(); }
static void SendCallBack(IAsyncResult ar) { Thread thr = Thread.CurrentThread; Console.WriteLine("состояние потока в калбеке Send: " + thr.ThreadState); Socket sClient = (Socket)ar.AsyncState; int bytesend = sClient.EndSend(ar); Console.WriteLine("было отправлено: " + bytesend.ToString()+" байт"); SendDone.Set(); }
static void ReceiveCallBack(IAsyncResult ar) { Thread thr = Thread.CurrentThread; Console.WriteLine("состояние потока в калбеке Receive: " + thr.ThreadState); Socket sClient = (Socket)ar.AsyncState; int receivebyte = sClient.EndReceive(ar); if (receivebyte > 0) { theResponse += Encoding.Unicode.GetString(bufer, 0, receivebyte); sClient.BeginReceive(bufer, 0, bufer.Length, 0, new AsyncCallback(ReceiveCallBack), sClient); } else { ReceiveDone.Set(); } }
static void Main(string[] args) { try { Thread thr = Thread.CurrentThread; Console.WriteLine("состояние главного потока: ", thr.ThreadState); IPHostEntry ipHost = Dns.Resolve("127.0.0.1"); IPAddress ipAdd = ipHost.AddressList[0]; IPEndPoint endPoint = new IPEndPoint(ipAdd, 11000); Socket sClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sClient.BeginConnect(endPoint, new AsyncCallback(ConnectCallBack), sClient); ConnectDone.WaitOne(); string data = "Это тест"; for (int i = 0; i < 72; i++) { data += i.ToString() + ":" + (new string('=', i)); } byte[] byteData = Encoding.Unicode.GetBytes(data + "<TheEnd>"); sClient.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallBack), sClient); for (int i = 0; i < 5; i++) { //типа тут мы пожираем ресурсы пока ждём ответа от сервера Console.WriteLine(i.ToString()); Thread.Sleep(10); } SendDone.WaitOne(); sClient.BeginReceive(bufer, 0, bufer.Length, 0, new AsyncCallback(ReceiveCallBack), sClient); ReceiveDone.WaitOne(); Console.WriteLine("было принято: "+ theResponse); sClient.Shutdown(SocketShutdown.Both); sClient.Close(); } catch (Exception e) { Console.WriteLine(e.ToString()); } Console.ReadLine(); } } }
|
вроде всё |