#java #python #python-3.x #sockets #python-sockets
#java #python #python-3.x #сокеты #python-сокеты
Вопрос:
У меня запущен экземпляр Java socket server, из которого я хочу получать и отправлять данные с помощью python. У меня также есть код, эквивалентный Java, для выполнения задачи, но перезапись того же процесса на Python не выполняет задание, и соединение прерывается после тайм-аута сервера.
public class ctakesSocketClient {
public static void main(String[] args) throws UnknownHostException, IOException, ClassNotFoundException, InterruptedException{
Socket socket = null;
ObjectOutputStream oos = null;
DataInputStream ois = null;
socket = new Socket("10.2.1.21", 6700);
System.out.println("Connected");
String string = "Blood Pressure";
System.out.println("Sending request to Socket Server");
OutputStream oStream = socket.getOutputStream();
oStream.write(string.getBytes());
socket.shutdownOutput();
long started = System.currentTimeMillis();
InputStream iStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int numRead = 0;
List<Byte> lstBytes = new ArrayList<>();
while((numRead = iStream.read(bytes)) > 0) {
for (int i = 0; i < numRead; i ) {
lstBytes.add(bytes[i]);
}
}
byte[] result = new byte[lstBytes.size()];
for(int i = 0; i < lstBytes.size(); i ) {
result[i] = lstBytes.get(i);
}
long finished = System.currentTimeMillis();
System.out.println("Message: " new String(result));
System.out.println("Time taken: " ((finished-started)/1000) " minutes");
socket.close();
}
}
Написанный код на Python:
import socket
def client_program():
host = '10.2.1.21'
port = 6700
client_socket = socket.socket() # instantiate
client_socket.connect((host, port)) # connect to the server
print('Çonnected')
message = input(" -> ") 'n' # take input
print(message)
while message.lower().strip() != 'bye':
client_socket.send(message.encode()) # send message
client_socket.shutdown(socket.SHUT_WR)
data = client_socket.recv(1024).decode() # receive response
print('Received from server: ' data) # show in terminal
message = input(" -> ") # again take input
client_socket.close()
if __name__ == '__main__':
client_program()
Комментарии:
1. Почему вы звоните
shutdown
? Можете ли вы перейтиSHUT_WR
к нему?2. Почему socket send завершает работу после отправки? Если вы сделаете это, на следующей итерации цикла передача будет отключена.
3. @cup Насколько я знаю, нам нужно завершить операцию записи, прежде чем мы начнем получать данные. Пожалуйста, поправьте меня, если я ошибаюсь.
4. @MousamSingh вам не нужно закрывать его.
5. @MousamSingh: не закрывает и не выключает сокет. Просто запись и чтение. Как только сокет отключается для записи, вы больше не можете записывать данные, т. Е. цикл тогда не имеет смысла. Это неверно и в коде Java. Также не то, что
send
не гарантируется запись всех данных (проверьте возвращаемое значение) иrecv
не гарантируется чтение всех данных (проверьте возвращаемое значение). Также TCP не является протоколом обмена сообщениями, а просто заботится о байтах — определять, где начинается и заканчивается сообщение, зависит от приложения, и вам может потребоваться некоторая граница сообщения или что-то подобное.