C # проблема с сетью - PullRequest
       24

C # проблема с сетью

2 голосов
/ 18 января 2012

Я пытаюсь создать программу, которая позволяет пользователям загружать JAR-файлы для некоторого стороннего кода, который они написали на онлайн-сервере, а затем получать в ответ сообщение String.

Онлайн-сервер кодируется с использованием Java со стандартной сетью TCP Socket. Клиент использует часть дополнительного программного обеспечения, что означает, что я должен использовать C # для загрузки файлов. Код, который я написал, включен ниже. В этой программе загрузчик файлов работает нормально, но по какой-то причине клиент зависает при достижении input.ReadLine (), где он должен получить ответ на сообщение String от сервера.

public static string sendFile(string filepath) {

    String response = "";

    // Get the file
    Stream fileStream = File.OpenRead(filepath);

    byte[] buffer = new byte[fileStream.Length];
    fileStream.Read(buffer, 0, buffer.Length);

    try {

        // Create the connection
        TCPClient client = new TCPClient("127.0.0.1", 21000);

        NetworkStream stream = client.GetStream();

        // Send the file to the server
        stream.Write(buffer, 0, buffer.Length);
        stream.Flush();

        // Receive a single string response from the server
        if (stream.CanRead) {

            StreamReader input = new StreamReader(stream);
            inputString = input.ReadLine();

        }

        input.Close();
        stream.Close();
        client.Close();

    }

    catch (IOException e) {

        print ("Error: " + e);

    }

    // Return the response message string
    return inputString;

}

Я также пытался реализовать приведенный выше код, используя StreamWriter, а не писать напрямую из самого NetworkStream. К сожалению, класс StreamWriter не имеет метода для отправки байтового массива (только массив символов). Мне интересно, вызвана ли проблема тем, что я вызываю метод Write для NetworkStream напрямую, а не с помощью StreamWriter.

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

С уважением,

Midavi.

Ответы [ 4 ]

1 голос
/ 18 января 2012

Readline зависает, потому что он вернется только после успешного чтения строки с сервера, это недостаток использования блокирующих сокетов.Убедитесь, что ваш сервер случайно отправляет строку (строка, заканчивающаяся на «\ n»

1 голос
/ 18 января 2012

Ваш поток заканчивается концом строки?Readline будет блокироваться до тех пор, пока поток не закончится или не получит символ конца строки.Если ваш загрузчик не завершает строку, он может действовать так, как вы говорите.

0 голосов
/ 18 января 2012

Readline ожидание конца строки \ r \ n, но в java конец строки по умолчанию только \ n. Это может быть разница, которая может заблокировать ваше общение, но чтобы быть уверенным, вам нужно отслеживать сетевую активность или вы можете использовать другой метод для чтения данных.

Вы можете попробовать использовать метод read:

byte[] myReadBuffer = new byte[512];
int numberOfBytesRead = 0;

// Incoming message may be larger than the buffer size.
do{
    numberOfBytesRead = stream.Read(myReadBuffer, 0, myReadBuffer.Length);  
    // do something with data in myReadBuffer
}
while(stream.DataAvailable);
0 голосов
/ 18 января 2012

Оформить заказ networkComms.net , библиотека сетевого взаимодействия C # с открытым исходным кодом.Короткий пример, демонстрирующий основную функциональность здесь , надеюсь, не слишком сложную!Большинство проблем, с которыми вы можете столкнуться, уже решены, и это может сэкономить вам время.

...