2014-01-23 5 views
2

온라인에서 찾은 작은 채팅 프로그램에 대한 코드를보고 있습니다. 원래 2.7 용으로 작성되었지만 3.2와 함께 작동하는 것 같습니다. 유일한 문제는 내가 문자열, 숫자 만 보낼 수 있다는 것입니다 :소켓 프로그램에서 문자열을 가져올 수 없습니다.

chat.py 파일의 소스 코드 :

from socket import * 
HOST = '' 
PORT = 8000 
s = socket(AF_INET, SOCK_STREAM) 
s.bind((HOST, PORT)) 
s.listen(1) 
conn, addr = s.accept() 
print ('Connected by ' + str(addr)) 
i = True 
while i is True: 
    data = conn.recv(1024) 
    print ("Received " + repr(data)) 
    reply = str(input("Reply: ")) 
    conn.send(reply) 
conn.close() 

그리고 client.py 소스 파일 :

from socket import * 
HOST = '' 
PORT = 8000 
s = socket(AF_INET, SOCK_STREAM) 
s.connect((HOST, PORT)) # client-side, connects to a host 
while True: 
    message = str(input("Your Message: ")) 
    s.send(message) 
    print ("Awaiting reply...") 
    reply = s.recv(1024) # 1024 is max data that can be received 
    print ("Received " + repr(reply)) 
s.close() 

내가 실행 이 두 개의 별도 터미널을 사용하여, 그들은 작동하지만 문자열을 보내지 마십시오.

+0

어떤 오류를 당신이 얻을 않거나 문자열이 무엇을 보낼 발생하면? –

답변

2

당신은 소켓 작업, 당신이 주변에 전달하는 메시지가 아마 바이트 b'bytes'해야합니다 감사합니다. 자세한 내용은 여기를 http://docs.python.org/3.3/library/stdtypes.html

message = b'Message I want to pass' 

확인 : 파이썬 2.X에서는 strbytes 같은

그래서 귀하의 메시지 있어야합니다 뭔가 파이썬 3.x의 속에있는 것을 사실이다.

message = message.encode() 

이 유형을 선택하여 bytesstr을 변환 할 수있는 올바른 접근 방식인지 확인 마십시오 http://docs.python.org/3/library/functions.html#inputinput에 따르면

는 같은 bytesmessage를 인코딩해야합니다 의미하는 str을 반환 message

+0

안녕하세요, @ 답장을 보내 주셔서 감사합니다. 메시지 라인을 다음과 같이 포맷 할 수 있습니다 : message = input (b "Your Message :") – user3089646

+0

@ user3089646 아니요, 단지 입력 내용이 소켓을 통과하기 전에'bytes' 유형으로 확보되어야한다는 것을 의미합니다 . 따라서'message = input ('Your message :')'는 완벽하게 괜찮습니다. 그러나 그 이후와's.send (message) '전에 반드시'type (message)'가'bytes'인지 확인해야합니다. – woozyking

0

raw_inputinput과 관련이없는 오류로 인해 소켓 코드가 잘못되었습니다. 문자열을 읽고 대신 input 인 Python 코드로 평가하려고 시도하는 대신 쉘에서 문자열을 읽으려고했습니다.

대신이 시도

:

chat.py

from socket import * 
HOST = '' 
PORT = 8000 
s = socket(AF_INET, SOCK_STREAM) 
s.bind((HOST, PORT)) 
s.listen(1) 
conn, addr = s.accept() 
print ('Connected by ' + str(addr)) 
i = True 
while i is True: 
    data = conn.recv(1024) 
    print ("Received " + repr(data)) 
    reply = str(raw_input("Reply: ")) 
    conn.send(reply) 
conn.close() 

client.py

from socket import * 
HOST = '' 
PORT = 8000 
s = socket(AF_INET, SOCK_STREAM) 
s.connect((HOST, PORT)) # client-side, connects to a host 
while True: 
    message = str(raw_input("Your Message: ")) 
    s.send(message) 
    print ("Awaiting reply...") 
    reply = s.recv(1024) # 1024 is max data that can be received 
    print ("Received " + repr(reply)) 
s.close() 
+0

안녕하세요 @ Stephen Diehl, 답장을 보내 주셔서 감사합니다. 나는이 일을 보게되어 기뻤지 만, IDLE은 3.2이지만 쉘은 2.7이었다. 3.2로 업데이트하면 더 많은 오류가 발생합니다. – user3089646

+0

Python 3에서'raw_input'은 더 이상 사용되지 않습니다. 대신 파이썬 3의'input'은 파이썬 2에서'raw_input'처럼 동작합니다 – woozyking

관련 문제