套接字未连接到Python

套接字未连接到Python,python,python-3.x,sockets,Python,Python 3.x,Sockets,我试过看这个问题,但没有帮助: 我的代码是: import socket def actual_work(): return 'dummy_reply' def main(): sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM ) try: sock.bind( ('127.0.0.1', 6666) ) while True: data, a

我试过看这个问题,但没有帮助:

我的代码是:

import socket

def actual_work():

    return 'dummy_reply'


def main():
    sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
    try:
        sock.bind( ('127.0.0.1', 6666) )

        while True:
            data, addr = sock.recvfrom( 4096 )
            reply = actual_work()
            sock.sendto(reply, addr)
    except KeyboardInterrupt:
        pass
    finally:
        sock.close()
if __name__ == '__main__':
    main()
获取了以下错误:

Traceback (most recent call last):
  File "testserver.py", line 22, in <module>
    main()
  File "testserver.py", line 14, in main
    data, addr = sock.recvfrom( 4096 )
OSError: [WinError 10057] A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied
回溯(最近一次呼叫最后一次):
文件“testserver.py”,第22行,在
main()
文件“testserver.py”,第14行,在main中
数据,addr=sock.recvfrom(4096)
OSError:[WinError 10057]不允许发送或接收数据的请求,因为套接字未连接,并且(使用sendto调用在数据报套接字上发送时)未提供地址

首先,您需要一个客户端代码来连接服务器。 这是一个TCP套接字,因此它是面向连接的

这意味着在进行任何数据传输(socket.recv()、socket.send())之前,您需要请求从客户端到服务器的连接,并且服务器必须接受该连接

建立连接后,您将能够在套接字之间自由发送数据

这是一个简单的套接字设计示例,可普遍应用于您的程序:

客户示例

import socket


# create an ipv4 (AF_INET) socket object using the tcp protocol (SOCK_STREAM)
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# connect the client
# client.connect((target, port))
client.connect(('0.0.0.0', 9999))

# send some data (in this case a String)
client.send('test data')

# receive the response data (4096 is recommended buffer size)
response = client.recv(4096)

print(response)
服务器示例

import socket
import threading

bind_ip = '0.0.0.0'
bind_port = 9999
max_connections = 5 #edit this to whatever number of connections you need

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((bind_ip, bind_port))
server.listen(max_connections)  # max backlog of connections

print (('Listening on {}:{}').format(bind_ip, bind_port))


def handle_client_connection(client_socket):
    request = client_socket.recv(4096 )
    print (str(request))
    client_socket.send('ACK!')
    client_socket.close()

while True:
    client_sock, address = server.accept()
    print (('Accepted connection from {}:{}').format(address[0], address[1]))
    client_handler = threading.Thread(
        target=handle_client_connection,
        args=(client_sock,)  # without comma you'd get a... TypeError: handle_client_connection() argument after * must be a sequence, not _socketobject
    )
    client_handler.start()
这个例子应该在服务器控制台和ACK中打印测试数据!在客户端控制台中


编辑:我不确定python3打印是否能像我在这里写的那样工作。。。但这只是一个小细节。总的想法是在这种情况下最重要的。当我使用电脑时,我会尝试运行此程序,如果出现任何语法错误,则会更正打印内容

除非您首先接受了套接字连接,否则无法从任何人处重新接收。因为这是一个TCP套接字。。。所以另一个问题的答案应该能解决你的问题,我试过了。但它不起作用。你能修改我在问题中提到的代码,并说明你的确切意思吗。修改后我有很多错误。请让我知道。@AndreMotta你能帮我吗?我将添加一个示例代码,因为我现在在github的手机中。但这是一个服务器。您需要一些其他代码来连接到它,以便您可以接受连接。。。像这样:这样想,这是一个TCP套接字。因此,在任何数据传输之前都需要建立连接。这意味着客户端程序需要请求到服务器地址的连接,服务器必须接受该连接。只有在接受完成后,客户端才能向服务器发送数据,服务器才能从发送的数据中接收数据。让我试试。我正在看评论中建议的例子。它不起作用,给了我错误。我会试试你的。试试这个,不要修改。小心打印格式,因为它可能会被python3破坏。然后在client_handler函数中添加您自己的函数!错误:`文件“testclient.py”,第9行,在client.connect(('0.0.0',9999))OSError:[WinError 10049]请求的地址在其上下文中无效`您需要输入有效的ip地址。使用本地主机范围!127.0.1.1 ... 127.0.1.10 ... 等