c# - C#套接字服务器连续读取

标签 c# sockets

我刚刚制作了一个C#套接字服务器,它可以完美运行,但是如果我想使其能够监听输入,则程序会崩溃。我的问题是:如何使客户命令后不断听下去。

这是我的代码:

using System.Net;
using System.Net.Sockets;
using System.IO;

namespace mc_server
{
    class Program
    {
        private static TcpListener serverSocket;
        private static TcpClient clientSocket;
        private static StreamReader reader;
        private static StreamWriter writer;
        private static int PORT = 5000;

        static void Main(string[] args)
        {                
            Console.WriteLine(DateTime.Now.ToString() + " >> Server starting...");
            StartServer();
            Console.ReadKey(true);
            serverSocket.Stop();
        }

        private static void StartServer()
        {
            try
            {
                serverSocket = new TcpListener(IPAddress.Any, PORT);
                serverSocket.Start();
                Console.WriteLine(DateTime.Now.ToString() + " >> Server started");
                while (true)
                {
                    clientSocket = serverSocket.AcceptTcpClient();
                    reader = new StreamReader(clientSocket.GetStream());
                    writer = new StreamWriter(clientSocket.GetStream());
                    StartListening();
                }
            }
            catch (Exception e)
            {
                if (!System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
                    Console.WriteLine(DateTime.Now.ToString() + " [ERR]: Internet connection unavailable! (" + e.ToString() + ")");
                else
                    Console.WriteLine(DateTime.Now.ToString() + " [ERR]: Server can't be started! (" + e.ToString() + ")");
            }
        }

        private static void StartListening()
        {
            try
            {
                string line; 
                //while (true)
                //{
                    line = reader.ReadLine();

                    if (line.Contains("connected"))
                    {
                        Console.WriteLine(DateTime.Now.ToString() + " >> Remote connected");
                    }
                    else if (line.Contains("get_dir"))
                    {
                        Console.WriteLine("in_get_dir");
                        foreach (string directory in     Directory.GetDirectories(path))
                        {
                            DirectoryInfo dir_name = new DirectoryInfo(directory);
                            string dirName = dir_name.Name;
                            writer.WriteLine(line);
                        }
                    }
                //}
            }
            catch (Exception e)
            {
                Console.WriteLine(DateTime.Now.ToString() + " [ERR]: " + e.ToString() + ")");
            }
        }
    }
}

非常感谢你的帮助!
此致,斯坦利。

最佳答案

I just made a C# socket server and it works perfectly, but if I would like to make it to be able to listen the inputs the program crashes.



我不确定您的意思是什么,但我认为您在接收/读取回复时遇到问题。
serverSocket = new TcpListener(IPAddress.Any, PORT);
            serverSocket.Start();

您已经创建了一个名为'serverSocket'的TcpListener。现在,让我们创建一个套接字,以帮助我们在服务器和客户端之间发送和接收数据。创建Streamwriter和Streamreader太长且复杂。您将不得不处理冲洗,处置和关闭它们。

这是我使用套接字进行通信的3个简化指南:

1.)创建套接字:
        Socket socket = serverSocket.AcceptSocket(); // This is a                 
//synchronous function. It will not execute the next line until a client 
//connects to the server

2.)发送数据:
        socket.Send(Encoding.ASCII.GetBytes("I am sending a short text to         
the client")); // This will send the text to client. It ONLY accepts byte 
//array, therefore we have to convert it from string to byte array to be 
//able 
//to send it.

3.)接收/读取数据:
        // For Receiving Text from the Client
        byte[] responseByteArray = new byte[socket.ReceiveBufferSize]; // 
//This will create a byte array to store the data. socket.ReceiveBufferSize 
//will tells us the length of the data sent in byte array (not string yet)
        int responseLength = socket.Receive(responseByteArray);  // Tells us 
//the length of the response in byte array (not string yet)
        string response = null; // We will create a variable 'response' to 
//store the final result of the conversion
        for (int i = 0; i < responseLength; i++) // Loop to convert All byte 
//from byte array to string
        {
            response = response + (char)responseByteArray[i]; // Converts 
//every single byte of character to char
        }
        Console.WriteLine(response); // Prints out the final result in 
//string

关于c# - C#套接字服务器连续读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35442440/

相关文章:

sockets - 错误 C2678 : binary '==' : no operator found which takes a left-hand operand of type 'std::_Binder<std::_Unforced,SOCKET &,SOCKADDR *,unsigned int>'

c# - 多重继承的解决方案 - 有机会改变保护级别

c# - 如何从 silverlight 应用程序调用 Web api

c# - 从列表值创建对

java - socket -V- 休息性能

c# - System.Net.GlobalLog - 如何查看其输出?

c# - 使用自定义 ContractResolver,如何在将 null JSON 属性反序列化为值类型成员时设置默认值而不是 null?

c# - 编译 Expression<T> 时,它是否被隐式缓存?

c - Socket编程中查找客户端和服务器的IP地址

c - 提取文件内容并附加到套接字并发送套接字编程