为什么python pickle不起作用dos to unix?

几天前,我编写了一个迷你游戏来学习套接字和线程。当我在Windows上运行游戏服务器和客户端时,它可以正常运行,但是当我将服务器文件移至测试服务器时,会出现以下错误提示:

Exception in thread Thread-2:
Traceback (most recent call last):
  File "/usr/lib/python3.8/threading.py",line 932,in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.8/threading.py",line 870,in run
    self._target(*self._args,**self._kwargs)
  File "server.py",line 46,in handle_client
    obj = pickle.loads(conn.recv(obj_length))
_pickle.UnpicklingError: invalid load key,' '.

可能是什么问题?

整个游戏文件:https://github.com/bilgehancoskun/wisetown

可能有用的代码:

server.py:

import socket
import threading
import pickle
import time
import random
import ast

#-------------------------------------------------------------------------

class Server():
    def __init__(self):
        self.HEADER = 2048
        self.PORT = 6000
        self.SERVER = "ip"
        self.ADDR = (self.SERVER,self.PORT)
        self.FORMAT = 'utf-8'
        self.DISCONNECT_MESSAGE = "!DISCONNECT"
        self.ROLES = ["Mafya","Mafya","Köylü","Doktor","Gözcü"]
        self.server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        self.server.bind(self.ADDR)
#---------------------------------------------------------------------------------------------
        self.names = list()
        self.addresses = list()
        self.lobby_dict = dict()
        self.game_dict = dict()
        self.ready_list = list()
        self.alive_list = list()
        self.vote = list()
        self.kill_vote = list()
        self.who_voted = list()
        self.ready_for_day = list()

        self.protected = None

    def handle_client(self,conn,addr):
        try:
            if addr[0] not in self.addresses:
                print(f"[NEW CONNECTION] {addr[0]} connected.")
                self.addresses.append(addr[0])

            connected = True
            while connected:
                obj_length = conn.recv(self.HEADER).decode(self.FORMAT)
                if obj_length:
                    obj_length = int(obj_length)
                    obj = pickle.loads(conn.recv(obj_length))

                    if obj == self.DISCONNECT_MESSAGE:
                        connected = False
                        print(f"[DISCONNECTED] {addr[0]} disconnected.")
                    elif "?ONLINE" in obj:
                        lobby_id = obj.split(":")[1]
                        conn.send(pickle.dumps(self.lobby_dict[lobby_id]["Players"]))
                    elif "!NEWLOBBY" in obj:
                        splitted_obj = obj.split(":")
                        lobby_id = splitted_obj[1]
                        admin = splitted_obj[2]
                        capacity = splitted_obj[3]
                        self.lobby_dict[lobby_id] = {"Players":[admin],"Capacity":capacity}
                    elif "!JOINLOBBY" in obj:
                        splitted_obj = obj.split(":")
                        lobby_id = splitted_obj[1]
                        name = splitted_obj[2]
                        if lobby_id in self.lobby_dict.keys():
                            self.lobby_dict[lobby_id]["Players"].append(name)
                            conn.send(pickle.dumps(f"True:{self.lobby_dict[lobby_id]['Capacity']}"))
                        else:
                            conn.send(pickle.dumps("False"))
                    elif "?ALIVE" in obj:
                        conn.send(pickle.dumps(self.alive_list))
