Оглавление
- Предисловие
- Код сервера
- Код клиента
- Пример локального компьютера ( Успешно )
- Пример сети Интернет ( Неуспешно )
- Мои соображения о возможностях
Предисловие
Я беру эти коды из класса MSDNбиблиотечные примеры.Так что должно работать правильно.Да, я частично прав.При запуске на моем компьютере это удается.Но через интернет-сеть это терпит неудачу.Я беру ConnectionRefused SocketErrorCode каждый раз.
Я приведу исходный код ниже, сначала вы должны знать мои измененные тесты.
Для кода сервера:
- Я использовал IPAddress.IPv6Any вместо IPAddress.Any .
- Также я пытался без server.AllowNatTraversal (true)
Но это не удалось
Код сервера
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
namespace ServerTest
{
class Program
{
static void Main(string[] args)
{
TcpListener server = null;
try
{
int port = 13000;
server = new TcpListener(IPAddress.Any, port);
server.AllowNatTraversal(true);
server.Start();
byte[] bytes = new byte[256];
string data = null;
while (true)
{
Console.WriteLine("Waiting for a connection...");
TcpClient client = server.AcceptTcpClient();
Console.WriteLine("Connected: {0}", client.Client.LocalEndPoint.ToString());
data = null;
NetworkStream stream = client.GetStream();
int i;
while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
data = Encoding.ASCII.GetString(bytes, 0, i);
Console.WriteLine("Received: {0}", data);
data = data.ToUpper();
byte[] msg = Encoding.ASCII.GetBytes(data);
stream.Write(msg, 0, msg.Length);
Console.WriteLine("Sent: {0}", data);
}
client.Close();
}
}
catch (SocketException e)
{
Console.WriteLine("Socket exception message: {0}", e.Message);
Console.WriteLine("Socket Error Code: {0}", e.SocketErrorCode.ToString());
}
finally
{
server.Stop();
}
Console.WriteLine("\nHit enter to continue...");
Console.ReadKey();
}
}
}
Код клиента
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;
namespace ClientTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Started...");
Console.WriteLine("İP Address:");
string hostName = Console.ReadLine();
if(hostName.Length == 0)
{
hostName = Dns.GetHostName();
}
Connect(hostName, "hello");
}
static void Connect(string server, string message)
{
try
{
int port = 13000;
TcpClient client = new TcpClient(server, port);
byte[] data = Encoding.ASCII.GetBytes(message);
NetworkStream stream = client.GetStream();
stream.Write(data, 0, data.Length);
Console.WriteLine("Sent: {0}", message);
data = new byte[256];
string responseData = string.Empty;
int bytes = stream.Read(data, 0, data.Length);
responseData = Encoding.ASCII.GetString(data, 0, bytes);
Console.WriteLine("Received: {0}", responseData);
stream.Close();
client.Close();
}
catch (ArgumentNullException e)
{
Console.WriteLine("ArgumentNullException: {0}", e.Message);
}
catch (SocketException e)
{
Console.WriteLine("Socket Error Code: {0}", e.SocketErrorCode.ToString());
}
Console.WriteLine("Hit enter to continue...");
Console.ReadKey();
}
}
}
Пример локального компьютера ( Успешно )
Я пробовал только на своем компьютере.Сначала я открыл программу ServerTest , затем запустил программу ClientText .
Выход клиента
Запущено ...
Адрес IP:
Отправлено привет
Получено Привет
Нажмите Enter, чтобы продолжить
Вывод на сервер
Ожидание соединения ...
Connected: 192.168.1.3:13000
Получено: hello
Отправлено: HELLO
Ожидание соединения
Пример Интернет-сети ( Unsuccessfull )
Я пытался с моим другом, чей IP-адрес "88.226.0.218".Он узнал свой IP-адрес из whatismyipaddress.com Я запустил ClientTest и запустил ServerTest .Ниже приведены выходные данные:
Выход клиента
Запущено ...
IP-адрес:
88.226.0.218
SocketErrorCode: ConnectionRefused
Нажмите Enter, чтобы продолжить
Вывод на сервер
Ожидание соединения ...
И ничего. ServerTest Программа только ждет.
Мои соображения о возможностях
- Может использоваться только İPv6, когда я использовал İPAddress.İPv6Any
- Мой модемный брандмауэр может предотвращать NatTraversal.Если да, как я могу включить модем NatTraversal программно?
- AllowNatTraversal метод класса TcpListener , поставляемый с .Net4, не работает должным образом.(Я не верю, но ради возможности)
Любая помощь будет оценена.Это очень важно для меня.Я задерживаю свой проект почти на месяц из-за того, что не смог выполнить эту ошибку.