2013-11-06 4 views
3

У меня есть клиент-серверное приложение, использующее сокет UDP для отправки данных, данные должны перемещаться только от клиента к серверу, а сервер всегда будет иметь тот же IP-адрес. Единственное требование состоит в том, что я должен отправлять сообщения о 10 сообщений в секундуКогда закрывать UDP-сокет

В настоящее время я делаю это следующим образом:

public void SendData(byte[] packet) 
{ 
    IPEndPoint end_point = new IPEndPoint(serverIP, serverPort); 
    UdpClient udpChannel = new UdpClient(sourcePort); 
    udpChannel.Connect(end_point); 
    udpChannel.Send(packet, packet.Length); 
    udpChannel.Close(); 
} 

У меня есть проблема в том, что, когда я использую команду «udpChannel.Close() "требуется 2-3 секунды, когда сервер не прослушивает. (Я видел ту же проблему в: What is the drawback if I do not invoke the UdpClient.Close() method?)

Вопрос был бы в том, что если я всегда отправляю пакеты на один и тот же IP-адрес и порт, нужно ли подключать сокет и закрывать его после каждого запроса на отправку?

Код я намерен использовать будет выглядеть следующим образом:

UdpClient udpChannel; 

public void SendData(byte[] packet) 
{ 
    udpChannel.Send(packet, packet.Length); 
} 

public void Initialize(IPAddress IP, int port) 
{ 
    IPEndPoint end_point = new IPEndPoint(serverIP, serverPort); 
    UdpClient udpChannel = new UdpClient(sourcePort); 
    udpChannel.Connect(end_point); 
} 

public void Exit() 
{ 
    udpChannel.Close(); 
} 

делая это таким образом, было бы необходимо сделать некоторые проверки в методе «SendData» перед отправкой данных? Есть ли какие-либо проблемы в приведенном выше коде?

Спасибо!

ответ

9

UDP не подключен, вызов udpChannel.Connect просто указывает конечную точку узла по умолчанию для использования с методом отправки. Вам не нужно закрывать клиента между отправками, оставляя его открытым, не оставит никаких подключений или прослушивателей, выполняющихся между отправлениями.

3

Вам не следует подключаться/закрываться после каждого запроса на отправку. Когда вы начинаете работать - вы подключаетесь к сокету. И вы можете отправлять данные. Вы должны закрыть UdpClient, когда вы не хотите отправлять/получать данные, например, при закрытии формы.

В вашем случае вы можете проверить, что udpClient != null когда близко/отправить клиента, и вы можете использовать попытаться/поймать, например:

try 
{ 
    udpClient.Send(sendBytes, sendBytes.Length); 
} 
catch (Exception exc) 
{ 
    // handle the error 
} 

Использование попытаться/поймать, когда вы соединяющую, потому что порт может быть занят или другой проблема с соединением. И посмотреть на UdpClient.SendAsync :)

0
using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
using UnityEngine.Networking; 
using System.Text; 
using System.Net.Sockets; 
using System; 
using System.Net; 

public class Server : MonoBehaviour 
{ 
    //int[] ports; 
    UdpClient udp; // Udp client 

    private void Start() 
    { 
     udp = new UdpClient(1234); 
     udp.BeginReceive(Receive, null); 
    } 

    void Send(string msg, IPEndPoint ipe) 
    { 
     UdpClient sC = new UdpClient(0); 
     byte[] m = Encoding.Unicode.GetBytes(msg); 
     sC.Send(m, msg.Length * sizeof(char), ipe); 
     Debug.Log("Sending: " + msg); 
     sC.Close(); 
    } 

    void Receive(IAsyncResult ar) 
    { 
     IPEndPoint ipe = new IPEndPoint(IPAddress.Any, 0); 
     byte[] data = udp.EndReceive(ar, ref ipe); 
     string msg = Encoding.Unicode.GetString(data); 
     Debug.Log("Receiving: " + msg); 

     udp.BeginReceive(Receive, null); 
    } 
} 

В Send() я использую новый UDP Клиентские и закрыть его после того, как каждый раз. Его лучше, вы можете отправлять и получать в одно и то же время.

Смежные вопросы