zoukankan      html  css  js  c++  java
  • C# socket 请求转发

    服务端:

    void Main()
    {
        Socket socketA = null;
        Socket socketB = null;
        var maxWaitingRequest = 10;
        var localSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        localSocket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReuseAddress,true);
        localSocket.Bind(new IPEndPoint(IPAddress.Any, 81));
        localSocket.Listen(maxWaitingRequest);
        while (true)
        {
            var remoteSocket = localSocket.Accept();
            if (socketA == null)    //client
                socketA = remoteSocket;
            else if (socketB == null)   //server
            {
                socketB = remoteSocket;
                ThreadPool.QueueUserWorkItem(new WaitCallback(transfer), new Socket[] { socketA, socketB });
                ThreadPool.QueueUserWorkItem(new WaitCallback(transfer), new Socket[] { socketB, socketA });
            }
        }
    }
    
    public static void transfer(object obj)
    {
        var socketA = ((Socket[])obj)[0];
        var socketB = ((Socket[])obj)[1];
        while (true)
        {
            try
            {
                var data = new byte[10240];
                int read = socketA.Receive(data);
                if(read > 0)
                    socketB.Send(data.Take(read).ToArray());
            }
            catch
            {
                socketA.Close();
                socketA.Close();
                break;
            }
        }
    }

    客户端:

    static Queue<string> msgList = new Queue<string>();
    static readonly object msgLocker = new Object();
    static int localPort = 20000;
    static string msg = "I am A";
    
    void Main()
    {
        var localSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        var localEP = new IPEndPoint(IPAddress.Any, localPort);
        localSocket.Bind(localEP);
        localSocket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 81));
        ThreadPool.QueueUserWorkItem(recieveHandler, localSocket);
        
        Thread.Sleep(10000);
        localSocket.Send(System.Text.Encoding.Default.GetBytes(msg));
        
        while (true)
        {
            lock (msgLocker)
            {
                if(msgList.Count >0)
                    Console.WriteLine(msgList.Dequeue());
            }
            
            Thread.Sleep(1000);
        }
    }
    
    public static void recieveHandler(object p)
    {
        var localSocket = (Socket)p;
        while (true)
        {
            var data = new byte[1024];
            var read = localSocket.Receive(data);
            if (read > 0)
            {
                Console.WriteLine("recieved " + read.ToString() + " bytes");
                lock (msgLocker)
                    msgList.Enqueue(System.Text.Encoding.Default.GetString(data.Take(read).ToArray()));
            }
        }
    }
    // Define other methods and classes here

    先启动服务端,在10秒内,启动两个客启端,两个客户端就能收到来自对方的 msg

  • 相关阅读:
    译 PrestaShop开发者指南 第三篇 设置本地安装环境
    译 PrestaShop开发者指南 第二篇 代码规范
    [译]PrestaShop开发者指南 第一篇 基础
    Discuz!X3解读之类引入机制及目录结构
    Discuz的缓存体系
    x3d 规范 在线镜像版
    大容量数据库对表做分割
    链表 队列 堆栈 视频
    How ASP.NET MVC Works?
    SQLServer查看和解决死锁的方法
  • 原文地址:https://www.cnblogs.com/nanfei/p/14128243.html
Copyright © 2011-2022 走看看