2016-01-04 12 views
0

хорошего дня всехC# - NetworkStream читать и писать

Я иду по некоторой сети программирования для реализации с большим приложением, но для основы, я создаю простые сетевой чат клиента-сервера приложения с помощью этого link

, что должно произойти:

При получении данных от клиента, окно сообщения, показывая сокет к компьютеру IP-адрес с портом, но

Проблема:

MessageBox, которая отображает сообщение, отправленное пуст (так называемый «»), я не понимаю, что я делаю неправильно.

Рекомендации?

было смотреть на это, но я не думаю, что это подходит для моей ситуацииnetwork stream with buffers

клиент (передает данные)

 const int _PORT = 80; 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void sendText(string _reciever_ip, string _MESSAGE) 
     { 
      TcpClient _sender = new TcpClient(_reciever_ip, _PORT); 
      try 
      { 
       Stream s = _sender.GetStream(); 
       StreamWriter sw = new StreamWriter(s); 
       sw.WriteLine(_MESSAGE); 
       s.Close(); 
      } 
      catch (Exception x) 
      { 
       MessageBox.Show(x.ToString()); 
      } 
      _sender.Close(); 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      sendText(inputT_IP.Text, inputT_Msg.Text); 
     } 

сервер (recieves данные)

const int _PORT = 80; 

    static List<string> _ipaddress_list = new List<string>(); 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void recieveText(string _IPADDRESS) 
    { 
     //open a listener for a tcp client, to the same for UDp client 
     TcpListener _reciever_client = new  TcpListener(IPAddress.Parse(_IPADDRESS), _PORT); //how would you listen for a  connection from any port? 
     _reciever_client.Start(); 
     while (true) 
     { 
      Socket _listener_socket = _reciever_client.AcceptSocket(); 
      try 
      { 
       MessageBox.Show("Recieving from : " +  _listener_socket.RemoteEndPoint.ToString()); 
       Stream _net_stream = new NetworkStream(_listener_socket); 
       StreamReader sr = new StreamReader(_net_stream); 
       MessageBox.Show(sr.ReadLine()); 
       //richTextBox1.AppendText(); 
      } 
      catch (Exception x) 
      { 
       MessageBox.Show(x.ToString()); 
      } 
      _listener_socket.Close(); 
     } 
    } 

    void GetLocalIPAddress() 
    { 
     var host = Dns.GetHostEntry(Dns.GetHostName()); 
     foreach (var ip in host.AddressList) 
     { 
      if (ip.AddressFamily == AddressFamily.InterNetwork) 
      { 
       _ipaddress_list.Add(ip.ToString()); 
      } 
     } 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     GetLocalIPAddress(); 
     foreach (string item in _ipaddress_list) 
     { 
      (new Thread(() => recieveText(item))).Start(); 
     } 
    } 
+1

Попробуйте изменить 's.Close();' на 'sw.Close();', который должен очистить потоковый блок и закрыть основной сокет. –

+0

Порт 80, вероятно, заблокирован. Используйте номер порта> 10 000 – jdweng

+0

@JoachimIsaksson. Ваш ответ правильный, пожалуйста, напишите, если для меня, чтобы принять этот ответ, почему это работает, если я могу спросить его таким образом? – KGCybeX

ответ

1

Буферы буфера StreamWriter записывают, поэтому ваш код;

Stream s = _sender.GetStream(); 
StreamWriter sw = new StreamWriter(s); 
sw.WriteLine(_MESSAGE); 
s.Close(); 

... на самом деле пишет в StreamWriter лет в буфере памяти и закрывает сокет до того, как данные были переданы от StreamWriter к сети.

Если вы закрываете StreamWriter;

Stream s = _sender.GetStream(); 
StreamWriter sw = new StreamWriter(s); 
sw.WriteLine(_MESSAGE); 
sw.Close(); 

... Close() фактически очищает буфер к основной розетке, а затем закрывает основной сокет после того, как данные были отправлены.

+1

спасибо за объяснение, это помогло много – KGCybeX

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