我正在尝试开发一个视频客户端/功能,它使用网络摄像头捕获视频并传输到互联网上某个地方的其他服务端(服务器客户端)。我正在使用 UDPCLient 类来做到这一点。
我希望我的应用程序能够收听和 tarnsmit 从网络摄像头捕获的视频。当我在本地网络上执行此操作时,捕获、传输和接收工作正常。
但是,当我在转发各自的端口后从路由器后面(跨两个不同的网络/互联网)测试应用程序时,两个路由器上的互联网连接都丢失了(它们挂断了),我需要重新启动路由器或切换到备用连接. 配置如下:
Servent 1 <--> Router1 <--> Internet 连接#01
Servent 02 <---> Router2 <---> Internet Connection#02
两个连接都在单独的 DSL 线路上。其中一台路由器是中兴品牌,另一台是网件。
监听/传输代码如下:
private void StartSockets()
{
//For testing across internet i use IPAddress obtained via different function
var IPAddress = getMyIpAddress();
this.udpSender = new UdpClient(IpAddress, 4000);
this.udpListener = new UdpClient(4000);
}
private IPAddress getMyIpAddress()
{
IPAddress localIP ;//= AddressAr[0];
localIP = IPAddress.Parse(GetPublicIP());
return localIP;
}
public string GetPublicIP()
{
String direction = "";
WebRequest request = WebRequest.Create("http://checkip.dyndns.org/");
using (WebResponse response = request.GetResponse())
{
using (StreamReader stream = new StreamReader(response.GetResponseStream()))
{
direction = stream.ReadToEnd();
}
}
//Search for the ip in the html
int first = direction.IndexOf("Address: ") + 9;
int last = direction.LastIndexOf("</body>");
direction = direction.Substring(first, last - first);
return direction;
}
接收响应的代码如下:
private void ReceiveData()
{
//For testing across internet i use IPAddress obtained via different function
var IPAddress = getMyIpAddress();
IPEndPoint ep = new IPEndPoint(IPAddress, myPort);
try
{
byte[] receiveBytes = this.udpListener.Receive(ref ep);
this.OnReadImage(new ImageEventArgs(this.ByteToImage(receiveBytes)));
}
catch (Exception)
{
}
}
如果我在本地网络上测试,我使用 DNSHostname 来获取 IP 地址(私有 IP 地址)并且视频在本地网络上工作正常。这在互联网上不起作用,所以我切换到实时 IP 地址,因此我使用 getPublicIpAddress() 的方法。
- 我知道我的方法有严重问题吗?什么是正确的方法?
- 我应该切换到 TCP 侦听器吗?我打算将来有多个相同视频的接收器。那么会不会有影响?
UDP 客户端会导致路由器崩溃、挂断和重启吗?我怎样才能避免这种情况?
最后,如果要避免端口转发,最好的策略是什么?
请帮忙。
谢谢
史蒂夫