none
TCP/IP komunikace a problém s odpovědí serveru

    Dotaz

  •  

    Dobrý den,

    vyvíjím aplikaci využívající TCP/IP protokol na bázi klient-server na každém stroji.

    Plánovaná komunikace:

    1) na 1. a 2. stroji se spustí server a klient.

    2) uživatel 1. stroje zadá IP 2. stroje, klient na 1. stroji se připojí na server 2. stroje, ten pak pošle poslaná data klientu 2. stroje( tedy na ten samý počítač) a naopak.

    Po každém spojení klienta se servrem a předání dat se server zastaví a čeká na další spojení.

     

    A teď k jádru problému: při připojování na "localhost" mi celá sestava v pořádku běží, ale při připojování na jiný počítač se objeví chyba: cílový počítač neodpověděl v časovém limitu.

     

    Pozn.: Prakticky všechen kód jsem použil z MSDN Library.

     

    Code Snippet

    public void RunServer()

    {

    TcpListener server = null;

    String data = null;

    try

    {

    // Set the TcpListener on port 13000.

    Int32 port = 80;

    IPAddress localAddr = IPAddress.Parse("127.0.0.1");

    // TcpListener server = new TcpListener(port);

    server = new TcpListener(localAddr, port);

    // Start listening for client requests.

    server.Start();

    // Buffer for reading data

    Byte[] bytes = new Byte[256];

    // Enter the listening loop.

    while (true)

    {

    Console.Write("SERVER: Waiting for a connection... ");

    // Perform a blocking call to accept requests.

    // You could also user server.AcceptSocket() here.

    TcpClient client = server.AcceptTcpClient();

    Console.WriteLine("SERVER: Connected!");

    data = null;

    // Get a stream object for reading and writing

    NetworkStream stream = client.GetStream();

    int i;

    // Loop to receive all the data sent by the client.

    while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)

    {

    // Translate data bytes to a ASCII string.

    data = System.Text.Encoding.Unicode.GetString(bytes, 0, i);

    Console.WriteLine("SERVER: Received: {0}", data);

    // Process the data sent by the client.

    // data = data.ToUpper();

     

    byte[] msg = System.Text.Encoding.Unicode.GetBytes(data);

    // Send back a response.

    //stream.Write(msg, 0, msg.Length);

     

    Console.WriteLine("SERVER: Sent: {0}", data);

    }

    // Shutdown and end connection

    client.Close();

    }

    }

    catch (SocketException e)

    {

    Console.WriteLine("SocketException: {0}", e);

    }

    finally

    {

    // Stop listening for new clients.

    server.Stop();

    try

    {

    Connect(ip, data);

    Console.WriteLine("SERVER: Sent: {0}", data);

    }

    catch (Exception ex)

    { Console.WriteLine(ex); }

    }

    }

     

    public void Connect(String server, String message)

    {

    try

    {

    // Create a TcpClient.

    // Note, for this client to work you need to have a TcpServer

    // connected to the same address as specified by the server, port

    // combination.

    Int32 port = 80;

    TcpClient client = new TcpClient(server, port);

    // Translate the passed message into ASCII and store it as a Byte array.

    Byte[] data = System.Text.Encoding.Unicode.GetBytes(message);

    // Get a client stream for reading and writing.

    // Stream stream = client.GetStream();

    NetworkStream stream = client.GetStream();

    // Send the message to the connected TcpServer.

    stream.Write(data, 0, data.Length);

    Console.WriteLine("CLIENT: Sent: {0}", message);

    // Receive the TcpServer.response.

    // Buffer to store the response bytes.

    data = new Byte[256];

    // String to store the response ASCII representation.

    String responseData = String.Empty;

    // Read the first batch of the TcpServer response bytes.

    Int32 bytes = stream.Read(data, 0, data.Length);

    responseData = System.Text.Encoding.Unicode.GetString(data, 0, bytes);

    Console.WriteLine("CLIENT: Received: {0}", responseData);

    // Close everything.

    stream.Close();

    client.Close();

    }

    catch (ArgumentNullException e)

    {

    Console.WriteLine("ArgumentNullException: {0}", e);

    }

    catch (SocketException e)

    {

    Console.WriteLine("SocketException: {0}", e);

    }

    }

     

     

     

    Můžete mi někdo pls poradit, jak tento problém vyřešit, popřípadě pokud máte s touto oblastí nějaké zkušenosti, nastínit jiné řešení problému, i s jinou konstrukcí?

    Díky moc za každou radu.

    26. července 2008 7:11

Odpovědi

Všechny reakce