gpt4 book ai didi

python - Python-如何通过socket.makefile执行套接字通信?

转载 作者:行者123 更新时间:2023-12-03 12:02:58 25 4
gpt4 key购买 nike

根据对这篇文章的最高评价答案:

Socket : 2 way communication in python

和码头:

https://docs.python.org/3/library/socket.html#targetText=socket.makefile

我试图弄清楚如何使用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

使用 socket.makefile时如何在服务器上成功连接传输终结点?我不确定这种情况下的语法是什么。我最终并没有像使用更传统的方式在服务器上那样使用 connaddr,也许这就是我要出问题的地方?

- - 编辑 - -

Server.py中,我尝试将 connectionmakefile()函数结合使用,如下所示:
.
.
.
# 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')

connFile = conn.makefile()

while True:
message = connFile.readline()
print('received: ' + str(message))
# end while
.
.
.

但这也不起作用, Client.py仍然像以前一样工作,但是现在 Server.py只是挂起了:
$ python3 Server.py 
socket instantiated
socket binded
socket now listening
socket accepted, got connection object
(hangs here forever)

-编辑2-

现在我真的很困惑。根据这篇文章:

https://bugs.python.org/issue35928

我几乎复制了海报代码,因此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-

我正在使用最新更新的 Ubuntu 18.04.3Python 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()

关于python - Python-如何通过socket.makefile执行套接字通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59978887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com