2015-06-15 5 views
0

Я только что просмотрел учебник YouTube по серверам и клиентам tcpip и использовал код из него: https://www.youtube.com/watch?v=uXFso7xSSWk как часть 1, так и часть 2. Я дважды переделал код и убедился, что все одинаково , Всякий раз, когда я запускаю сервер, я получаю сообщение об ошибке «SocketException был необработанным» в строке «tcpListener.Start();» следующим способом.C# SocketException был необработанным

private void TcpServerRun() 
     { 
      TcpListener tcpListener = new TcpListener(IPAddress.Any, 5004); 
      tcpListener.Start(); 
      updateUI("Listening"); 
      while (true) 
      { 
       TcpClient client = tcpListener.AcceptTcpClient(); 
       updateUI("Connected"); 
       Thread tcpHandlerThread = new Thread (new ParameterizedThreadStart(tcpHandler)); 
       tcpHandlerThread.Start(client); 
      } 
     } 

я получаю ту же ошибку, когда я запускаю клиента, но он находится на линии «client.Connect(IPAddress.Parse("10.3.29.252"), 5004);» в следующем методе:

private void ConnectAsClient() 
     { 
      TcpClient client = new TcpClient(); 
      client.Connect(IPAddress.Parse("10.3.29.252"), 5004); 
      NetworkStream stream = client.GetStream(); 
      string s = "Hello from client"; 
      byte[] message = Encoding.ASCII.GetBytes(s); 
      stream.Write(message, 0, message.Length); 
      updateUI("Message send"); 
      stream.Close(); 
      client.Close(); 
     } 

Любые и вся помощь очень ценится. Я довольно новичок в кодировании и очень новичок в C#, поэтому я прошу прощения за все, что может быть неясно.

Вот весь код сервера:

namespace TcpServerTutorial 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 

     private void bStartServer_Click(object sender, EventArgs e) 
     { 
      Thread tcpServerRunThread = new Thread(new ThreadStart(TcpServerRun)); 
      tcpServerRunThread.Start(); 
      TcpServerRun(); 
     } 

     private void TcpServerRun() 
     { 
      TcpListener tcpListener = new TcpListener(IPAddress.Any, 5004); 
      tcpListener.Start(); 
      updateUI("Listening"); 
      TcpClient client = tcpListener.AcceptTcpClient(); 
      while (true) 
      { 
       TcpClient client = tcpListener.AcceptTcpClient(); 
       updateUI("Connected"); 
       Thread tcpHandlerThread = new Thread (new ParameterizedThreadStart(tcpHandler)); 
       tcpHandlerThread.Start(client); 
      } 


     } 

     private void tcpHandler(object client) 
     { 
      TcpClient mClient = (TcpClient)client; 
      NetworkStream stream = mClient.GetStream(); 
      byte[] message = new byte[1024]; 
      stream.Read(message, 0, message.Length); 
      updateUI("New Message = " + Encoding.ASCII.GetString(message)); 
      stream.Close(); 
      mClient.Close(); 
     } 

     private void updateUI(string s) 
     { 
      Func<int> del = delegate() 
      { 
       textBox1.AppendText(s + System.Environment.NewLine); 
       return 0; 
      }; 
      Invoke(del); 
     } 
    } 
} 
+0

первый мысль - это тот адрес не достижим. если вы попытаетесь поймать и проверить внутреннее исключение, вы можете получить дополнительную информацию. –

+0

SocketException.ErrorCode должен дать вам более подробную информацию о том, какую ошибку вы получаете. Есть ли вероятность, что используемая вами машина-разработчик имеет брандмауэр, блокирующий неожиданные исходящие соединения? –

+0

, когда я помещаю 'tcpListener.Start();' в попытке поймать это, кажется, передает эту точку, но затем я получаю «недопустимое исключение операции» в «TcpClient client = tcpListener.AcceptTcpClient();» –

ответ

1

Bingo.Look в этом фрагменте кода:

private void bStartServer_Click(object sender, EventArgs e) 
    { 
     // Called once when the thread starts 
     Thread tcpServerRunThread = new Thread(new ThreadStart(TcpServerRun)); 
     tcpServerRunThread.Start(); 
     // Called again here 
     TcpServerRun(); 
    } 

Метод TCPServerRun() вызывается дважды: один раз, когда ваш заходов резьбы, а затем снова через явный вызов сразу после запуска потока (или даже, возможно, в обратном порядке). Это вызов, где происходит SocketException, потому что сервер уже запущен. Удалите вторую ссылку, и ваша проблема должна быть устранена; ищите аналогичную ситуацию на вашем клиенте.

+0

Большое спасибо! Это исправлено! –

+0

Удивительный! Рад помочь. –