套接字未连接到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 ... 等