使用线程时的套接字问题

2024-06-30

闲暇时我一直在做一个python游戏,遇到了一个问题。我正在使用基本线程模块来处理套接字,当我使用一个客户端连接到服务器文件时,它工作正常。但更重要的是,在第一个之后的任何连接都会冻结服务器和第一个客户端。

这是服务器的代码

import socket
import random
import thread
from saveState import Save
from grid import Grid   
import time
players = 0
save = Save()
grid = Grid()

def ready(c):
    ready = raw_input("Are you ready to play?\n")
    if(ready == "yes" or ready == "y"):
        grid.makeGrid() 
        c.send("ready")
def clientThread(conn,players):

    while True:
        print "taking requests"
        request = conn.recv(1024)
        segments = request.split(",,")
        if(segments[0] == "0" and players<200):
            print "registering player", addr
            serial = random.choice(list(range(999999)))
            conn.send("{}".format(serial))
            save.players[serial] = segments[2:]
            print save.players[serial][9]
            players+=1
        elif(segments[0] == "3"):
            if(segments[2] == "land"):
                conn.send("{},,{},,{},,{}".format(grid.getLandType(int(save.players[serial][9]),int(save.players[serial][10])), grid.getDesc(int(save.players[serial][9]),int(save.players[serial][10])),int(save.players[serial][9]),int(save.players[serial][10])))
        elif(segments[0]=="2"):
            if(segments[2]=="playerX" and int(segments[3])==-1):
                save.players[serial][9] = int(save.players[int(serial)][9])-1 
            elif(segments[2]=="playerX"):
                save.players[serial][9] = int(save.players[int(serial)][9])+1 
            if(segments[2]=="playerY" and int(segments[3])==-1):
                save.players[serial][10] = int(save.players[int(serial)][10])-1 
            elif(segments[2]=="playerY"):
                save.players[serial][10] = int(save.players[int(serial)][10])+1 
        elif(segments[0]=="4"):
            alreadySent = []
            for m in grid.monsters:
                if(m.X==save.players[int[segment[1]]][9] and m.Y==save.players[int[segment[1]]][10] and alreadySent[m]==False):
                    conn.send("{},,{}".format(m.name, True))
                elif(time.clock == 60*60*(12+8)):
                    conn.send("{},,{}".format("You see the sun set on the horizon. Monsters will be more aggressive now.", False))
        else:       
            print "sorry, there is an inconsistency in the request or the queue is full."



try:
    #start up socket
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    name = socket.gethostbyname(socket.gethostname())
    print name
    port = input("select port\n")
    s.bind((name, port))
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    #listen for any attempts to connect to the api
    #if anyone connects, give them a serial number and add their data to a storage file
    while True: 
        s.listen(5)
        c,addr = s.accept()
        thread.start_new_thread(ready,(c,))
        thread.start_new_thread(clientThread,(c, players))
    conn.close
    sock.close
except socket.error:
    print " either the server port is closed or in use. try again"

和客户

import random
from grid import Grid
from player import Player
from descriptions import Descriptions
import socket
import time
import thread
description = Descriptions()

def descisionHandler(s,serial):
    while True:
        s.send("{},,{},,{}".format(3,serial,"land"))
        response = s.recv(1024).split(",,")
        print "you are on a {} tile \n {} \n {} \n {}".format(response[0], response[1],response[2], response[3])
        action=raw_input("What Will You Do?\n")
        try:
            if(action == "west" and player.locX>0):
                s.send("{},,{},,{},,{}".format(2,serial,"playerX",-1))
                time.sleep(0.5)
            elif(action == "east" and player.locX<199):
                s.send("{},,{},,{},,{}".format(2,serial,"playerX",1))
                time.sleep(0.5)
            elif(action == "north" and player.locY>0):
                s.send("{},,{},,{},,{}".format(2,serial,"playerY",-1))
                time.sleep(0.5)
            elif(action == "south" and player.locY<199):
                s.send("{},,{},,{},,{}".format(2,serial,"playerY",1))
                time.sleep(0.5)
          #  elif(action == "attack" and monster_data[1]):
              #  print "The {} wakes up! A battle begins!".format(monster_data[0])
            elif(action == "profile"):
                print " You are {} \n  {} \n your role is {} \n you have an attack of {} \n a defense of {} \n a speed of {} \n and {} hitpoints \n attacks: {} \n you are located at  {} {}".format(player.name,
                    player.backstory,player.role,player.attack,player.defense,player.speed, player.hitpoints, player.attacks, player.locX, player.locY)
            elif(action == "exit"):
                break
        except IndexError:
            pass

