Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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导入模块,但不';我一开始就认不出来了?_Python_Sockets - Fatal编程技术网

Python导入模块,但不';我一开始就认不出来了?

Python导入模块,但不';我一开始就认不出来了?,python,sockets,Python,Sockets,老实说,我不知道为什么会发生这种情况,我认为由于它不在堆栈交换上,所以我犯了一个非常错误的错误。这里是错误: s=socket.socket(socket.AF\u INET,socket.SOCK\u流) UnboundLocalError:赋值前引用的局部变量“socket” tcpServer.py import socket def Main(): UID = 1001 sockets = [] users = [] ## create usernames li

老实说,我不知道为什么会发生这种情况,我认为由于它不在堆栈交换上,所以我犯了一个非常错误的错误。这里是错误:

s=socket.socket(socket.AF\u INET,socket.SOCK\u流) UnboundLocalError:赋值前引用的局部变量“socket”

tcpServer.py

import socket

def Main():
    UID = 1001
    sockets = []
    users = [] ## create usernames list
    sessionLimit = input("session Queue Limit: ")

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind(('192.168.1.74', 12127))

    s.listen(sessionLimit) ## listen for 1 connection at a time

    while True:
        c, addr = s.accept()
        sockets.append(c)
        users.append(c.recv(1024).decode('utf-8'))
        print("Connection from " + str(addr))

        data = c.recv(1024).decode('utf-8') ## recieve 1024 bytes from client at a time, and then decode it into utf-8
        if not data:
            break

        temp == data
        temp.split(" ") 
        if temp[0] == "//": ## check to see if user has sent command
            if temp[1] == "msg":
                for i in range(len(users)):
                    if users[i] == temp[2]:
                        sockets[i].send((" ".join(temp[::2])).encode('utf-8'))
        else: ## else, send data to all users. Could just use s.sendall(data.encode('utf-8'))
            for socket in sockets:
                socket.send(data.encode('utf-8')) ## send to sockets[socket]

        ##print("From connected user: " + data)
        ##data = data.upper()
        ##print("Sending: " + data)
        ##c.send(data.encode('utf-8'))

        ## command listening
        commands = input("-> ")
        commands.split(" ")

        if commands[0] == "exit":
            c.close() ## close connection
        elif commands[0] == "/msg":
            for i in range(len(users)):
                if users[i] == commands[1]:
                    sockets[i].send((" ".join(commands[::1])).encode('utf-8'))
    """
       elif commands[0] == "/rename": ## dont implement yet, due to users[] length changing
            for i in range(len(users)):
                if users[i] == commands[1]:
                    sockets[i].send("<server_" + UID + "> rename " + commands[2].encode('utf-8'))
        """
    c.close()

    if __name__ == "__main__":
        Main()
导入套接字
def Main():
UID=1001
套接字=[]
用户=[]##创建用户名列表
sessionLimit=input(“会话队列限制:”)
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s、 绑定('192.168.1.74',12127))
s、 侦听(会话限制)##一次侦听一个连接
尽管如此:
c、 addr=s.accept()
sockets.append(c)
users.append(c.recv(1024).解码('utf-8'))
打印(“连接自”+str(地址))
data=c.recv(1024)。解码('utf-8')##一次从客户端接收1024字节,然后将其解码为utf-8
如果没有数据:
打破
温度==数据
临时拆分(“”)
如果temp[0]==“/”:##检查用户是否发送了命令
如果温度[1]=“msg”:
对于范围内的i(len(用户)):
如果用户[i]==temp[2]:
套接字[i].send(“”.join(temp[::2]).encode('utf-8'))
else:##否则,向所有用户发送数据。只能使用s.sendall(data.encode('utf-8'))
对于插座中的插座:
socket.send(data.encode('utf-8'))##发送到sockets[socket]
##打印(“来自连接的用户:+数据)
##data=data.upper()
##打印(“发送:”+数据)
##c、 发送(数据编码('utf-8'))
##命令监听
命令=输入(“->”)
命令。拆分(“”)
如果命令[0]=“退出”:
c、 close()##关闭连接
elif命令[0]==“/msg”:
对于范围内的i(len(用户)):
如果用户[i]==命令[1]:
sockets[i].send(“”.join(commands[::1]).encode('utf-8'))
"""
elif命令[0]==“/rename”:##由于用户[]长度更改,尚未实现
对于范围内的i(len(用户)):
如果用户[i]==命令[1]:
套接字[i]。发送(“重命名”+命令[2]。编码('utf-8'))
"""
c、 关闭()
如果名称=“\uuuuu main\uuuuuuuu”:
Main()
谢谢你的帮助!
-Jacob

问题在于,在执行以下代码块时,在
Main()
函数的上下文中使用变量名
socket

    for socket in sockets:
        socket.send(data.encode('utf-8')) ## send to sockets[socket]
