2012-04-22 3 views
1

Я реализую действительно простой UDP-сервер на языке C#.Невозможно просмотреть любые полученные данные

Когда я реализовал сервер на консольном приложении, он работал хорошо.

Но когда я реализовал его, используя тот же самый код приложения на основе Windows,

он не работает, как и раньше.

Я догадался, что это проблема нити.

Так что я надел поток на код, но все еще не работает.

Функция «ReceiveFrom()» не работает, как раньше.

numReceived = udpSocket.ReceiveFrom(buffer, ref remoteEP); 

В чем проблема, что мне не хватает?

Заранее спасибо.

using System; 
    using System.Collections.Generic; 
    using System.ComponentModel; 
    using System.Data; 
    using System.Drawing; 
    using System.Linq; 
    using System.Text; 
    using System.Windows.Forms; 

    using System.Runtime.InteropServices; 
    using System.Net; 
    using System.Net.Sockets; 
    using System.Threading; 

    namespace UDP_Server 
    { 
     public partial class Form1 : Form 
     { 

      private const int portNum = 5432; 

      Socket udpSocket; 

      byte[] buffer = new Byte[100]; 

      public Form1() 
      { 
       InitializeComponent(); 
      } 

      private void button1_Click(object sender, EventArgs e) 
      { 
       ThreadStart threadStart = new ThreadStart(onServer); 
       Thread thread = new Thread(threadStart); 
       thread.Start(); 
      } 

      private void onServer() 
      { 
       EndPoint localEP = new IPEndPoint(IPAddress.Parse("xxx.xxx.xxx.xxx"), portNum); 
       //EndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0); 

       udpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 

       udpSocket.Bind(localEP); 

       ThreadStart threadStart1 = new ThreadStart(OnReceive); 
       Thread thread1 = new Thread(threadStart1); 
       thread1.Start(); 
       //udpSocket.BeginReceiveFrom(buffer, 0, buffer.Length, 
       //SocketFlags.None, ref remoteEP, new AsyncCallback(OnReceive), (object)this); 
      } 

      private void OnReceive()//IAsyncResult ar) 
      { 

       int numReceived = 0; 
       EndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0); 

       Console.WriteLine("UDP Starting Server"); 
       Console.WriteLine("-----------------------------"); 

       while (true) 
       { 
        numReceived = udpSocket.ReceiveFrom(buffer, ref remoteEP); 

        string s = Encoding.UTF8.GetString(buffer, 0, numReceived); 

        Console.WriteLine("Echo : {0}", s); 
       } 
      } 
     } 
    } 
+0

Просто комментарий здесь ... нить в потоке? Темы не очень дешевые, и по внешнему виду вы можете просто вызвать OnReceive() на OnServer() и добиться такого же точного эффекта. – Machinarius

ответ

2

Выглядит, как будто ваш ожидает его на печать какой-то вывод (который это через окно консоли) .Вы должны добавить все выходные вы хотите отобразить через окна формы управления, такие как богатый текстовом поле и do:

RichTextbox1.Text += yourInput; 
+0

Я предполагаю, что сервер не получает ввода, даже если я отправляю UDP-сокет на клиент (который хорошо работает на консольном приложении). Я попытался написать строку в консоли, когда сервер получает вход от клиента. «Console.WriteLine (« Echo: {0} », s); –

+0

Да, консольные приложения немного отличаются от оконных форм. Если вы хотите отображать выходные данные от пользователя, а не с помощью метода Console.WriteLine, вам нужно использовать элемент управления RichTextbox и установить свойство text для ввода пользователей, в этом случае это будет ваша переменная s –

+0

Класс Console и его методы ничего не делайте, если это приложение не является консольным приложением: они не будут отображать новую консоль из-за способа работы консолей Windows. – Machinarius

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