Я новичок в написании кода, который связывается с сервером, поэтому я начну с чего-то простого: отправить строку на сервер и затем прочитать ее.
Полный код выглядит следующим образом (с цензурированным 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 не только записывает строку, но и записывает, сколько байтов содержит строка, и что вам необходимо сначала прочитать ее, прежде чем пытаться прочитать фактическую строку. Мне не удалось найти каких-либо примеров того, как это работает, поэтому я не знаю, как бы я это сделал или помогло бы решить мою проблему.