这导致
socket
库出现命名问题。如果您将其更改为:

    for sock in sockets:
        sock.send(data.encode('utf-8')) ## send to sockets[socket]
它将开始工作。我还必须以不同的方式缩进您的代码,以确保所有代码都在您设置的
Main()
函数中,并且必须确保
input()
被解析为int。以下是适用于我的完整代码块供参考:

import socket

def Main():
    UID = 1001
    sockets = []
    users = [] ## create usernames list
    sessionLimit = int(input("session Queue Limit: "))

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind(('192.168.1.74', 12127))
    s.listen(sessionLimit) ## listen for 1 connection at a time

    while True:
        c, addr = s.accept()
        sockets.append(c)
        users.append(c.recv(1024).decode('utf-8'))
        print("Connection from " + str(addr))

        data = c.recv(1024).decode('utf-8') ## recieve 1024 bytes from client at a time, and then decode it into utf-8
        if not data:
            break

        temp == data
        temp.split(" ") 
        if temp[0] == "//": ## check to see if user has sent command
            if temp[1] == "msg":
                for i in range(len(users)):
                    if users[i] == temp[2]:
                        sockets[i].send((" ".join(temp[::2])).encode('utf-8'))
        else: ## else, send data to all users. Could just use s.sendall(data.encode('utf-8'))
            for sock in sockets:
                sock.send(data.encode('utf-8')) ## send to sockets[socket]

        ##print("From connected user: " + data)
        ##data = data.upper()
        ##print("Sending: " + data)
        ##c.send(data.encode('utf-8'))

        ## command listening
        commands = input("-> ")
        commands.split(" ")

        if commands[0] == "exit":
            c.close() ## close connection
        elif commands[0] == "/msg":
            for i in range(len(users)):
                if users[i] == commands[1]:
                    sockets[i].send((" ".join(commands[::1])).encode('utf-8'))
        """
        elif commands[0] == "/rename": ## dont implement yet, due to users[] length changing
            for i in range(len(users)):
                if users[i] == commands[1]:
                    sockets[i].send("<server_" + UID + "> rename " + commands[2].encode('utf-8'))
        """
    c.close()

if __name__ == "__main__":
    Main()
导入套接字
def Main():
UID=1001
套接字=[]
用户=[]##创建用户名列表
sessionLimit=int(输入(“会话队列限制:”)
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s、 绑定('192.168.1.74',12127))
s、 侦听(会话限制)##一次侦听一个连接
尽管如此:
c、 addr=s.accept()
sockets.append(c)
users.append(c.recv(1024).解码('utf-8'))
打印(“连接自”+str(地址))
data=c.recv(1024)。解码('utf-8')##一次从客户端接收1024字节,然后将其解码为utf-8
如果没有数据:
打破
温度==数据
临时拆分(“”)
如果temp[0]==“/”:##检查用户是否发送了命令
如果温度[1]=“msg”:
对于范围内的i(len(用户)):
如果用户[i]==temp[2]:
套接字[i].send(“”.join(temp[::2]).encode('utf-8'))
else:##否则,向所有用户发送数据。只能使用s.sendall(data.encode('utf-8'))
对于承插式插座:
sock.send(data.encode('utf-8'))##发送到套接字[套接字]
##打印(“来自连接的用户:+数据)
##data=data.upper()
##打印(“发送:”+数据)
##c、 发送(数据编码('utf-8'))
##命令监听
命令=输入(“->”)
命令。拆分(“”)
如果命令[0]=“退出”:
c、 close()##关闭连接
elif命令[0]==“/msg”:
对于范围内的i(len(用户)):
如果用户[i]==命令[1]:
sockets[i].send(“”.join(commands[::1]).encode('utf-8'))
"""
elif命令[0]==“/rename”:##由于用户[]长度更改,尚未实现
对于范围内的i(len(用户)):
如果用户[i]==命令[1]:
套接字[i]。发送(“重命名”+命令[2]。编码('utf-8'))
"""
c、 关闭()
如果名称=“\uuuuu main\uuuuuuuu”:
Main()

您确定正在运行的版本就是您粘贴的版本吗?这个版本,当我运行它时,只告诉我我不能绑定到那个地址(这是有意义的),但我没有得到任何UboundLocalError。在我的服务器上:3.4.3+在我的工作站上:3.5.1。基本代码(创建和绑定套接字)在服务器上运行得非常完美,但是由于我添加了命令和多个用户功能,它由于某些原因无法接受;socket.socket()对不起,我是说,你试过运行这个代码吗?因为当我运行它时,socket没有问题。socket()我试着运行它,代码也只给出了绑定的一个错误,但是缩进都是错误的,因此代码无论如何都不会运行。我太傻了,我知道这会很简单。我试图寻找变量套接字的用法,应该已经看到了这一点。干杯-雅各布