C # чтение из NetworkStream с использованием StreamReader - PullRequest
1 голос
/ 17 февраля 2012

Я разработчик Java. Я пытаюсь создать простой C # TCP-клиент. Однако я не могу понять, как заставить эту чертову штуку работать. Вот мой код TCPClient. Кстати, я украл это прямо из MSDN. http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.aspx

    public static void Connect(String server, int port, 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.
            TcpClient client = new TcpClient(server, port);

            // Translate the passed message into ASCII and store it as a Byte array.
            Byte[] data = Encoding.ASCII.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("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 = Encoding.ASCII.GetString(data, 0, bytes);
            Console.WriteLine("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);
        }

        Console.WriteLine("\n Press Enter to continue...");
        Console.Read();
    }

Вот мой Java-сервер.

private ServerSocket socket;
private JAXBContext jaxbContext;
boolean listening = true;

@SuppressWarnings("unused")
private HMSAgentService() {

}

public HMSAgentService(int port) {
    try {
        this.socket = new ServerSocket(port);
        logger.debug("Agent Service listening on port : " + port);
        this.jaxbContext = HMSAgentUtil.getJAXBContext();
        while (listening) {
            new AgentServiceThread(socket.accept(), jaxbContext).start();
        }
    } catch (IOException e) {
        logger.error(e.getMessage(), e);
    } catch (JAXBException e) {
        logger.error(e.getMessage(), e);
    }

}

Он просто запускает новый поток, когда получает клиентское соединение. Теперь моя проблема в том, что программа никогда не движется мимо потока .Write (). Также сервер никогда не получает сообщение. Только после того, как я вызову Stream.close (), сервер получит сообщение. Но это по существу закрывает соединение, и клиент больше не может получать сообщения. Почему происходит. Я пытался использовать Sockets, StreamWriters, StreamReaders и его же историю. На данный момент я обдумываю использование асинхронного метода, но я стараюсь максимально упростить программу, поскольку в этом нет необходимости. Есть ли какой-либо сигнал об окончании записи?

...