C # сокет клиентского сервера - PullRequest
0 голосов
/ 13 октября 2018

Привет, у меня есть следующие коды сокетов сервера / клиента, которые дал мне другой член stackoverflow.
По сути, сервер слушает нескольких клиентов, все работает хорошо и гладко, но когда клиент выходит из приложения, сервер падает из-за неожиданногоотключите.
Я читал о heartbeed, но не знаю, как его реализовать, так как я довольно нуб на c #
Ниже приведены коды

Сервер:

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

public class AsynchIOServer
{
    static System.Collections.Concurrent.ConcurrentBag<Socket> ConnectedClients = new System.Collections.Concurrent.ConcurrentBag<Socket>();
    static void Process(Socket client)
    {

        Console.WriteLine("Incoming connection from " + client.RemoteEndPoint);

        const int maxMessageSize = 1024;
        byte[] response;
        int received;

        while (true)
        {

            if (client.Poll(-1, SelectMode.SelectRead))
            {

                // Receive message from the server:
                response = new byte[maxMessageSize];
                received = client.Receive(response);
                if (received == 0)
                {
                    Console.WriteLine("Client closed connection!");
                    if (!ConnectedClients.TryTake(out client))
                        Console.WriteLine("Error when removing connection socket object from list (" + client.RemoteEndPoint + ")!");
                    return;
                }

                List<byte> respBytesList = new List<byte>(response);
                respBytesList.RemoveRange(received, maxMessageSize - received); // truncate zero end
                Console.WriteLine("Client " + client.RemoteEndPoint + " : " + Encoding.ASCII.GetString(respBytesList.ToArray()));
            }
        }
    }



    public static void Main()
    {

        int backlog = -1, port = 2222;

        Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        server.ReceiveTimeout = -1;

        // Start listening.
        try
        {
            server.Bind(new IPEndPoint(IPAddress.Any, port));
            server.Listen(backlog);
        }
        catch (Exception)
        {
            Console.WriteLine("Listening failed!");
            Console.ReadKey();
            return;
        }

        Console.WriteLine("Start listening...");

        new System.Threading.Thread(() => {
            while (true)
            {
                Socket client = server.Accept();
                ConnectedClients.Add(client);
                new System.Threading.Thread(() => {
                    try { Process(client); }
                    catch (Exception ex)
                    {
                        Console.WriteLine(client.RemoteEndPoint + " client connection processing error: " + ex.Message);
                        if (!ConnectedClients.TryTake(out client))
                            Console.WriteLine("Error when removing connection socket object from list (" + client.RemoteEndPoint + ")!");
                    }
                }).Start();
            }
        }).Start();

        while (true)
        {
            byte[] sent = Encoding.ASCII.GetBytes(Console.ReadLine());
            if (sent.Length == 0) break;
            foreach (Socket s in ConnectedClients.ToArray()) s.Send(sent);
        }

        Console.WriteLine("Press any key for exit...");
        foreach (Socket s in ConnectedClients.ToArray()) s.Close();
        Console.ReadKey();
    }
}

Клиент:

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
public class Client
{
    static void WorkWithServer(Socket server)
    {

        const int maxMessageSize = 1024;
        byte[] response;
        int received;

        while (true)
        {

            try
            {

                // Receive message from the server:
                response = new byte[maxMessageSize];
                received = server.Receive(response);
                if (received == 0)
                {
                    Console.WriteLine("Server closed connection.");
                    return;
                }

                List<byte> respBytesList = new List<byte>(response);
                respBytesList.RemoveRange(received, maxMessageSize - received); // truncate zero end
                Console.WriteLine("Server: " + Encoding.ASCII.GetString(respBytesList.ToArray()));

                // Send message to the server:
                /* Console.Write("You: ");
                server.Send(Encoding.ASCII.GetBytes(Console.ReadLine()));
                Console.WriteLine(); */
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: " + ex.Message);
                return;
            }
        }

    }

    static public void Main(string[] Args)
    {

        IPEndPoint serverEp = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2222);

        Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        server.ReceiveTimeout = -1;

        // Connect to the server.
        try { server.Connect(serverEp); }
        catch (Exception)
        {
            Console.WriteLine("Establish connection with server (" + serverEp + ") failed!");
            Console.ReadKey();
            return;
        }

        Console.WriteLine("Connection with server (" + serverEp + ") established!");
        WorkWithServer(server);

        Console.WriteLine("Press any key for exit...");
        Console.ReadKey();
    }
}

Кроме того, я хочу, чтобы сервер получал данные с другого сервера, а после получения передавал их всем подключенным клиентам
Я знаю, что я, вероятно, тоже запрашиваюмного, но, как я уже сказал, мои навыки в C # практически отсутствуют, и я не могу позволить себе платить кому-то

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...