Python-如何通过socket.makefile执行套接字通信?
根据该职位的最高评分答案: 码头: 我正在尝试解决如何使用Python-如何通过socket.makefile执行套接字通信?,python,sockets,Python,Sockets,根据该职位的最高评分答案: 码头: 我正在尝试解决如何使用socket.makefile通过套接字发送/接收。以下是我到目前为止的情况: Server.py: # Server.py import socket # module-level variables HOST='127.0.0.1' PORT=65439 ACK_TEXT = 'text_received' def main(): # instantiate a socket object sock =
socket.makefile
通过套接字发送/接收。以下是我到目前为止的情况:
Server.py:
# Server.py
import socket
# module-level variables
HOST='127.0.0.1'
PORT=65439
ACK_TEXT = 'text_received'
def main():
# instantiate a socket object
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print('socket instantiated')
# bind the socket
sock.bind((HOST, PORT))
print('socket binded')
# start the socket listening
sock.listen(10)
print('socket now listening')
# accept the socket response from the client, get the connection object
conn, addr = sock.accept() # Note: execution waits here until the client calls sock.connect()
print('socket accepted, got connection object')
sockFile = sock.makefile()
while True:
message = sockFile.readline()
print('received: ' + str(message))
# end while
# end main
if __name__ == '__main__':
main()
Client.py:
# Client.py
import socket
import time
# module-level variables
HOST='127.0.0.1'
PORT=65439
ACK_TEXT = 'text_received'
def main():
# instantiate a socket object
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print('socket instantiated')
# connect the socket
sock.connect((HOST, PORT)) # Note: if execution gets here before the server starts up, this line will cause a crash
print('socket connected')
sockFile = sock.makefile(mode='w')
myCounter = 0
while True:
message = 'message ' + str(myCounter)
print('sending: ' + message)
sockFile.write(message)
myCounter += 1
time.sleep(1) # wait for 1 sec before sending next text message
# end while
# end main
if __name__ == '__main__':
main()
现在,如果我启动服务器,然后从单独的命令提示客户端,客户端似乎正在工作:
Client.py输出:
$ python3 Client.py
socket instantiated
socket connected
sending: message 0
sending: message 1
sending: message 2
sending: message 3
sending: message 4
sending: message 5
但服务器出现故障,出现以下错误:
$ python3 Server.py
socket instantiated
socket binded
socket now listening
socket accepted, got connection object
Traceback (most recent call last):
File "Server.py", line 38, in <module>
main()
File "Server.py", line 32, in main
message = sockFile.readline()
File "/usr/lib/python3.6/socket.py", line 586, in readinto
return self._sock.recv_into(b)
OSError: [Errno 107] Transport endpoint is not connected
但这也不起作用,Client.py
仍然像以前一样工作,但现在Server.py
只是挂起:
$ python3 Server.py
socket instantiated
socket binded
socket now listening
socket accepted, got connection object
(hangs here forever)
---编辑2---
现在我真的很困惑。根据这篇文章:
我几乎复制了海报代码,因此Server.py现在看起来如下所示:
# Server.py
import socket
# module-level variables
HOST='127.0.0.1'
PORT=65439
ACK_TEXT = 'text_received'
def main():
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((HOST, PORT))
print(f'Waiting for connection on port {s.getsockname()[1]}')
s.listen(1)
conn, addr = s.accept()
print(f'Connected by {addr}')
with conn:
f = conn.makefile(mode='rw')
while True:
print('before f.readline()')
m = f.readline()
print('after f.readline()')
print(f'msg: {m!r}')
if not m:
exit(0)
f.write(m)
f.flush()
# end main
if __name__ == '__main__':
main()
而且Server.py
仍然挂起读取
$ python3 Server.py
Waiting for connection on port 65439
Connected by ('127.0.0.1', 47536)
before f.readline()
根据回复中的最后一篇帖子,海报最初的担忧被认为是固定的,所以现在应该可以了。我仍然不知道如何做到这一点
---编辑3---
我正在使用带有最新更新的ubuntu18.04.3
和Python 3.6.9
,如果这对服务器代码很重要的话:
conn, addr = sock.accept()
calls sock.connect()
sockFile = sock.makefile()
while True:
message = sockFile.readline()
您制作了一个客户端套接字(conn),但从未使用过它。
客户端正在写入,因此您应该从客户端套接字(conn)读取
我还认为应该从while循环内部调用accept
while True:
conn, addr = sock.accept()
sockFile = conn.makefile()
message = sockFile.readline()
这是唯一一篇有
sock.makefile()
代码的文章,我可以开始工作了。谢谢
while True:
conn, addr = sock.accept()
sockFile = conn.makefile()
message = sockFile.readline()