def eventHandler(s,serial):
    while True:
        s.send("{},,{}".format(4,serial))
        response = s.recv(1024).split(",,")
        print response[0]
        return bool(response[1])



while True:
    try:
        print "\nWelcome to Overseer! We need a few things before we begin\n"
        name = raw_input("What is your name?\n")
        backstory = raw_input("What is in your past: choose one \n chosen \n magician \n poet\n")
        role = raw_input("what is your class: choose one \n Warrior \n Mage \n Rougue \n Bard\n")
        player = Player(name,description.player_backstory[backstory], role, 5,5,5,10, {"scrap": 10}, random.choice(list(range(200))), random.choice(list(range(200))))

        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        host = raw_input("what host are you connecting to?")
        port = input("what port?\n")

        s.connect((host,port))
        print "connection successful." 
        time.sleep(5)
        s.send("{},,{},,{},,{},,{},,{},,{},,{},,{},,{},,{},,{},,{}".format(0,0,name,backstory,role,5,5,5,5,10,player.attacks,player.locX,player.locY))
        serial = s.recv(1024)
        print "You're serial number is {}".format(serial)
        while(s.recv(1024) != "ready"):
            pass
        break
    except socket.error:
        print "server is not running or is busy. please try again."

eventThread = thread.start_new_thread(eventHandler,(s,serial))
descisionThread = thread.start_new_thread(descisionHandler,(s,serial))

while 1:
    pass

我做了一些研究,我最好的猜测是我需要使用线程模块中的锁,但我不确定。有什么建议么?

提前致谢!


所以问题是控制台输入,正如 theSmallNothing 所说。如果不进行严重的黑客攻击,确实没有办法绕过这个限制,所以我建议即兴发挥。我的解决方案是使用 python 创建一个 Web 应用程序,而不是使用控制台。这样做有一些优点。

  • 服务器可以轻松地一次处理多个输入
  • 输入时可能会发生一些事情(我的问题的解决方案)
  • 用户无需下载任何文件,因为只需输入网址即可访问所有内容。

虽然不是完美的解决方案,但有时寻找替代方案是退而求其次的选择。

