【问题标题】:Python Socket, how do i choose between s.send and conn.send?Python Socket,我如何在 s.send 和 conn.send 之间进行选择?
【发布时间】:2018-07-14 03:50:41
【问题描述】:
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 调用在数据报套接字上发送时)没有提供地址”。

有什么帮助吗?

【问题讨论】:

  • conn 在哪里定义?
  • 捕获NameError,然后重试完全相同的代码有什么意义?保证会再次发生相同的错误...

标签: python sockets tkinter


【解决方案1】:

我认为您正试图让程序充当客户端或服务器,只是将 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 ()。另请注意,服务器不会在它正在侦听的套接字上 sendall()/recv(),而是在 accept() 返回的新套接字上发送。

客户

回显客户端程序

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)

客户端非常直接,它创建了套接字s,然后在使用s.connect() 之后,它只是通过它发送数据。

服务器

服务器一是有sconn的地方

回显服务器程序

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

首先,我们创建一个套接字s,服务器将在该套接字上侦听,然后使用s.accept(),它将等待客户端连接到服务器,然后返回conn,这是已连接的客户端。

所以要向客户端接收或发送数据,您必须使用conn

注意事项

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

【讨论】:

  • 我之前已经在两个功能中建立了套接字,如果我按下一个按钮,那么程序也会要求输入 IP 和端口以进行连接。如果我按下另一个按钮,那么它会到达第二个功能并要求一个端口来托管服务器。例如,这两个功能都建立了套接字;功能一的客户端和功能二的服务器。我只是尝试使用 send() 和 recv() 接收/发送消息,前缀 (s, conn) 取决于程序是在服务器模式还是客户端,我如何在代码中创建这种依赖关系?对不起,我无法解释:)
  • 对不起,我没有从你的问题中得到答案啊哈哈,顺便说一句,我认为最简单的方法是将套接字作为参数传递给函数并保存传递正确的。或者,您可以创建一个新变量,在其中保存正确的前缀,例如 my_socket = smy_socket = conn,具体取决于具体情况
猜你喜欢
  • 2023-03-25
  • 2012-11-27
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多