Пытаюсь настроить непрерывный обмен пакетами между клиентом и сервером.
Сервер работает на Twisted
Python
.
Есть работающий клиент на Python
. Принцип такой: клиент подсоединяется к серверу (отправляет пустое сообщение ""
), в ответ от сервера приходит json-массив вида [идентификационный номер игрока]
. После этого клиент отправляет простой json-массив ["start"]
, после чего от сервера приходит json-массив, содержащий начальные данные клиента [Xнач., Yнач. ...]
.
Начал писать клиент на Java под Андроид, но почему-то после отправки пустого сообщения и получения первого json-массива с идентификационным номером игрока, на следущее отправленное на сервер json-сообщение ["start"]
не получаю ответа (null
). Использую AsyncTask
для создания непрерывного обмена пакетами без разрыва соединения (я так понимаю, что для работы серверной фабрики Twisted
, необходимо удерживать соединение). В чём может быть причина (вопрос только относительно работы клиента: почему аналогичный клиент на Python
продолжает обмениваться пакетами с сервером, а клиент на Java
получает ответ только на первую пустую строку)?
Клиент на Python (работает):
import socket
import os
import json
data = []
data.append('start')
def connection():
serv_addr = ('IP', ...)
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_socket.connect(serv_addr)
print('Connection is established')
tcp_socket.send('')
data_to_recv = tcp_socket.recv(1024)
print('1 - Client: ' + '')
print('1 - Server: ' + data_to_recv)
while True:
tcp_socket.send(json.dumps(data))
data_to_recv = tcp_socket.recv(1024)
if data_to_recv != '':
print('2 - Client: '+ json.dumps(data))
print('2 - Server: '+ data_to_recv)
tcp_socket.close()
def client():
connection()
client()
Клиент на Java - Аналог клиента на Python (но почему-то получает ответ от сервера только на первое пустое сообщение):
class ProgressTask extends AsyncTask<String, Object, Void> {
OutputStream os;
OutputStreamWriter osw;
BufferedWriter bw;
InputStream is;
InputStreamReader isr;
BufferedReader br;
String message;
String sendMessage;
JSONArray json = new JSONArray();
Socket socket =null;
@Override
protected void onPreExecute() {
json.put("start");
Log.e("TCP Client", "C: Connecting...");
return;
}
@Override
protected Void doInBackground(String... params) {
Socket socket = null;
try {
socket = new Socket("IP", ...);
os = socket.getOutputStream();
osw = new OutputStreamWriter(os);
bw = new BufferedWriter(osw);
sendMessage="\n";
//если здесь поставить просто пустые кавычки, как для клиента на Python, то от сервера ответ с идентификационным номером
//игрока уже не приходит
bw.write(sendMessage);
bw.flush();
System.out.println("Message_1 sent to the server: " + sendMessage);
//Get the return message from the server
is = socket.getInputStream();
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
message = br.readLine();
//bw.close();
//br.close();
System.out.println("Message_1 received from the server: " + message);
publishProgress(message);
int k = 1;
while (k>0) {
os = socket.getOutputStream();
osw = new OutputStreamWriter(os);
bw = new BufferedWriter(osw);
sendMessage=json.toString();
bw.write(sendMessage);
bw.flush();
System.out.println("Message_2 sent to the server: " + sendMessage);
//Get the return message from the server
is = socket.getInputStream();
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
message = br.readLine();
//bw.close();
//br.close();
System.out.println("Message_2 received from the server: " + message);
if (message != null) {
publishProgress(message);
}
}//конец while
} catch (IOException e) {
System.out.println("Ошибка: ");
e.printStackTrace();
}
return null;
}
@Override
protected void onProgressUpdate(Object... items) {
editText.setText(items[0].toString());
}
@Override
protected void onPostExecute(Void unused) {
Toast.makeText(getActivity(), "Задача завершена", Toast.LENGTH_SHORT).show();
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Не получается подключить библиотеку jsoupПоиск в интернете особо не помог, проблема осталась
Можно ли проверить через Hibernate грамматику конкретного SQL диалекта (Postgres, MySQL, Oracle и тд