Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python套接字,如何在s.send和conn.send之间进行选择?_Python_Sockets_Tkinter - Fatal编程技术网

Python套接字,如何在s.send和conn.send之间进行选择?

Python套接字,如何在s.send和conn.send之间进行选择?,python,sockets,tkinter,Python,Sockets,Tkinter,该程序使用python2.7中带有套接字的tkinter模块。我的程序允许您连接到一个服务器与您聊天,或者托管一个服务器让其他人与您连接,但是每当我尝试测试它时,带有“####”的行总是会出现错误,并且它不起作用,出现的错误是:“NameError:全局名称“conn”未定义”或“error:[Errno 10057]不允许发送或接收数据的请求,因为套接字未连接,并且(使用sendto调用在数据报套接字上发送时)未提供地址” 有什么帮助吗?我想你是想让程序充当客户机或服务器,只是把s.send(

该程序使用python2.7中带有套接字的tkinter模块。我的程序允许您连接到一个服务器与您聊天,或者托管一个服务器让其他人与您连接,但是每当我尝试测试它时,带有“####”的行总是会出现错误,并且它不起作用,出现的错误是:“NameError:全局名称“conn”未定义”或“error:[Errno 10057]不允许发送或接收数据的请求,因为套接字未连接,并且(使用sendto调用在数据报套接字上发送时)未提供地址”


有什么帮助吗?

我想你是想让程序充当客户机或服务器,只是把
s.send()
改成
conn.send()
,可惜没有那么简单

套接字初始化 在发送或接收数据之前,必须初始化套接字

对于客户来说,通常是这样的

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")
对于服务器,如下所示:

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
文档示例 从你的问题来看,我猜你说的是
s.send()
conn.send()

下面是使用TCP/IP协议的四个最简单的示例程序:一个服务器回显它接收到的所有数据(仅为一个客户端提供服务),另一个客户端使用它。请注意,服务器必须执行sequence socket()、bind()、listen()、accept()(可能重复accept()以服务多个客户端),而客户端只需要sequence socket()、connect()。还请注意,服务器不会在其侦听的套接字上发送all()/recv(),而是在accept()返回的新套接字上发送

客户 回声客户端程序 客户端非常先进,它创建套接字
s
,然后在使用
s.connect()
后通过它发送数据

服务器 服务器一是既有
s
又有
conn

回声服务器程序 在本例中,我们首先创建一个套接字
s
,服务器将在其上侦听,然后使用
s.accept()
它将等待客户端连接到服务器,然后返回连接客户端的套接字
conn

因此,要向客户端接收或发送数据,必须使用
conn

笔记
正如这两个示例中的文档所述,服务器只接受一个客户端。因此,如果您想处理多个客户端,您必须重复
接受
步骤,并可能为每个客户端生成一个新线程,以便其他客户端不必等待其他客户端。

conn是在哪里定义的?捕获
名称错误
,然后重试完全相同的代码有什么意义?同样的错误肯定会再次发生……我之前已经在两个功能中建立了套接字,如果我按下一个按钮,那么程序也会要求输入IP和端口进行连接。如果我按下另一个按钮,那么它将访问第二个函数并请求一个端口来承载服务器。这两种功能都建立了插座,例如:;客户端用于func 1,服务器用于func 2。我只是尝试用send()和recv()接收/发送MSG,前缀(s,conn)取决于程序是在服务器模式还是在客户端,如何在代码中创建依赖关系?很抱歉,我无法解释:)很抱歉,我没有从你的问题中了解到这一点。哈哈,顺便说一句,我认为最简单的方法是将套接字作为参数传递给函数,然后保存并将其传递给正确的函数。或者您可以创建一个新变量,在其中保存正确的前缀,如
my_socket=s
my_socket=conn
,具体取决于具体情况
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
import socket
HOST = 'daring.cwi.nl'    # The remote host
PORT = 50007              # The same port as used by the server
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(data)
import socket
HOST = ''                 # Symbolic name meaning all available interfaces
PORT = 50007              # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
    data = conn.recv(1024)
    if not data: 
        break
    conn.sendall(data)
conn.close()