#-----------------------------------------------------------------------------------------------
#Game commands:
                    elif "!NAME" in obj:
                        name = obj.split(":")[1]
                        self.names.append(name)
                    elif "!ALIVE" in obj:
                        conn.send(pickle.dumps(self.names))
                    elif "!READY" in obj:
                        ready_player = obj.split(":")[1]
                        self.ready_list.append(ready_player)
                    elif "!SHUFFLE" in obj:
                        if len(self.ready_list) == len(self.names):
                            temp = self.ROLES
                            if len(self.names) > len(self.ROLES):
                                for i in range(0,len(self.names) - len(self.ROLES)):
                                    temp.append("Köylü")
                            random.shuffle(temp)
                            for i in range(len(self.names)):
                                self.game_dict[self.names[i]] = temp[i]
                            conn.send(pickle.dumps(f"True/{self.game_dict}"))
                            with open("shuffled_roles.txt","w",encoding="utf-8") as file:
                                file.write(str(self.game_dict))
                            print(f"[SHUFFLED LIST] {self.game_dict}")
                        else:
                            conn.send(pickle.dumps("False"))

                    elif "!ROLES" in obj:
                        if len(self.ready_list) == len(self.names):
                            with open("shuffled_roles.txt","r",encoding="utf-8") as file:
                                line = file.readline()
                                self.game_dict = ast.literal_eval(line)
                            conn.send(pickle.dumps(f"True/{self.game_dict}"))
                        else:
                            conn.send(pickle.dumps("False"))
                    elif "!VOTE" in obj:
                        voted_player = obj.split(":")[1]
                        who = obj.split(":")[2] + ": " + voted_player
                        self.who_voted.append(who)
                        self.vote.append(voted_player)
                    elif "!VRESULTS" in obj:
                        conn.send(pickle.dumps(self.vote))
                        conn.send(pickle.dumps(self.who_voted))
                    elif "!VCLEAN" in obj:
                        self.vote = []
                        self.who_voted = []
                    elif "!PROTECTED" in obj:
                        protected = obj.split(":")[1]
                        self.protected = obj
                    elif "!NIGHT_KILL" in obj:
                        kill = obj.split(":")[1]
                        self.kill_vote.append(kill)
                    elif "!NKRESULTS" in obj:
                        nk_results = self.kill_vote
                        nk_protected = self.protected
                        if len(nk_results) == 1:
                            if nk_results[0] != nk_protected:
                                conn.send(pickle.dumps(nk_results[0]))
                        elif len(nk_results) == 2:
                            if nk_results[0] == nk_results[1]:
                                if nk_results[0] != nk_protected and nk_results[0] != "None":
                                    conn.send(pickle.dumps(nk_results[0]))
                            elif nk_results[0] == "None" and nk_results[1] != "None":
                                conn.send(pickle.dumps(nk_results[1]))
                            elif nk_results[1] == "None" and nk_results[0] != "None":
                                conn.send(pickle.dumps(nk_results[0]))
                            else:
                                conn.send(pickle.dumps(None))
                        else:
                            conn.send(pickle.dumps(None))
                    elif "!NKCLEAN" in obj:
                        self.protected = "None"
                        self.kill_vote = []
                    elif "!RFORDAY" in obj:
                        rplayer = obj.split(":")[1]
                        self.ready_for_day.append(rplayer)
                    elif "!RFDLIST" in obj:
                        conn.send(pickle.dumps(self.ready_for_day))
                    elif "!RFDCLEAN" in obj:
                        self.ready_for_day = list()
                    else:
                        print(f"[{addr}] {obj}") #İsimler Buradan -> addr
        except ConnectionResetError:
            print(f"[CONNECTION] {addr} Connection reset exception has been handled.")
        finally:
            conn.close()

    def start(self):
        print("[STARTING] Server is starting...")
        self.server.listen()
        print("[LISTENING] Server is listening on {}".format(self.SERVER))
        while True:
            conn,addr = self.server.accept()
            thread = threading.Thread(target=self.handle_client,args=(conn,addr))
            thread.start()

if __name__ == "__main__":

    server = Server()
    server.start()

app.py:

import sys
import os
import time
import random
import socket
import threading
import pickle

class Config():
    def __init__(self):
        self.HEADER = 2048
        self.PORT = 6000
        self.SERVER = "ip" #socket.gethostbyname(socket.gethostname())
        self.ADDR = (self.SERVER,self.PORT)
        self.FORMAT = 'utf-8'
        self.DISCONNECT_MESSAGE = "!DISCONNECT"
        self.client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        self.menuText = """
            ░██╗░░░░░░░██╗██╗░██████╗███████╗  ████████╗░█████╗░░██╗░░░░░░░██╗███╗░░██╗
            ░██║░░██╗░░██║██║██╔════╝██╔════╝  ╚══██╔══╝██╔══██╗░██║░░██╗░░██║████╗░██║
            ░╚██╗████╗██╔╝██║╚█████╗░█████╗░░  ░░░██║░░░██║░░██║░╚██╗████╗██╔╝██╔██╗██║
            ░░████╔═████║░██║░╚═══██╗██╔══╝░░  ░░░██║░░░██║░░██║░░████╔═████║░██║╚████║
            ░░╚██╔╝░╚██╔╝░██║██████╔╝███████╗  ░░░██║░░░╚█████╔╝░░╚██╔╝░╚██╔╝░██║░╚███║
            ░░░╚═╝░░░╚═╝░░╚═╝╚═════╝░╚══════╝  ░░░╚═╝░░░░╚════╝░░░░╚═╝░░░╚═╝░░╚═╝░░╚══╝
        """

