0

我正在尝试设置本地服务器,以便同一本地网络上的其他 PC 可以连接到它。尝试这样做时,在客户端,我收到以下错误:[Errno 10061] No connection could be made because the target machine positively denied it

我已经搜索了几个小时,仍然无法解决这个问题。我也尝试关闭我的防火墙,但没有。

这些是我的服务器和客户端代码:

服务器代码:

import socket
import threading
import SocketServer
import datetime

ver_codes = []



class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        print threading.current_thread().isDaemon()
        data = self.request.recv(1024)
        command = data.split()[0]
        if(command=="login"):
            if(logged_in(data.split()[1])==False):
                self.request.sendall(login(data.split()[1], data.split()[2]))
            else:
                self.request.sendall("already in")


class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
    pass

def client(ip, port, message):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((ip, port))
    try:
        sock.sendall(message)
        response = sock.recv(1024)
        print "Received: {}".format(response)
    finally:
        sock.close()

def logged_in(id_num):
    for i in ver_codes:
        if(i[0]==id_num):
            return True
    return False

def login(username, password):
    login_file = open("Login.txt", "r")
    match = login_file.readline()
    while(match!="*"):
        if(match.split()[0]==username):
            if(match.split()[1]==password):
                ver_codes.append([match.split()[0], encryption_code(match.split()[2])])
                login_file.close()
                return "{} {}".format(match.split()[2], encryption_code(match.split()[2]))
                print "And Here"
        match = login_file.readline()
    return "Denied"
    login_file.close()

def encryption_code(to_encrypt):
    now = datetime.datetime.now()
    return int(str(now.microsecond)) * int(to_encrypt)


if __name__ == "__main__":
HOST, PORT = "localhost", 7274

server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
ip, port = server.server_address
print server.server_address

server_thread = threading.Thread(target=server.serve_forever)
server_thread.daemon = False
server_thread.start()
print "Server loop running in thread:", server_thread.name

客户代码:

import socket
import sys

HOST, PORT = "localhost", 7274
data = " ".join(sys.argv[1:])

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
sock.connect((HOST, PORT))
sock.sendall("login mahdiNolan m1373")

received = sock.recv(1024)
finally:
sock.close()

我真的很感激你能给我的任何帮助!非常感谢!

4

1 回答 1

1

您的问题是因为您正在监听localhost- 这只会接受来自本地计算机的连接。

如果您想接受来自任何地方的连接,而不是"localhost"只传递空字符串""。这等效于指定INADDR_ANYC 套接字 API - 请参阅ip手册页以获取更多信息,或者此页面看起来也有一些有用的解释。简而言之,这意味着“接受任何本地接口上的连接”。

代替空字符串,您可以指定本地接口的 IP 地址以仅接受该接口上的连接 - 除非您的机器内部有多个网卡(例如充当网关),否则您不太可能需要这样做(例如充当网关)并且您只想要在其中一个网络上处理请求。

此外,在客户端,您应该使用机器的实际地址 - 替换"localhost"为服务器机器的 IP 地址或主机名。例如,类似"192.168.0.99". 如果你想在 Windows 下找到服务器的 IP 地址,打开一个 DOS 窗口并运行ipconfig命令,查找带有的行IPv4 Address(假设你很可能有一个 IPv4 网络)。

Windows 防火墙也会阻止服务器接受您已经找到的连接,但您不需要禁用它 - 一旦您运行服务器,您应该会看到一个弹出窗口,您可以在其中指示它接受连接(那是在 Windows 7 上,在其他版本上可能会有所不同)。无论如何,关闭软件防火墙应该可以让一切正常工作,尽管这是否是安全风险超出了这个问题的范围。

于 2013-01-29T14:00:16.647 回答