namespace Test { using System; using System.Net; using System.Net.Sockets; using System.Text; using Microshaoft; public class AsyncSocketAsyncQueueHandlerProxyServer { public static int Main(String[] args) { AsyncSocketAsyncQueueHandlerProxyServer x = new AsyncSocketAsyncQueueHandlerProxyServer(); x.StartListening(); return 0; } public void StartListening() { //IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName()); IPAddress ipAddress; IPAddress.TryParse("127.0.0.1", out ipAddress); IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 12021); Socket listener = new Socket ( AddressFamily.InterNetwork , SocketType.Stream , ProtocolType.Tcp ); listener.Bind(localEndPoint); Console.WriteLine("Listening ..."); listener.Listen(10); int i = 0; while (true) { Socket proxySocket = listener.Accept(); //socket.Blocking = true; Console.WriteLine("accept"); Socket socket = new Socket ( AddressFamily.InterNetwork , SocketType.Stream , ProtocolType.Tcp ); socket.Blocking = true; socket.Connect("bbs.newsmth.net", 23); //连接 UserToken token = new UserToken(); token.userID = "handler"; SocketAsyncDataHandler<UserToken> handler = new SocketAsyncDataHandler<UserToken>(socket, token); handler.ReceiveDataBufferLength = 1; handler.ID = 0; handler.StartReceiveData(); UserToken token2 = new UserToken(); token2.userID = "proxy"; SocketAsyncDataHandler<UserToken> proxyHandler = new SocketAsyncDataHandler<UserToken>(proxySocket, token2); proxyHandler.ReceiveDataBufferLength = 1; proxyHandler.ID = i++; proxyHandler.StartReceiveData(); ProxyHandlersPair<UserToken> pair = new ProxyHandlersPair<UserToken>(handler, proxyHandler); pair.DataReceivedProxy += new ProxyHandlersPair<UserToken>.DataReceivedProxyEventHandler(pair_DataReceivedProxy); } } void pair_DataReceivedProxy(SocketAsyncDataHandler<UserToken> source, byte[] data, SocketAsyncDataHandler<UserToken> destination) { string s = Encoding.GetEncoding("gbk").GetString(data); Console.WriteLine("[source: {0}],[destination: {1}],[data: {2}],[length: {3}]", source.Token.userID, destination.Token.userID, s, data.Length); destination.SendDataAsync(data); } } public class UserToken { public string userID; } } namespace Microshaoft { using System; using System.Net.Sockets; using System.Text; using System.Threading; public class ProxyHandlersPair<T> { private SocketAsyncDataHandler<T> _proxyHandler; public SocketAsyncDataHandler<T> ProxyHandler { get { return _proxyHandler; } } private SocketAsyncDataHandler<T> _handler; public SocketAsyncDataHandler<T> Handler { get { return _handler; } } public delegate void DataReceivedProxyEventHandler ( SocketAsyncDataHandler<T> source , byte[] data , SocketAsyncDataHandler<T> destination ); public event DataReceivedProxyEventHandler DataReceivedProxy; public ProxyHandlersPair(SocketAsyncDataHandler<T> proxy, SocketAsyncDataHandler<T> handler) { _proxyHandler = proxy; _handler = handler; new Thread ( delegate() { StartProxyReceivedData(); } ).Start(); new Thread ( delegate() { StartReceivedData(); } ).Start(); } private void StartProxyReceivedData() { while (true) { int l = 1024; byte[] buffer = new byte[l]; int r = _proxyHandler.ReadData(buffer); if (r <= 0) { Thread.Sleep(100); continue; } if (r < l) { Array.Resize<byte>(ref buffer, r); } if (DataReceivedProxy != null) { DataReceivedProxy(_proxyHandler, buffer, _handler); } } } private void StartReceivedData() { while (true) { int l = 1024; byte[] buffer = new byte[l]; int r = _handler.ReadData(buffer); if (r <= 0) { Thread.Sleep(100); continue; } if (r < l) { Array.Resize<byte>(ref buffer, r); } if (DataReceivedProxy != null) { DataReceivedProxy(_handler, buffer, _proxyHandler); } } } public void handler_DataReceivedCompletedAsyncProcess(SocketAsyncDataHandler<T> sender, byte[] data) { if (DataReceivedProxy != null) { DataReceivedProxy(sender, data, _proxyHandler); } } } } namespace Microshaoft { using System; using System.Net.Sockets; using System.Collections.Generic; public class SocketAsyncDataHandler<T> { private LinkedList<byte[]> _receivedDataLinkedList = new LinkedList<byte[]>(); public delegate void DataEventHandler(SocketAsyncDataHandler<T> sender, byte[] data); public event DataEventHandler AsyncDataReceivedCompleted; private object _syncLockObject = new object(); private T _token; public T Token { get { return _token; } } public SocketAsyncDataHandler(Socket socket, T token) { _socket = socket; _token = token; } public int ReadData(byte[] buffer) { int l = buffer.Length; int p = 0; while (p < l) { if (_receivedDataLinkedList.Count <= 0) { break; } if (_receivedDataLinkedList.First == null) { break; } byte[] data = _receivedDataLinkedList.First.Value; int size = ((l - p) > data.Length ? data.Length : (l - p)); if ((l - p) >= data.Length) { lock (_syncLockObject) { _receivedDataLinkedList.RemoveFirst(); } } Buffer.BlockCopy(data, 0, buffer, p, size); if ((l - p) < data.Length) { byte[] newData = new byte[size]; Buffer.BlockCopy(data, data.Length - size, newData, 0, newData.Length); _receivedDataLinkedList.First.Value = newData; } p += size; } return p; } private Socket _socket; private int _id; public int ID { set { _id = value; } get { return _id; } } private int _receiveDataBufferLength = 1024; public int ReceiveDataBufferLength { set { _receiveDataBufferLength = value; } } public void SendData(byte[] data) { _socket.Send(data); } public void SendDataAsync(byte[] data) { SocketAsyncEventArgs e = new SocketAsyncEventArgs(); e.AcceptSocket = _socket; e.SetBuffer(data, 0, data.Length); _socket.SendAsync(e); } public void StartReceiveData() { SocketAsyncEventArgs e = new SocketAsyncEventArgs(); e.AcceptSocket = _socket; e.Completed += new EventHandler<SocketAsyncEventArgs>(ReceivedData_Completed); byte[] buffer = new byte[_receiveDataBufferLength]; e.SetBuffer(buffer, 0, buffer.Length); _socket.ReceiveAsync(e); } private void ReceivedData_Completed(object sender, SocketAsyncEventArgs e) { int l = e.BytesTransferred; if (l > 0) { byte[] data = new byte[l]; Buffer.BlockCopy(e.Buffer, 0, data, 0, data.Length); lock (_syncLockObject) { _receivedDataLinkedList.AddLast(data); } if (AsyncDataReceivedCompleted != null) { AsyncDataReceivedCompleted(this, data); } } _socket.ReceiveAsync(e); } } }