C # сокет перестает получать - PullRequest
0 голосов
/ 07 декабря 2018

Я создаю сокет сервера в C # для своего приложения Unity.Я создал сокет асинхронного сервера снизу, ссылка Сокет асинхронного сервера

, с помощью которого я могу успешно соединяться с клиентом и получать данные от клиента.Но после нескольких полученных данных сокет не получает данные, даже если клиент отправляет данные (я тестирую клиент и сервер на одной и той же машине).

Также не было исключений, выданных в try catch.Поэтому я не могу определить основную причину.

Пожалуйста, найдите мой код ниже

public class NetworkStateObject
{
        // Client socket.  
        public Socket workSocket = null;
        // Size of receive buffer.  
        public const int BufferSize = 1024;
        // Receive buffer.  
        public byte[] buffer = new byte[BufferSize];
        // Received data string.  
        public List<byte> receivedBytes = new List<byte>();
}

private readonly ManualResetEvent allDone = new ManualResetEvent(false);
private readonly ManualResetEvent receiveDone = new ManualResetEvent(false);
private readonly string receiveDelimitter = "<EOF>";

socketThread = new Thread(new ThreadStart(StartSocketServer));
socketThread.Priority = System.Threading.ThreadPriority.BelowNormal;
socketThread.IsBackground = true;
socketThread.Start();

protected void Receive(Socket socket)
{
        ReceiveData(socket);
        receiveDone.WaitOne();
}

private void ReceiveData(Socket socket)
    {
        try
        {
            // Create the state object.  
            NetworkStateObject state = new NetworkStateObject();
            state.workSocket = socket;

        // Begin receiving the data from the remote device.  
        socket.BeginReceive(state.buffer, 0, NetworkStateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);
    }
    catch (Exception e)
    {
        Debug.Log(e.ToString());
    }
}

private void ReceiveCallback(IAsyncResult ar)
{
    try
    {
        // Retrieve the state object and the client socket   
        // from the asynchronous state object.  
        NetworkStateObject state = (NetworkStateObject)ar.AsyncState;
        Socket socket = state.workSocket;

        // Read data from the remote device.  
        int bytesRead = socket.EndReceive(ar);

        if (bytesRead > 0)
        {
            // There might be more data, so store the data received so far.  
            //state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead));
            var bytesArray = state.buffer;
            if (bytesRead < NetworkStateObject.BufferSize)
            {
                Array.Resize(ref bytesArray, bytesRead);
            }
            var bytesList = new List<byte>(bytesArray);
            state.receivedBytes.AddRange(bytesList);

            var receivedBytes = state.receivedBytes;
            var bytesCount = receivedBytes.Count;
            if (receivedBytes.Count > 1)
            {
                var receivedString = Encoding.ASCII.GetString(receivedBytes.ToArray(), 0, bytesCount);
                if (receivedString.IndexOf(receiveDelimitter, StringComparison.CurrentCulture) > -1)
                {
                    var message = receivedString.Replace(receiveDelimitter, String.Empty);
                    message = Regex.Unescape(message);
                    socketBaseDelegate.ReceivedMessage(message);
                    state.receivedBytes.Clear();
                    receiveDone.Set();
                }
                else
                {
                    // Get the rest of the data.
                    socket.BeginReceive(state.buffer, 0, NetworkStateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);
                }
            }
        }
        else
        {
            receiveDone.Set();
        }
    }
    catch (Exception e)
    {
        Debug.Log(e.ToString());
    }
}

public void ReceivedMessage(string data)
    {
        socketInputParser.Parse(data);
        asynchronousSocketListener.ReceiveMessage();
    }

В приведенном выше коде ReceiveCallback не запускается через некоторое время.Даже если клиент отправляет данные.

1 Ответ

0 голосов
/ 07 декабря 2018
else
{
  // Get the rest of the data.
  socket.BeginReceive(state.buffer, 0, NetworkStateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);
}

Эта часть не должна быть условной.Вы должны всегда начинать прием снова после завершения обратного вызова.Если, конечно, соединение не разорвано.

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