c# - 使用套接字响应客户端?

标签 c# .net sockets tcpclient tcplistener

我有两个基本的控制台应用程序,即使所有通信都在我的本地计算机上进行,也可以通过“网络”进行通信。

客户代码:

public static void Main()
{
    while (true)
    {
        try
        {
            TcpClient client = new TcpClient();

            client.Connect("127.0.0.1", 500);

            Console.WriteLine("Connected.");

            byte[] data = ASCIIEncoding.ASCII.GetBytes(new FeederRequest("test", TableType.Event).GetXmlRequest().ToString());

            Console.WriteLine("Sending data.....");

            using (var stream = client.GetStream())
            {
                stream.Write(data, 0, data.Length);
                stream.Flush();

                Console.WriteLine("Data sent.");
            }

            client.Close();

            Console.ReadLine();
        }
        catch (Exception e)
        {
            Console.WriteLine("Error: " + e.StackTrace);

            Console.ReadLine();
        }
    }
}

服务器代码:
public static void Main()
{
    try
    {
        IPAddress ipAddress = IPAddress.Parse("127.0.0.1");

        Console.WriteLine("Starting TCP listener...");

        TcpListener listener = new TcpListener(ipAddress, 500);

        listener.Start();

        Console.WriteLine("Server is listening on " + listener.LocalEndpoint);

        while (true)
        {
            Socket client = listener.AcceptSocket();

            Console.WriteLine("\nConnection accepted.");

            var childSocketThread = new Thread(() =>
                {
                    Console.WriteLine("Reading data...\n");

                    byte[] data = new byte[100];
                    int size = client.Receive(data);
                    Console.WriteLine("Recieved data: ");
                    for (int i = 0; i < size; i++)
                        Console.Write(Convert.ToChar(data[i]));

                    //respond to client


                    Console.WriteLine("\n");

                    client.Close();

                    Console.WriteLine("Waiting for a connection...");
                });

            childSocketThread.Start();
        }
    }
    catch (Exception e)
    {
        Console.WriteLine("Error: " + e.StackTrace);
        Console.ReadLine();
    }
}

如何更改这两个应用程序,以便服务器收到数据后以某种确认的方式响应客户端?

提前致谢!

最佳答案

这里有一个简短的例子,我将如何做:

服务器:

class Server
    {
        static void Main(string[] args)
        {
            TcpListener listener = new TcpListener(IPAddress.Any, 1500);
            listener.Start();

            TcpClient client = listener.AcceptTcpClient();

            NetworkStream stream = client.GetStream();

            // Create BinaryWriter for writing to stream
            BinaryWriter binaryWriter = new BinaryWriter(stream);

            // Creating BinaryReader for reading the stream
            BinaryReader binaryReader = new BinaryReader(stream);

            while (true) 
            {
                // Read incoming information
                byte[] data = new byte[16];
                int receivedDataLength = binaryReader.Read(data, 0, data.Length);
                string stringData = Encoding.ASCII.GetString(data, 0, receivedDataLength);

                // Write incoming information to console
                Console.WriteLine("Client: " + stringData);

                // Respond to client
                byte[] respondData = Encoding.ASCII.GetBytes("respond");
                Array.Resize(ref respondData, 16); // Resizing to 16 byte, because in this example all messages have 16 byte to make it easier to understand.
                binaryWriter.Write(respondData, 0, 16);
            }

        }
    }

客户:
class Client
    {
        private static void Main(string[] args)
        {
            Console.WriteLine("Press any key to start Client");
            while (! Console.KeyAvailable)
            {
            }


            TcpClient client = new TcpClient();
            client.Connect("127.0.0.1", 1500);

            NetworkStream networkStream = client.GetStream();

            // Create BinaryWriter for writing to stream
            BinaryWriter binaryWriter = new BinaryWriter(networkStream);

            // Creating BinaryReader for reading the stream
            BinaryReader binaryReader = new BinaryReader(networkStream);

            // Writing "test" to stream
            byte[] writeData = Encoding.ASCII.GetBytes("test");
            Array.Resize(ref writeData, 16); // Resizing to 16 byte, because in this example all messages have 16 byte to make it easier to understand.
            binaryWriter.Write(writeData, 0, 16);

            // Reading response and writing it to console
            byte[] responeBytes = new byte[16];
            binaryReader.Read(responeBytes, 0, 16);
            string response = Encoding.ASCII.GetString(responeBytes);
            Console.WriteLine("Server: " + response);


            while (true)
            {
            }
        }
    }

我希望这有帮助! ;)

关于c# - 使用套接字响应客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19388352/

相关文章:

c# - 表单模型在 POST 之前未验证

c# - 匿名类型上的 ToString 如何工作?

c# - 如何在 C# 中在运行时动态创建和命名对象?

Java - 转发对象

c# - JavaScriptSerializer.Deserialize() 到字典中

C# 将 List<object> 转换为原始类型而无需显式强制转换

c# - Net Core : Enforce Required Class Members in Request API Automatically,(非空数据类型)

c++ - 关闭套接字如何影响其他方读取

javascript - 在 React Native 中通过 Navigator 传递套接字

c# - 将 .NET 结构与 WINAPI 函数结合使用