#_*_coding:骆驼翔子-8_*_ 2023-11-11 19:59 采纳率: 93.3%
浏览 10
已结题

python socket局域网连接不上

服务器代码


from socket import *
from threading import Thread

HOST = "localhost"
PORT = 7777

ADDR = (HOST, PORT)

tcpSerSock = socket(AF_INET, SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(100)
CLI_LIST = []


def conn():
    global CLI_LIST
    while True:
        tcpCliSock, addr = tcpSerSock.accept()
        CLI_LIST.append(tcpCliSock)
        print("收到客户端的链接》》》", addr)


def sendding(text):
    global CLI_LIST
    for i in CLI_LIST:
        i.send(text.encode())


Thread(target=conn).start()

while True:
    a = input("输入信息》》》")
    sendding(a)
    if a == "exit":
        break

for i in CLI_LIST:
    i.close()
tcpSerSock.close()

客户端代码


from socket import *
from time import sleep
import os
from threading import Thread
from subprocess import Popen, PIPE

ip_list = [7777, 8888, 9999]
s = socket(AF_INET, SOCK_STREAM)


def get_pid(exe):
    pid_list = []
    for line in Popen("tasklist", stdin=PIPE, stdout=PIPE, shell=True).stdout.readlines():
        line = str(line)
        if exe in line:
            pid_list.append([i for i in line.split(" ") if "" != i][1])
    return pid_list


def kill_exe(exe):
    for er in get_pid(exe):
        os.system(f"tskill {er}")


coning = True
while coning:
    sleep(0.5)
    for i in ip_list:
        try:
            s.connect(("localhost", i))
            coning = False
            break
        except:
            print(f"链接{i}失败")

while True:
    r = s.recv(4096).decode()
    print("收到信息", r)
    if r == "ex":
        break
    if "cmd " in r:
        Thread(target=lambda:os.system(r.split("cmd ")[1])).start()
    if "kill " in r:
        Thread(target=lambda: kill_exe(r.split("kill ")[1])).start()

s.close()

这两个程序在同一台电脑上运行时,服务器和客户端可以连接上
但是,将程序在两台电脑上运行,发现服务器与客户端连接不上。
我是在学校电脑上运行的,学校电脑用的是网吧系统,重启后数据
全部清零,所有电脑网络链接在交换机上。尝试了socket.SOCK_DGRAM
也就是UDP协议依然连不上。
学校电脑用cmd的ipconfig指令后显示ip是10开头的
请多多指教。

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-11 22:09
    关注

    【以下回答由 GPT 生成】

    问题分析:

    根据提供的代码,客户端在连接服务器时使用的是localhost作为主机地址。这个导致了客户端只会尝试在本地主机上连接服务器,而无法连接到同一局域网下的其他主机。

    解决方案: - 服务器代码中,将HOST变量修改为服务器所在主机的IP地址。可以使用socket.gethostbyname(socket.gethostname())来获取当前服务器的IP地址。例如:HOST = socket.gethostbyname(socket.gethostname())。 - 客户端代码中,将'localhost'修改为服务器所在主机的IP地址。修改try块中s.connect(('localhost', i))s.connect(('服务器IP地址', i))。例如:s.connect(('服务器IP地址', i))

    修改后的服务器代码如下:

    from socket import *
    from threading import Thread
    
    HOST = socket.gethostbyname(socket.gethostname())
    PORT = 7777
    
    ADDR = (HOST, PORT)
    
    tcpSerSock = socket(AF_INET, SOCK_STREAM)
    tcpSerSock.bind(ADDR)
    tcpSerSock.listen(100)
    CLI_LIST = []
    
    
    def conn():
        global CLI_LIST
        while True:
            tcpCliSock, addr = tcpSerSock.accept()
            CLI_LIST.append(tcpCliSock)
            print("收到客户端的链接》》》", addr)
    
    
    def sendding(text):
        global CLI_LIST
        for i in CLI_LIST:
            i.send(text.encode())
    
    
    Thread(target=conn).start()
    
    while True:
        a = input("输入信息》》》")
        sendding(a)
        if a == "exit":
            break
    
    for i in CLI_LIST:
        i.close()
    tcpSerSock.close()
    

    修改后的客户端代码如下:

    from socket import *
    from time import sleep
    import os
    from threading import Thread
    from subprocess import Popen, PIPE
    
    ip_list = [7777, 8888, 9999]
    s = socket(AF_INET, SOCK_STREAM)
    
    
    def get_pid(exe):
        pid_list = []
        for line in Popen("tasklist", stdin=PIPE, stdout=PIPE, shell=True).stdout.readlines():
            line = str(line)
            if exe in line:
                pid_list.append([i for i in line.split(" ") if "" != i][1])
        return pid_list
    
    
    def kill_exe(exe):
        for er in get_pid(exe):
            os.system(f"tskill {er}")
    
    
    coning = True
    while coning:
        sleep(0.5)
        for i in ip_list:
            try:
                s.connect(('服务器IP地址', i))
                print(str(i) + " is open")
                coning = False
                break
            except:
                print(str(i) + " is close")
    
        if coning == False:
            break
    

    请注意,以上代码只是针对指定的服务器IP地址修改,如果实际中服务器的IP地址是动态获取的或者需要适应多个不同的局域网环境,可能需要根据情况进行动态获取和设置。同时,还需要确保服务器和客户端处于同一局域网,并且网络通畅,防火墙没有阻止连接。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月20日
  • 已采纳回答 11月12日
  • 创建了问题 11月11日

悬赏问题

  • ¥300 寻抓云闪付tn组成网页付款链接
  • ¥15 请问Ubuntu要怎么安装chrome呀?
  • ¥15 视频编码 十六进制问题
  • ¥15 Xsheii7我安装这个文件的时候跳出来另一个文件已锁定文件的无一部分进程无法访问。这个该怎么解决
  • ¥15 unity terrain打包后地形错位,跟建筑不在同一个位置,怎么办
  • ¥15 FileNotFoundError 解决方案
  • ¥15 uniapp实现如下图的图表功能
  • ¥15 u-subsection如何修改相邻两个节点样式
  • ¥30 vs2010开发 WFP(windows filtering platform)
  • ¥15 服务端控制goose报文控制块的发布问题