2016-11-30 6 views
0

Я пытаюсь написать простую клиент-серверную программу с использованием python (а не python3), и всякий раз, когда я набираю сообщение для отправки, он дает мне различные ошибки, такие как:Обмен сообщениями Client-Server дает ошибку (программирование на языке Python)

Файл "", линия 1 привет меня зовут DARP ^ SyntaxError: неверный синтаксис

ИЛИ

Файл "", линия 1, в NameError: название «ад о»не определен

ИЛИ

Файл "", линия 1 привет мир ^ SyntaxError: неожиданный EOF при разборе

Вот код сервера:

import socket 

def Main(): 
    host = socket.gethostname() 
    port = 5000 

    s = socket.socket() 
    s.bind((host, port)) 

    s.listen(1) 
    c, addr = s.accept() 
    print("Connection from: "+str(addr)) 
    while True: 
     data = c.recv(1024).decode('utf-8') 
     if not data: 
      break 
     print("From connected user: "+data) 
     data = data.upper() 
     print("Sending: "+data) 
     c.send(data.encode('utf-8')) 
    c.close() 

if __name__ == '__main__': 
    Main() 

И вот код клиента

import socket 

def Main(): 
    host = socket.gethostname() 
    port = 5000 

    s = socket.socket() 
    s.connect((host, port)) 

    message = input("-> ") 
    while message != 'q': 
     s.send(message.encode('utf-8')) 
     data = s.recv(1024).decode('utf-8') 
     print("Recieved from server: " + data) 
     message = input("-> ") 
    s.close() 

if __name__ == '__main__': 
    Main() 

Несмотря на то, что я могу создать это соединение, проблема возникает после ввода сообщения. Любая помощь будет оценена, спасибо!

ответ

0

В Python2 используйте raw_input вместо input.

+0

Было жаль, спасибо, ха-ха –

0

Вы должны использовать raw_input вместо input, так как raw_input сохранит ваш ввод и преобразует его в соответствующий тип. При использовании input вы должны добавить котировки вокруг ввода.

Вы можете проверить это в питона документы: https://docs.python.org/2/library/functions.html#raw_input

0

Что касается кода, то, единственное изменение, которое вы должны сделать здесь в серверном коде. Замените c.close() с помощью s.close(), поскольку c является переменной соединения, тогда как s является сокетом сервера в соответствии с вашим кодом.

Я сделал свой код запуска, после внесения изменений он работает как expected.I запускал его в Python 3.

Серверный код здесь:

import socket 

def Main(): 
    host = "127.0.0.1"  # supply different hostname instead of socket.gethostname() 
    port = 5000 

    s = socket.socket() 
    s.bind((host, port)) 

    s.listen(1) 
    c, addr = s.accept() 
    print("Connection from: "+str(addr)) 
    while True: 
     data = c.recv(1024).decode('utf-8') 
     if not data: 
      break 
     print("From connected user: "+data) 
     data = data.upper() 
     print("Sending: "+data) 
     c.send(data.encode('utf-8')) 
    s.close()   # it is s which indicates socket 

if __name__ == '__main__': 
    Main() 

И код клиента как предоставленные вами:

import socket 

def Main(): 
# here, client is using the hostname whereas you need to give different 
# hostname for the server (127.0.0.1 for example) otherwise the code doesn't 
# work.You can do the reverse as well. 
    host = socket.gethostname() 
    port = 5000 

    s = socket.socket() 
    s.connect((host, port)) 

    message = input("-> ") 
    while message != 'q': 
     s.send(message.encode('utf-8')) 
     data = s.recv(1024).decode('utf-8') 
     print("Recieved from server: " + data) 
     message = input("-> ") 
    s.close() 

if __name__ == '__main__': 
    Main()