#python #sockets #client-server
Вопрос:
Так что мой server.py способен принимать данные, которые отправляет клиент, но, похоже, он не покинет цикл while, в котором он получает данные. Если я закомментирую цикл получения данных от клиента и цикл отправки данных с сервера, сервер выйдет из цикла while, в котором он получает данные. Кроме того, и клиент, и сервер просто ничего не делают, кажется, что клиент не получает данные, которые отправляет сервер. Поэтому мне нужна помощь в выяснении того, как отправлять данные с клиента на сервер (эта часть кажется хорошей), а затем отправлять данные обратно с сервера на клиент (именно здесь я заблокирован).
Вот код
import threading import time import random import socket def server(): try: ss = socket.socket(socket.AF_INET, socket.SOCK_STREAM) print("[S]: Server socket created") except socket.error as err: print('socket open error: {}n'.format(err)) exit() server_binding = ('', 50007) ss.bind(server_binding) ss.listen(1) host = socket.gethostname() print("[S]: Server host name is {}".format(host)) localhost_ip = (socket.gethostbyname(host)) print("[S]: Server IP address is {}".format(localhost_ip)) csockid, addr = ss.accept() print ("[S]: Got a connection request from a client at {}".format(addr)) # send a intro message to the client. #msg = "Welcome to CS 352!" #csockid.send(msg.encode('utf-8')) msg = csockid.recv(1024) str1 = ""; while msg: print('Received:' msg.decode('utf-8')) str1 = str1 msg.decode('utf-8'); msg = csockid.recv(1024) StringList = str1.split('n'); print(StringList) string = ""; for line in StringList: string1 = line #string2 = reversed_string(string1); string2 = ''; string3 = string2 string1 'n'; string = string string3; csockid.send((string3).encode('utf-8')); print(string) csockid.send(string.encode('utf-8')); # Close the server socket ss.close() exit() if __name__ == "__main__": server()
import threading import time import random import socket def client(): try: cs = socket.socket(socket.AF_INET, socket.SOCK_STREAM) print("[C]: Client socket created") except socket.error as err: print('socket open error: {} n'.format(err)) exit() # Define the port on which you want to connect to the server port = 50007 localhost_addr = socket.gethostbyname(socket.gethostname()) # connect to the server on local machine server_binding = (localhost_addr, port) cs.connect(server_binding) # Receive data from the server #data_from_server=cs.recv(100) #print("[C]: Data received from server: {}".format(data_from_server.decode('utf-8'))) file = open('in-proj0.txt', 'r') Lines = file.readlines() for line in Lines: cs.send((line).encode('utf-8')); # close the client socket print("here") msg = cs.recv(8) str1 = ""; while msg: print('Received:' msg.decode('utf-8')) str1 = str1 msg.decode('utf-8'); msg = cs.recv(8) print(str1); cs.close() exit() if __name__ == "__main__": client()
Комментарии:
1. Цикл сервера
while
может завершиться только тогда, когда клиент закроет подключенный сокет. Цикл «Клиентs
в то время как» может завершиться только тогда, когда сервер закроет принятый сокет. Ни одно из этих закрытий никогда не происходит, но даже если бы это произошло, у вас все равно был бы тупик. Клиент не хочет закрывать сокет до получения ответа, поэтому цикл сервера никогда не завершится и, следовательно, он никогда не отправит ответ. Переосмысливать. Сервер должен обрабатывать каждое сообщение по мере его получения, а не после завершения цикла.