感谢大家的大力帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用线程时的套接字问题 的相关文章

  • 如何在IDLE中同时运行两个模块

    我正在开发一个超级简单的套接字程序 我有客户端代码和服务器代码 如何同时运行这两个 py 文件以查看它们是否有效 您可以同时运行 IDLE Python shell 的多个实例 因此 打开 IDLE 并运行服务器代码 然后再次打开 IDLE
  • 命令错误,退出状态 1: python setup.py Egg_info 检查日志以获取完整的命令输出 - 通过 pip 安装 auto-py-to-exe 时

    我正在尝试在与我通常通过 pip 使用不同的 Windows 设备上下载 auto py to exe 但是 当运行时 我收到错误 抱歉 它太长了 ERROR Command errored out with exit status 1 c
  • 查找框和裁剪图像的角点

    Hey Guys I am working with numpy and opencv and want to get a image cropped by the contours of it Here is one example wh
  • java.io.IOException:服务发现失败

    我正在开发一个 Android 应用程序 在两部配对的智能手机之间使用蓝牙连接 蓝牙逻辑基于著名的BluetoothChat SDK示例 管理服务器线程的 服务 类accept 一个客户端线程connect 和一个用于在套接字上读 写的线程
  • 使用脚本取消设置 PDF 字体

    我正在使用 xhtml2pdf 库自动创建 PDF 几个月前我有过这个问题 https stackoverflow com questions 25203219 xhtml2pdf doesnt embed helvetica 库嵌入了我没
  • 为什么我不能将 addstr() 添加到 pythoncurses 窗口中的最后一行/列?

    使用Python 我尝试使用addstr 将光标位置写入curses 窗口的右下角 但出现错误 ScreenH 2工作正常 但打印在窗口底部的第二行 ScreenH 1根本不起作用 我究竟做错了什么 import curses Screen
  • 如何在 Python 中执行等效的 Excel INDEX MATCH

    我有一个问题 关于如何执行相当于使用 Excel 中的 INDEX MATCH 函数返回值并在 Python 中应用它的操作 作为一名对大型数据集执行数据分析和操作的 Excel 用户 为了提高效率 我已转向 Python 我试图做的是根据
  • 从 pexpect 中提取 stderr

    我的问题很简单 我可以吗 expect 使用 pexpect 查看 stderr 上的某些输出 它似乎pexpect spawn 只能用于期望 stdout 上的输出 乌托邦的例子 import pexpect child pexpect
  • PyCharm 项目文件消失了

    我当时正在做一个 python 项目JetBrains PyCharm 2016 2 https www jetbrains com pycharm 在 Lubuntu 上 突然之间 我的所有项目文件都从 IDE 中消失了 我尝试了以下方法
  • 如何在pytorch中使用多个GPU?

    我使用此命令来使用 GPU device torch device cuda 0 if torch cuda is available else cpu 但是 我想使用两个 GPUjupyter 像这样 device torch devic
  • 如何在 Anaconda(Jupyter 笔记本)中导入 python 自定义类

    我无法找到如何使用 anaconda 中的 Jupyter 笔记本在 Python 中导入自定义类 在我的工作文件夹中有一个文件 用户 ipynb 包含类名User 在同一文件夹中的其他文件中 我尝试使用以下命令导入此类 从用户导入用户 我
  • 为什么追加会覆盖列表?

    我正在尝试 hackerrank 的一些问题并遇到了这个问题https www hackerrank com challenges list com经理 问题 https www hackerrank com challenges list
  • 使用 itertools.product 并想要播种一个值

    所以我写了一个小脚本来从网站下载图片 它通过 7 个字母字符值 其中第一个字符始终是数字 问题是 如果我想停止脚本并再次启动它 我必须从头开始 我可以用我得到的最后一个值以某种方式播种 itertools product 吗 这样我就不必再
  • Python 中的一维马哈拉诺比斯距离

    我一直在努力validate我的计算代码马哈拉诺比斯距离写在Python 并仔细检查以比较 OpenCV 中的结果 我的数据点均为 1 维 5 行 x 1 列 In OpenCV C 我成功计算了马哈拉诺比斯距离方面数据点的尺寸为上述尺寸
  • 从 Runnable 类内部访问共享变量

    我需要在主类的 main 方法中定义一个共享变量 我需要两个线程才能访问该共享变量 我通过实现 Runnable 接口并实现该接口的抽象 run 方法来创建线程 如何从实现 Runnable 接口的类中定义的 run 方法中引用 Main
  • DataFrame.stack() 之后的新索引级别名称

    注意这个问题 https stackoverflow com questions 26002474 pandas name of the column after a group by function 28303765 28303765看
  • 多处理和美好价值

    有谁知道在多处理中创建进程或池时设置进程或池的良好值的简单方法 os nice increment Add increment to the process s niceness Return the new niceness Availa
  • Python pandas 使用 read_hdf 和 HDFStore.select 从 HDF5 文件读取特定值

    所以我使用一个简单的数据集创建了 hdf5 文件 如下所示 gt gt gt pd read hdf STORAGE2 h5 table A B 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 使用这个脚本 import pan
  • 如何使 Selenium WebDriver 不等待整个页面加载

    我正在使用 python 2 7 和 Selenium webdriver for Firefox 我有一个无法解决或在互联网上找到解决方案的问题 我的任务是打开大约 10k 个网页 adsl 路由器 Web 界面 通过 IP 地址 并上传
  • python中1+1可以等于3吗? [复制]

    这个问题在这里已经有答案了 在继续之前 我知道人们应该never做这个 这个问题纯粹是出于教育目的 我进行这个练习是为了更好地理解 python 的内部结构ctypes 以及它们如何工作 我知道在 python 中更改整数的值相对容易 其实

