2013-03-08 2 views
0

У меня есть сервер winform и клиентские программы. оба подключены, клиент может отправлять данные на сервер и получать сервер. но когда сервер отправляет данные, клиент не может получить.Клиент не может получать данные, отправленные с сервера, но может отправлять данные только?

вот код для клиента, чтобы получить данные:

//RECIEVE PART 
private Socket _clientSocket; // We will only accept one socket 

    private byte[] _buffer; 

    public Form1() 
    { 
     InitializeComponent(); 
     StartRecieve(); 
    } 


    #region Receiving Data 
    private void StartRecieve() 
    { 
     try 
     { 
      _serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
      // _serverSocket.Bind(new IPEndPoint(IPAddress.Any, 3333)); 
      _serverSocket.Listen(10); 
      _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 

    private void AcceptCallback(IAsyncResult AR) 
    { 
     try 
     { 
      _clientSocket = _serverSocket.EndAccept(AR); 
      _buffer = new byte[_clientSocket.ReceiveBufferSize]; 
      _clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 

    private void ReceiveCallback(IAsyncResult AR) 
    { 
     try 
     { 
      int received = _clientSocket.EndReceive(AR); 
      Array.Resize(ref _buffer, received); // Shrink buffer to trim null characters 
      string text = Encoding.ASCII.GetString(_buffer); 
      Array.Resize(ref _buffer, _clientSocket.ReceiveBufferSize); // Regrow buffer 
      //AppendToTextBox(text); 
      MessageBox.Show(text); 
      // Start receiving data again 
      _clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 

    #endregion 

    #region Display 
    /// <summary> 
    /// Provides a thread safe way to append text to the textbox 
    /// </summary> 
    private void AppendToTextBox(string text) 
    { 
     MethodInvoker invoker = new MethodInvoker(delegate 
     { 
      // Add two new lines afterwards 
      TboxDisp.Text += text + "\r\n" + "\r\n"; 
     }); 

     this.Invoke(invoker); 
    } 

    #endregion 
//Connection Part 
private void BtnConnect_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      string ip = TboxIP.Text; 
      int port = int.Parse(TboxPort.Text); 
      _clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
      // Connect to the host 
      _clientSocket.BeginConnect(new IPEndPoint(IPAddress.Parse(ip), port), 
              new AsyncCallback(ConnectCallback), null); 

      if (SocketConnected(_clientSocket) == true) 
      { 
       lblstatus.Text = "Establishing Connection to " + ip; 
       lblstatus2.Text = "Connection Established"; 
      } 

      // Connect1(ip, port); 

     } 
     catch (SystemException ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 


    } 

    //ends bending requests 
    private void ConnectCallback(IAsyncResult AR) 
    { 
     try 
     { 
      _clientSocket.EndConnect(AR); 
      EnableSearchButton(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 

    //Enables the button search 
    private void EnableSearchButton() 
    { 
     MethodInvoker invoker = new MethodInvoker(delegate 
     { 
      BtnSearch.Enabled = true; 
     }); 

     this.Invoke(invoker); 
    } 

    #endregion 

    private void BtnSearch_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      // Serialize the textBoxes text before sending 
      // byte[] buffer = Encoding.ASCII.GetBytes(textBox.Text); 
      string command = "HELOTAGP/1.1\n"; 
      byte[] buffer = Encoding.ASCII.GetBytes(command); 
      _clientSocket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(SendCallback), null); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 

    //Ends pending asynchronous send 
    private void SendCallback(IAsyncResult AR) 
    { 
     try 
     { 
      _clientSocket.EndSend(AR); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 

и полный код сервера (прием + отправка) составляет:

public partial class ServerForm : Form 
{ 
    private Socket _serverSocket; 
    private Socket _clientSocket; // We will only accept one socket 
    private byte[] _buffer; 

    public ServerForm() 
    { 

     InitializeComponent(); 
     StartServer(); 
    } 


    private void StartServer() 
    { 
     try 
     { 
      _serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
      _serverSocket.Bind(new IPEndPoint(IPAddress.Any, 3333)); 
      _serverSocket.Listen(10); 
      _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 

    private void AcceptCallback(IAsyncResult AR) 
    { 
     try 
     { 
      _clientSocket = _serverSocket.EndAccept(AR); 
      _buffer = new byte[_clientSocket.ReceiveBufferSize]; 
      _clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 

    private void ReceiveCallback(IAsyncResult AR) 
    { 
     try 
     { 
      int received = _clientSocket.EndReceive(AR); 
      Array.Resize(ref _buffer, received); // Shrink buffer to trim null characters 
      string text = Encoding.ASCII.GetString(_buffer); 
      Array.Resize(ref _buffer, _clientSocket.ReceiveBufferSize); // Regrow buffer 


      AppendToTextBox(text); 
      // Start receiving data again 
      _clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 

    /// <summary> 
    /// Provides a thread safe way to append text to the textbox 
    /// </summary> 
    private void AppendToTextBox(string text) 
    { 
     MethodInvoker invoker = new MethodInvoker(delegate 
      { 
       // Add two new lines afterwards 
       textBox.Text += text + "\r\n" + "\r\n"; 
      }); 

     this.Invoke(invoker); 
    } 


    //sending data 


    private void BtnSend_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      // Serialize the textBoxes text before sending 
      string command = "Test"; 
      byte[] buffer = Encoding.ASCII.GetBytes(command); 
      _clientSocket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(SendCallback), null); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 

    private void SendCallback(IAsyncResult AR) 
    { 
     try 
     { 
      _clientSocket.EndSend(AR); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 
} 

сервер получает данные правильно, но я не Не знаю, почему клиент не может получить с сервера. Не так ли происходит отправка сервера? или способ получения клиента неправильный? Должен ли я устанавливать IP-адрес для клиента?

Любая помощь приветствуется ....

+0

Вы пробили дыру в брандмауэре своего клиента, чтобы разрешать подключения и трафик на порт 3333? –

+0

@RichardTurner, как сервер, так и клиент работают на одном компьютере. брандмауэр имеет значение? – Liban

+0

Как клиент, так и сервер выступают в качестве сервера .... оба слушают входящие соединения, а ни один не подключается. Пожалуйста, убедитесь, что данный код верен – Polity

ответ

0

Вы неправильно понимают использование сокетов. Сокет имеет как канал чтения, так и канал записи. Оба канала изолированы друг от друга. Рассматривая код клиента, вы используете «serverSocket» для прослушивания входящих данных, когда вы используете «clientSocket» для отправки данных на сервер. Вместо этого вы должны использовать каналы чтения и записи одного и того же сокета.

В качестве пояснения: подключен разъем TCP. Это означает, что для каждого сокета требуется подключение до использования сокета. Прослушивание сокета означает, что вы ожидаете подключения. В вашем клиенте «clientSocket» подключается к серверу, но «serverSocket» никогда не подключается к серверу и сервер никогда не подключается к клиенту (чего он не должен).

+0

жаль, что я новичок в розетках. да ты прав. поэтому, когда клиент подключен к серверу, могу ли я получать данные с тем же соединением? например, используя 'clientSocket' для прослушивания. – Liban

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