使用TCP c#将数据包从服务器发送到特定客户端
Send packet from server to a specific client using TCP c#
我目前正在编写客户端-服务器应用程序。客户端发送 UDP 广播消息试图定位服务器,服务器发送 UDP 广播消息确定其位置。
当客户端收到一条标识服务器位置的消息时,它会尝试使用 socket.Connect(remoteEndPoint) 连接到服务器。
服务器在侦听套接字上侦听这些 TCP 请求,并使用 listensocket.accept() 接受请求。客户端详细信息存储在数组中(包括他们的 IP 和端口号)
客户端向服务器发送一条消息,其中包含有关用户输入的用户名和密码的信息。
服务器检查数据库中的用户名和密码,并根据结果向发送请求以使用侦听套接字检查 U&P 的客户端发送回 TCP 消息(这是它中断的地方)。我正在尝试使用以下代码发送 TCP 消息,但它不会工作,因为我收到错误消息。
TCPSocket.SendTo(message, clientsArray[i].theirSocket.RemoteEndPoint);
通常,当您从客户端获得连接时,您会得到一个 TcpClient
. That class has a method GetStream()
。如果您想向该客户端发送一些数据,只需将您想要的数据写入该流即可。
我不确定你用的是什么方法。
但在 C# 中有 2 个常见的 类 可以用作服务器:TcpClient & Socket
在TcpClient
...
//Start Server
Int32 port = 13000;
IPAddress localAddr = IPAddress.Parse("127.0.0.1");
server = new TcpListener(localAddr, port);
server.Start();
//Accept Client
TcpClient client = server.AcceptTcpClient();
NetworkStream stream = client.GetStream();
String data = "Message From Server";
byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);
//Send to Client
stream.Write(msg, 0, msg.Length);
...
并在 Socket 中使用 TCP
...
//Start Server
Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress hostIP = (Dns.Resolve(IPAddress.Any.ToString())).AddressList[0];
IPEndPoint ep = new IPEndPoint(hostIP, port);
listenSocket.Bind(ep);
listenSocket.Listen(backlog);
//Accept Client
Socket handler = listener.Accept();
String data = "Message From Server";
byte[] msg = Encoding.ASCII.GetBytes(data);
//Send to Client
handler.Send(msg);
...
并在 Socket 中使用 UDP
你不应该在你的服务器上使用它,因为你正在使用 TCP
...
IPHostEntry hostEntry = Dns.GetHostEntry(Dns.GetHostName());
IPEndPoint endPoint = new IPEndPoint(hostEntry.AddressList[0], 11000);
Socket s = new Socket(endPoint.Address.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
String data = "Message From Server";
byte[] msg = Encoding.ASCII.GetBytes(data);
//Send to Client by UDP
s.SendTo(msg, endPoint);
...
我目前正在编写客户端-服务器应用程序。客户端发送 UDP 广播消息试图定位服务器,服务器发送 UDP 广播消息确定其位置。
当客户端收到一条标识服务器位置的消息时,它会尝试使用 socket.Connect(remoteEndPoint) 连接到服务器。
服务器在侦听套接字上侦听这些 TCP 请求,并使用 listensocket.accept() 接受请求。客户端详细信息存储在数组中(包括他们的 IP 和端口号)
客户端向服务器发送一条消息,其中包含有关用户输入的用户名和密码的信息。
服务器检查数据库中的用户名和密码,并根据结果向发送请求以使用侦听套接字检查 U&P 的客户端发送回 TCP 消息(这是它中断的地方)。我正在尝试使用以下代码发送 TCP 消息,但它不会工作,因为我收到错误消息。
TCPSocket.SendTo(message, clientsArray[i].theirSocket.RemoteEndPoint);
通常,当您从客户端获得连接时,您会得到一个 TcpClient
. That class has a method GetStream()
。如果您想向该客户端发送一些数据,只需将您想要的数据写入该流即可。
我不确定你用的是什么方法。
但在 C# 中有 2 个常见的 类 可以用作服务器:TcpClient & Socket
在TcpClient
...
//Start Server
Int32 port = 13000;
IPAddress localAddr = IPAddress.Parse("127.0.0.1");
server = new TcpListener(localAddr, port);
server.Start();
//Accept Client
TcpClient client = server.AcceptTcpClient();
NetworkStream stream = client.GetStream();
String data = "Message From Server";
byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);
//Send to Client
stream.Write(msg, 0, msg.Length);
...
并在 Socket 中使用 TCP
...
//Start Server
Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress hostIP = (Dns.Resolve(IPAddress.Any.ToString())).AddressList[0];
IPEndPoint ep = new IPEndPoint(hostIP, port);
listenSocket.Bind(ep);
listenSocket.Listen(backlog);
//Accept Client
Socket handler = listener.Accept();
String data = "Message From Server";
byte[] msg = Encoding.ASCII.GetBytes(data);
//Send to Client
handler.Send(msg);
...
并在 Socket 中使用 UDP
你不应该在你的服务器上使用它,因为你正在使用 TCP
...
IPHostEntry hostEntry = Dns.GetHostEntry(Dns.GetHostName());
IPEndPoint endPoint = new IPEndPoint(hostEntry.AddressList[0], 11000);
Socket s = new Socket(endPoint.Address.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
String data = "Message From Server";
byte[] msg = Encoding.ASCII.GetBytes(data);
//Send to Client by UDP
s.SendTo(msg, endPoint);
...