随机推荐

  • 绘制一个图,其中顶点之间的距离对应于边权重

    当我给他一个加权图和边权重顶点之间的点到顶点之间的距离 就像是 public ArrayOfCoordinatesForVertices super hyper algorithm weighted graph return foo 这通常
  • Java 中的迭代字典

    我有一本java字典 protected Dictionary
  • 如何等到我的批处理文件完成

    我正在做一个程序 我需要启动 cmd 并启动一个批处理文件 问题是我正在使用MyProcess WaithForexit 我认为它不会等到批处理文件处理完成 它只是等待 cmd 关闭 到目前为止我的代码 System Diagnostics
  • 如何从我的审核表中删除条目?

    我目前正在与 Hibernate Envers 合作 如何删除审计表中与我要删除的实体相关的条目 我的实体与其他实体没有关系 我发现我必须这样做onPostDelete我的自定义监听器的方法 import org hibernate env
  • 如何动态地从对象中提取所有元素

    如何从对象中提取特定列 我有一个列数组 我希望从对象中提取这些字段 该对象将由作为项目的映射循环函数构造 现在在这里 如何动态检查我的字段 我不想要这样的 item col 0 请告诉我一个捷径 const person firstName
  • 使用 range-v3 读取以逗号分隔的数据行

    是的 因为我最近问了一个非常类似的问题 如何读取以逗号分隔的整数列表 但这次我被困在读取由逗号分隔数据组成的字符串行上 将我之前处理整数的代码转换为处理数据块字符串肯定很简单 对吧 好的 所以我从文件或标准输入中读取数据 该文件或标准输入有
  • Ruby:在 Windows 7 下安装 EventMachine 时出现问题

    我尝试通过捆绑包在 Windows 7 上安装 gem EventMachine 使用 Ruby 1 9 2 和 RubyInstaller 但出现以下错误 我还安装了 DevKit 并且它可以工作 但我仍然无法弄清楚问题出在哪里 Inst
  • JavaScript 中的 touchstart 不再返回 TouchList

    我遇到了一个非常奇怪的问题 我正在绑定touchstart事件到一个元素 并且想要检索事件的 X 和 Y 坐标 全部文档 http developer apple com library safari documentation apple
  • 如何以列格式单独显示AJAX响应值?

    我使用 AJAX 从 PHP 中仅获得 3 个用户值 并且该值必须以列格式显示 我已经尝试过下面的代码 但它没有显示 我得到的输出就像所有名字都垂直显示 然后垂直显示姓氏后 AJAX document ready function sear
  • jQuery 会在过滤选择器中的其他参数之前搜索 ID 吗?

    这个问题与性能有关 如果我使用如下选择器 myID a Does this find myID and filter by a 或者我应该这样写声明 myID find a 我不确定 jQuery 是否足够聪明 可以首先使用 ID 执行此语
  • 我的新游戏 JButton 无法运行?

    您好 我目前正在做一项作业 已完成 98 我制作了 gui 程序 其中 jtextfield 设置为 0 但当你玩游戏时它会发生变化 现在我创建了一个名为 NEW GAME 和 QUIT 的 j 按钮 单击 我的退出 按钮后效果很好 但我的
  • 在 C++ 中连接 __FILE__ 和 __LINE__ 宏

    我希望我的异常消息包含有关异常位置的信息 所以我想要这样的东西 define LOCATION FILE LINE throw std exception std string ABCD LOCATION 这个定义显然是不正确的 我怎样才能
  • 我应该选择哪个框架 - Seam、Wicket、JSF 还是 GWT? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • mysql-connector-java 升级到 8.0.11 更改了从数据库检索的所有日期值

    对于 Spring 项目 mysql connector java已迁移自6 0 6 to 8 0 11 因此与8 0 11问题如下 Caused by com mysql cj exceptions InvalidConnectionAt
  • 如何在 MS ACCESS 中使用与 Oracle Rownum 相同的函数

    我遇到一个问题 我做了一个可以通过检测滚动位置来加载数据的功能 该功能是用SQL语句 Rownum 制作的 它只在Oracle中有效 但在ACCESS中无效 我想查询数据并进行处理 ID value 1 aa 3 bb 使用 Rownum
  • 在 gitlab CI/CD 中验证 gcloud 服务帐户

    我正在使用 gcloud service key json 从 gitlab ci yml 文件将服务部署到 gcloud 我收到这个错误 google cloud sdk bin gcloud auth activate service
  • 如何在 Application.Run(form1) 执行时隐藏 form1?

    我有一个运行的 form1Application Run 我想隐藏这个表单 我需要它隐藏 因为我在后台运行一些东西 所以它们必须执行 并打开另一个表单进行登录 我尝试的方法是在我的 form1 构造函数中执行命令this Hide 如果登录
  • 暴露 Firestore 中的项目 ID 是否存在安全漏洞?

    我在 Firestore 中有几个项目 当客户端在浏览器中访问每个项目时 我通过 URL 参数从 Firestore 传递项目的 id 例如http id 4ZDOiynoK25j2ikJlbZq访问其数据 即使我对数据库使用了一些安全规则
  • QML ListView 方法positionViewAtEnd() 的作用恰恰相反

    我要疯了 我在 ScrollView 中有一个 ListView 连接到继承 QAbstractListModel 的模型 当对象添加到模型中时 ListView 使用委托来显示它们 到目前为止 一切都很好 但我真的希望视图保持滚动到底部
  • 使用线程时的套接字问题

    闲暇时我一直在做一个python游戏 遇到了一个问题 我正在使用基本线程模块来处理套接字 当我使用一个客户端连接到服务器文件时 它工作正常 但更重要的是 在第一个之后的任何连接都会冻结服务器和第一个客户端 这是服务器的代码 import s