def send_Button():
try:
myMsg = "ME: " + text.get()
msg = text.get()
conn.send(msg) ###
textBox.insert(END, myMsg + "\n")
textEntry.delete(0, END)
textBox.yview_pickplace("end")
except NameError:
myMsg = "ME: " + text.get()
msg = text.get()
conn.send(msg) ###
textBox.insert(END, myMsg + "\n")
textEntry.delete(0, END)
textBox.yview_pickplace("end")
这个程序在python2.7中使用了带有socket的tkinter模块。我的程序允许您连接到服务器与您聊天或托管服务器供其他人连接到您,但每当我尝试并测试它时,带有'###‘的线路总是出现错误,它不起作用,出现的错误是:"NameError:全局名称'conn’未定义“或”错误: Errno 10057发送或接收数据的请求被禁止,因为套接字未连接,并且(当使用sendto调用在数据报套接字上发送时)没有提供地址“。
有什么需要帮忙的吗?
发布于 2018-07-14 03:50:41
我认为你正在尝试让程序充当客户端或服务器,只是将s.send()
改为conn.send()
,遗憾的是,事情并没有那么简单。
套接字初始化
在发送或接收数据之前,必须初始化套接字。
对于客户来说,通常是这样的。
send_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # Create the socket
send_socket.connect((serverIp, serverPort)) # Connect to the server
send_socket.send(data) # Send the data to the server
对于服务器,如下所示:
listen_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # Create the socket
listen_socket.bind(("0.0.0.0", port)) # Set the socket to accept client from every interface on the port port
listen_socket.listen(1) # Put the server on listen on the port setted before
accept_socket, addr = self.listen_socket.accept() # when a client connect return the socket to talk with it
data = self.accept_socket.recv(buffer_size) # Receive data form the client of max size buffer_size
文档示例
从你的问题看,我猜你谈论的是s.send()
和conn.send()
this example from the python 2.7 socket docs
这里有四个使用TCP/IP协议的最小示例程序:一个服务器回显它收到的所有数据(只为一个客户端提供服务),以及一个使用它的客户端。请注意,服务器必须执行序列socket()、bind()、listen()、accept() (可能会重复accept()以服务于多个客户端),而客户端只需要序列socket()、connect()。还要注意,服务器不会在它正在侦听的套接字上发送/recv(),而是在由accept()返回的新套接字上发送。
客户端
回显客户端程序
导入套接字host = 'daring.cwi.nl‘#远程主机端口= 50007 #与服务器使用的端口相同s= socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect(( HOST,PORT)) s.sendall('Hello,world') data = s.recv(1024) s.close() print 'Received',repr(数据)
客户端非常简单,它创建套接字s
,然后在使用s.connect()
之后通过它发送数据。
服务器
服务器一是同时有s
和conn
的地方
回显服务器程序
导入套接字HOST = '‘#符号名称表示所有可用接口port = 50007 #任意非特权端口s= socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.bind((HOST,PORT)) s.listen(1) conn,addr = s.accept()打印'Connected by',addr 1: data = conn.recv(1024)如果不是data: break conn.sendall(data) conn.close()
在这个示例中,我们首先创建一个套接字s
,服务器将监听该套接字,然后使用s.accept()
,它将等待客户端连接到服务器,然后返回conn
,这是连接的客户端的套接字。
因此,要向客户端接收或发送数据,您必须使用conn
。
备注
正如这两个示例的文档中所述,服务器只接受一个客户端。因此,如果您希望处理多个客户端,则必须重复accept
步骤,并可能为每个客户端生成一个新的线程,以便其他客户端不必相互等待。
https://stackoverflow.com/questions/51331426
复制相似问题