winforms 将数据从另一个客户端传送到特定客户端,中间有服务器[C#]

ldfqzlk8  于 2022-12-04  发布在  C#
关注(0)|答案(1)|浏览(174)

我到处都找过了,但是没有找到,因为他们都在向所有客户端发送消息。我想实现的是多个客户端向服务器请求另一个客户端的数据,而另一个客户端向服务器发送数据,告诉它数据是给请求客户端的,等等。我不知道如何实现这个。我对这个很陌生。
我想实现的目标:

我已经尝试与数据发送客户端监听和请求客户端连接到它并传输数据。我已经实现了这一点在本地网络上,但要使它在线工作,它需要端口转发,我的用户将是很多不同的人,所以端口转发是不可能的,为每个用户。所以我可以租一个服务器,将作为传输中心。我在控制台中编写了一个测试服务器,它将监听服务器IP:端口X,并在端口X上接受新客户端及其数据,然后将其转发到服务器IP:端口Y,但这只是将数据发送到端口Y上的所有客户端。由于显而易见的原因,我不能直接将数据发送到客户端的公共IP地址。我知道所有请求的客户端都连接到端口Y,但我不能创建并分配新端口给所有交互的客户端。因此,我希望有一种方法来确定如何请求和接收数据,而无需在同一服务器上为不同的客户端分配或创建新端口。
我尝试过的方法:

服务器代码

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace Test___server
{
    class server
    {
        public static string serverIP = "192.168.0.102";
        static void Main(string[] args)
        {
            Thread listenSendingThread = new Thread(listenSending);
            listenSendingThread.IsBackground = true;
            listenSendingThread.Start();
            Thread listenReceivingThread = new Thread(listenReceiving);
            listenReceivingThread.IsBackground = true;
            listenReceivingThread.Start();
            Console.ReadKey();
        }

        public static List<TcpClient> listSending = new List<TcpClient>();
        public static List<TcpClient> listReceiving = new List<TcpClient>();
        public static TcpClient clientSending = null;
        private static void listenSending()
        {
            TcpListener listenerSending = new TcpListener(IPAddress.Parse(serverIP), 5319);
            listenerSending.Start();
            Console.WriteLine("Server listening to " + serverIP + ":5319");
            while(true)
            {
                clientSending = listenerSending.AcceptTcpClient();
                listSending.Add(clientSending);
                Console.WriteLine("Sender connection received from " + clientSending.Client.RemoteEndPoint);
            }
        }
        private static void send()
        {
            StreamWriter sw = new StreamWriter(clientSending.GetStream());
            sw.WriteLine(message);
            sw.Flush();
            Console.WriteLine("Message sent!");
        }

        public static string message = string.Empty;
            
        private static void listenReceiving()
        {
            TcpListener listener = new TcpListener(IPAddress.Parse(serverIP), 0045);
            listener.Start();
            Console.WriteLine("Server listening to " + serverIP + ":0045");
            while (true)
            {
                TcpClient client = listener.AcceptTcpClient();
                listReceiving.Add(client);
                Console.WriteLine("Receiver connection received from " + client.Client.RemoteEndPoint);
                StreamReader sr = new StreamReader(client.GetStream());
                message = sr.ReadLine();
                send();
            }
        }
    }
}

请求客户代码

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Test____admin
{
    class admin
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Begin");
            string serverIP = "192.168.0.102";
            System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();
            clientSocket.Connect(serverIP,  );
            Console.WriteLine("Connected");
            while (true)
            {
                Console.WriteLine("Reading");
                StreamReader sr = new StreamReader(clientSocket.GetStream());
                Console.WriteLine("Message: " + sr.ReadLine());
            }
        }
    }
}

请求满足客户代码

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace Test___client
{
    class client
    {
        public static string serverIP = "192.168.0.102";
        static void Main(string[] args)
        {
            clientConnect();
        }

        private static void clientConnect()
        {
            try
            {
                TcpClient client = new TcpClient(serverIP, 0045);
                StreamWriter sw = new StreamWriter(client.GetStream());
                sw.WriteLine("Karan!");
                sw.Flush();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
    }
}
5lwkijsr

5lwkijsr1#

您使用的是非常低级的API,正确的方法很有挑战性。请尝试将YARP作为反向代理。请求客户端应通知反向代理有关所需的目标客户端。一个选项是在request header中发送目标客户端名称。您还需要将单个服务器请求拆分为多个客户端请求。然后将它们的响应合并为一个响应,可以通过实现Transphorms来实现。
我不确定这种方法是否适用于您的情况,因为客户端应该使用REST、Grpc或任何其他受支持的技术来实现服务器API。

相关问题