Борьба с взаимодействием Клиент-Сервер в Python

#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 в то время как» может завершиться только тогда, когда сервер закроет принятый сокет. Ни одно из этих закрытий никогда не происходит, но даже если бы это произошло, у вас все равно был бы тупик. Клиент не хочет закрывать сокет до получения ответа, поэтому цикл сервера никогда не завершится и, следовательно, он никогда не отправит ответ. Переосмысливать. Сервер должен обрабатывать каждое сообщение по мере его получения, а не после завершения цикла.