class Client(Config):
    def __init__(self):
        super().__init__()
        self.client.connect(self.ADDR)
        self.admin = None
    def send(self,obj):
        obj = pickle.dumps(obj)
        obj_length = len(obj)
        send_length = str(obj_length).encode(self.FORMAT)
        send_length += b' ' * (self.HEADER - len(send_length))
        self.client.send(send_length)
        self.client.send(obj)

    def messenger(self):
        while True:
            msg = input("Mesaj: ")
            self.send(msg)



class Menu(Client):
    def __init__(self):
        super().__init__()

class MainMenu(Menu):
    def __init__(self,player_name):
        super().__init__()
        self.player_name = player_name
    def printMainMenu(self,game_is_on = False):
        print("\n" * 7 + self.menuText)
        time.sleep(2)
        os.system("cls")
        print(self.menuText)
        print("""

 1. Yeni Oyun Oluştur
 2. Oyuna Katıl

        """)

class Lobby(Menu):
    def __init__(self):
        super().__init__()
    def lobbyMenu(self):
        name_send = f"!NAME:{self.player_name}"
        self.send(name_send)
        os.system("cls")
        print(self.menuText)
        print(f"Lobby ID: {self.id}")
        self.send(f"?ONLINE:{self.id}")
        self.online_list = pickle.loads(self.client.recv(2048))
        temp_list = self.online_list
        sys.stdout.write("Aktif Oyuncular:| ")
        for i in self.online_list:
            sys.stdout.write(f"{i} | ")
        sys.stdout.flush()
        while not self.game_started:
            time.sleep(1)
            self.send("?ONLINE:" + str(self.id))
            self.online_list = pickle.loads(self.client.recv(2048))
            if temp_list != self.online_list:
                sys.stdout.write("\rAktif Oyuncular:| ")
                for i in self.online_list:
                    sys.stdout.write(f"{i} | ")
                sys.stdout.flush()
                temp_list = self.online_list
            if len(self.online_list) == self.capacity:
                self.game_started = True

class CreateLobby(Lobby):
    def __init__(self,capacity,player_name,admin):
        super().__init__()
        self.player_name = player_name
        self.admin = admin
        self.id = random.randint(100000,999999)
        self.capacity = int(capacity)
        self.game_started = False
        self.send(f"!NEWLOBBY:{self.id}:{self.player_name}:{self.capacity}")
        self.lobbyMenu()


class JoinLobby(Lobby):
    def __init__(self,id,player_name):
        super().__init__()
        self.id = id
        self.player_name = player_name
        self.game_started = False
        self.lobby_joiner()

    def lobby_joiner(self):
        self.send(f"!JOINLOBBY:{self.id}:{self.player_name}")
        bool_obj = pickle.loads(self.client.recv(2048))
        while bool_obj == "False":
            print("Bu ID'ye ait lobby bulunmamaktadır.")
            self.id = input(" Lobby ID: ")
            self.send(f"!JOINLOBBY:{self.id}:{self.player_name}")
            bool_obj = pickle.loads(self.client.recv(2048))

        self.capacity = int(bool_obj.split(":")[1])

        self.lobbyMenu()

























