Python Socket,我该如何在s.send和conn.send之间进行选择?

时间:2018-07-13 19:07:19

标签: python sockets tkinter

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中使用带有套接字的tkinter模块。我的程序允许您连接到服务器以与之聊天或托管服务器以供其他人连接至您,但是每当我尝试对其进行测试时,带有“ ###”的行总是会出现错误,并且它不起作用,出现的错误是:“ NameError:未定义全局名称'conn'”或“错误:[Errno 10057]由于套接字未连接,并且发送或接收数据的请求被禁止,并且(使用sendto调用在数据报套接字上发送时,没有提供地址”。

请帮忙吗?

1 个答案:

答案 0 :(得分:2)

我认为您只是想让程序充当客户端或服务器,只是将s.send()更改为conn.send(),可惜这不是那么简单。

Socket Initializzation

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

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

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()返回的新套接字上发送消息。

客户

  

Echo客户端程序

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()之后,它只是通过它发送数据。

服务器

一个服务器既有s又有conn

  

Echo服务器程序

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(),它将等待客户端连接到服务器,然后返回{{1} },它是连接的客户端的套接字。

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

注释

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