使用线程时的套接字问题

凯尔·罗伯茨(Kyle Roberts)

我在业余时间一直在开发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

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

提前致谢!

凯尔·罗伯茨(Kyle Roberts)

因此,问题出在控制台输入上,如TheSmallNothing所说。没有严重的黑客攻击,实际上没有办法解决此限制,所以我提议即兴创作。我的解决方案是使用python创建Web应用程序,而不使用控制台。这有一些好处。

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

虽然这不是一个完美的解决方案,但有时找到另一种选择是次之。

谢谢大家的帮助!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

线程/套接字和MySql(Java)的问题

来自分类Dev

在C#中使用C套接字时的问题

来自分类Dev

编写我的Server.c套接字以维护多线程时出现问题

来自分类Dev

使用线程的套接字写入错误

来自分类Dev

使用套接字和线程写文件

来自分类Dev

使用互斥锁时,多个线程可以通过单个ØMQ套接字发送消息吗?

来自分类Dev

python 多线程和套接字连接问题

来自分类Dev

多线程和套接字编程问题(多连接)

来自分类Dev

线程UDP套接字

来自分类Dev

从套接字流中读取时是否需要线程休眠?

来自分类Dev

关闭活动时如何停止活动的线程和套接字

来自分类Dev

在Linux机器中使用套接字发送和接收文件时出现C ++问题

来自分类Dev

使用套接字时的烧瓶调试模式

来自分类Dev

Java套接字问题

来自分类Dev

Java套接字问题

来自分类Dev

从套接字读取问题

来自分类Dev

将客户端套接字与服务器套接字连接时出现问题

来自分类Dev

如何使用线程JAVA从套接字读取输入

来自分类Dev

Python线程将无法开始使用套接字

来自分类Dev

使用libev的多线程套接字服务器

来自分类Dev

使用线程来处理套接字的多个读/写操作?

来自分类Dev

如何使用多线程从套接字读取请求

来自分类Dev

读取时的客户端套接字问题

来自分类Dev

通过Java套接字发送小文件时的性能问题

来自分类Dev

通过UDP套接字发送消息时遇到问题

来自分类Dev

套接字编程问题,退出时发送数据

来自分类Dev

套接字和线程python

来自分类Dev

循环创建套接字/线程

来自分类Dev

套接字用于多线程?