#-------------------------------------------------------------------------------------------------------------

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Python中的函数(二) 在上一篇文章中提到了Python中函数的定义和使用,在这篇文章里我们来讨论下关于函数的一些更深的话题。在学习C语言函数的时候,遇到的问题主要有形参实参的区别、参数的传递和改变、变量的作用域。同样在Python中,关于对函数的理解和使用也存在这些问题。下面来逐一讲解。一.函
Python中的字符串 可能大多数人在学习C语言的时候,最先接触的数据类型就是字符串,因为大多教程都是以"Hello world"这个程序作为入门程序,这个程序中要打印的"Hello world"就是字符串。如果你做过自然语言处理方面的研究,并且用Python
Python 面向对象编程(一) 虽然Python是解释性语言,但是它是面向对象的,能够进行对象编程。下面就来了解一下如何在Python中进行对象编程。一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法。 类是对现实世界中一些事物的封装,
Python面向对象编程(二) 在前面一篇文章中谈到了类的基本定义和使用方法,这只体现了面向对象编程的三大特点之一:封装。下面就来了解一下另外两大特征:继承和多态。 在Python中,如果需要的话,可以让一个类去继承一个类,被继承的类称为父类或者超类、也可以称作基类,继承的类称为子类。并且Pytho
Python中的函数(一) 接触过C语言的朋友对函数这个词肯定非常熟悉,无论在哪门编程语言当中,函数(当然在某些语言里称作方法,意义是相同的)都扮演着至关重要的角色。今天就来了解一下Python中的函数用法。一.函数的定义 在某些编程语言当中,函数声明和函数定义是区分开的(在这些编程语言当中函数声明
在windows下如何快速搭建web.py开发框架 用Python进行web开发的话有很多框架供选择,比如最出名的Django,tornado等,除了这些框架之外,有一个轻量级的框架使用起来也是非常方便和顺手,就是web.py。它由一名黑客所创建,但是不幸的是这位创建者于2013年自杀了。据说现在由
将Sublime Text 2搭建成一个好用的IDE 说起编辑器,可能大部分人要推荐的是Vim和Emacs,本人用过Vim,功能确实强大,但是不是很习惯,之前一直有朋友推荐SUblime Text 2这款编辑器,然后这段时间就试了一下,就深深地喜欢上这款编辑器了...
Python中的模块 有过C语言编程经验的朋友都知道在C语言中如果要引用sqrt这个函数,必须用语句"#include<math.h>"引入math.h这个头文件,否则是无法正常进行调用的。那么在Python中,如果要引用一些内置的函数,该怎么处理呢?在Python中
Python的基础语法 在对Python有了基础的认识之后,下面来了解一下Python的基础语法,看看它和C语言、java之间的基础语法差异。一.变量、表达式和语句 Python中的语句也称作命令,比如print "hello python"这就是一条语句。 表达式,顾名思义,是
Eclipse+PyDevʽjango+Mysql搭建Python web开发环境 Python的web框架有很多,目前主流的有Django、Tornado、Web.py等,最流行的要属Django了,也是被大家最看好的框架之一。下面就来讲讲如何搭建Django的开发环境。一.准备工作 需要下载的
在windows下安装配置Ulipad 今天推荐一款轻便的文本编辑器Ulipad,用来写一些小的Python脚本非常方便。 Ulipad下载地址: https://github.com/limodou/ulipad http://files.cnblogs.com/dolphin0520/u...
Python中的函数(三) 在前面两篇文章中已经探讨了函数的一些相关用法,下面一起来了解一下函数参数类型的问题。在C语言中,调用函数时必须依照函数定义时的参数个数以及类型来传递参数,否则将会发生错误,这个是严格进行规定的。然而在Python中函数参数定义和传递的方式相比而言就灵活多了。一.函数参数的
在Notepad++中搭配Python开发环境 Python在最近几年一度成为最流行的语言之一,不仅仅是因为它简洁明了,更在于它的功能之强大。它不仅能够完成一般脚本语言所能做的事情,还能很方便快捷地进行大规模的项目开发。在学习Python之前我们来看一下Python的历史由来,"Pytho
Python中的条件选择和循环语句 同C语言、Java一样,Python中也存在条件选择和循环语句,其风格和C语言、java的很类似,但是在写法和用法上还是有一些区别。今天就让我们一起来了解一下。一.条件选择语句 Python中条件选择语句的关键字为:if 、elif 、else这三个。其基本形式如
关于raw_input( )和sys.stdin.readline( )的区别 之前一直认为用raw_input( )和sys.stdin.readline( )来获取输入的效果完全相同,但是最近在写程序时有类似这样一段代码:import sysline = sys.stdin.readline()
初识Python 跟学习所有的编程语言一样,首先得了解这门语言的编程风格和最基础的语法。下面就让我们一起来了解一下Python的编程风格。1.逻辑行与物理行 在Python中有逻辑行和物理行这个概念,物理行是指在编辑器中实际看到的一行,逻辑行是指一条Python语句。在Python中提倡一个物理行只
当我们的代码是有访问网络相关的操作时,比如http请求或者访问远程数据库,经常可能会发生一些错误,有些错误可能重新去发送请求就会成功,本文分析常见可能需要重试的场景,并最后给出python代码实现。
1.经典迭代器 2.将Sentence中的__iter__改成生成器函数 改成生成器后用法不变,但更加简洁。 3.惰性实现 当列表比较大,占内存较大时,我们可以采用惰性实现,每次只读取一个元素到内存。 或者使用更简洁的生成器表达式 4.yield from itertools模块含有大量生成器函数可
本文介绍简单介绍socket的常用函数,并以python-kafka中的源码socketpair为例,来讲解python socket的运用
python实践中经常出现编码相关的异常,大多网上找资料而没有理解原理,导致一次次重复错误。本文对常用Unicode、UTF-8、GB2312编码的原理进行介绍,接着介绍了python字符类型unicode和str以及常见编解码错误UnicodeEncodeError和UnicodeDEcodeEr