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

  • 相关阅读:
    Python NLPIR(中科院汉语分词系统)的使用 十五分钟快速入门与完全掌握
    Python NLPIR(中科院汉语分词系统)的使用 十五分钟快速入门与完全掌握
    源码:我的关于NLP的博客(持续更新中...)
    源码:我的关于NLP的博客(持续更新中...)
    orm功能封装
    元类
    事件,存储
    索引
    mysql课外积累
    day35作业
  • 原文地址:https://www.cnblogs.com/nanfei/p/14128243.html
Copyright © 2011-2022 走看看