DataInputStream readUTF дает неверное строковое значение - PullRequest
0 голосов
/ 22 февраля 2020

Я новичок в написании кода, который связывается с сервером, поэтому я начну с чего-то простого: отправить строку на сервер и затем прочитать ее.

Полный код выглядит следующим образом (с цензурированным IP-адресом и портом):

public class ServerCommunication implements Runnable {
//components to connect to server
private Socket socket;
private InputStream inputStream;
private DataInputStream dataInputStream;
private OutputStream outputStream;
private DataOutputStream dataOutputStream;

private static final String TAG = "ServerCommunication"; //for Log.d messages
private int seconds;


public ServerCommunication(int seconds) {
    this.seconds = seconds;
}

@Override
public void run() {
    for(int i = 0; i < seconds; i++) {
        try {
            Log.d(TAG, "startThread: " + i);
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    connectToServer();
    writeSimpleMessageToServer();
    readSimpleMessageFromServer();
}

public void connectToServer() {
    try {
        Log.d(TAG, ".....TRYING_TO_CONNECT.....");
        socket = new Socket("xx.xxx.x.xxx", xxxx); //address, port
        inputStream = socket.getInputStream();
        dataInputStream = new DataInputStream(inputStream);
        outputStream = socket.getOutputStream();
        dataOutputStream = new DataOutputStream(outputStream);
        Log.d(TAG, "SERVER_CONNECTED_!");

    } catch(IOException e) {
        e.printStackTrace();
    }
}

public void writeSimpleMessageToServer() {
    try {
        Log.d(TAG, "...WRITING_TO_SERVER...");

        String message = "yourName";
        dataOutputStream.writeUTF(message);

        dataOutputStream.flush();

    } catch(IOException e) {
        e.printStackTrace();
    }
    Log.d(TAG, "WRITING_DONE");
}

public void readSimpleMessageFromServer() {
    try {
        Log.d(TAG, "...READING_FROM_SERVER...");
        Log.d(TAG, "SERVER_MEDDELANDE: " + dataInputStream.readUTF());

    } catch(IOException e) {
        e.printStackTrace();
    }
    Log.d(TAG, "READING_DONE");
} }

Когда я запускаю код, readUTF не возвращает правильное значение yourName, но вместо этого возвращает строку {"type":"exception","message":"Unexpected char=y"}. Я не знаю, почему это происходит.

Я пытался рассмотреть некоторые другие вопросы, касающиеся той же / подобной проблемы здесь в stackoverflow, и многие указали, что если вы используете writeUTF, то соответствующий readUTF имеет быть использованным - но я уже делаю это, так что это не может быть проблемой. Я сталкивался с тем, что кто-то говорил о том, что writeUTF не только записывает строку, но и записывает, сколько байтов содержит строка, и что вам необходимо сначала прочитать ее, прежде чем пытаться прочитать фактическую строку. Мне не удалось найти каких-либо примеров того, как это работает, поэтому я не знаю, как бы я это сделал или помогло бы решить мою проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...