我有一个客户端 - 服务器应用程序,它使用UDP套接字发送数据,数据只需要从客户端传送到服务器,服务器将始终具有相同的IP。唯一的要求是我必须每秒发送大约10封邮件的消息
目前我的做法如下:
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”方法? 上面的代码有什么问题吗?
谢谢!
答案 0 :(得分:10)
UDP是无连接的,调用udpChannel.Connect仅指定用于Send方法的默认主机端点。您不需要在发送之间关闭客户端,使其保持打开状态不会在发送之间保留任何连接或侦听器。
答案 1 :(得分:3)
每次发送请求后都不应该连接/关闭。当您开始工作时 - 您连接到套接字。你可以发送数据。当您不想发送/接收数据时,应关闭UdpClient,例如关闭Form时。
在您的情况下,您可以在关闭/发送客户端时检查udpClient != null
,并且您可以使用try / catch,例如:
try
{
udpClient.Send(sendBytes, sendBytes.Length);
}
catch (Exception exc)
{
// handle the error
}
连接时使用try / catch,因为端口可能正忙或连接有其他问题。 看看UdpClient.SendAsync:)
答案 2 :(得分: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 CLient并在每次关闭后关闭它。它更好,你可以同时发送和接收。