• 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

  • 相关阅读:
    关于文件上传组件国内外完美解决方案的调查
    WIN10 评估版 查看过期时间
    Using Android Phone to recover SD card formatted with DD command under linux
    JavaScript 字符串与数组互转,并保持数据去重、排序功能
    国内基于浏览器的在线截屏插件方案汇总分析
    VC6到VC2010,项目迁移错误
    CentOS 7 Install Adobe Flash Player
    地铁图快速寻路算法
    windows的cmd下的find命令比bash(win10下的Ubuntu的bash)下的grep比较
    APUE习题5.x
  • 原文地址:https://www.cnblogs.com/nanfei/p/14128243.html
Copyright © 2020-2023  润新知