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()