FICS是免费的国际象棋服务器(其实就是个命令行下棋的网站,有许多界面比如BabasChess、Arena、iNemesis或者我们的Verachess支持访问),里面允许未注册会员登录,而且他们登录以后也可以聊天。所以我就利用这一点,实现在广域网借FICS的服务器来聊天。(虽然延迟有点大,而且每次聊天的字数有限制,每一句只能有十几个汉字)

这里真正的困难点在于,FICS客户端不支持中文字符的聊天,我开始使用.encode(‘string-escape’)和.decode(‘string-escape’),然而中文太占地方,一共一句话就限制54个字符,一个中文要8个(可以压缩为6个)字符,也就是一句话最多只能9个汉字。后来我就改用base64编码了,测算可以支持20个左右汉字。因为FICS的网络延迟有点大,我没有做超长文本的分片功能,如果有谁有兴趣可以改进。

# coding: gbk
# must run in CMD, pycharm has a bug when input interrupted
import socket, threading, sys, re, time, base64
client=socket.socket()
print '连接服务器中,请稍候'
try:client.connect(('freechess.org',5000))
except:print '服务器连接超时'sys.exit(-1)
chatting=Falsedef startwith(instr,totalstr):totalstr=totalstr.replace('\r','')return totalstr[:len(instr)]==instrdef blockData(chan):''':param socket._socketobject chan::return:'''global chattingbuffer=''while True:data=chan.recv(1)if data:buffer+=dataif startwith('login:', buffer):chan.send('guest\n')buffer=''elif buffer[-1]=='\n':if startwith('Press return to enter the server as ',buffer):chan.send('\n')print '您的昵称是:'+re.findall('"Guest(.*)"',buffer)[0]print '输入对方的昵称+消息(中间以空格隔开),即可发送聊天信息,输入quit则退出登录'chatting=Trueelif startwith('Thank you for using the Free Internet Chess server ',buffer):print '您已经退出登录'elif '(told ' in buffer:print buffer[:-1].replace('\r','').replace('told','消息已发送给').replace('fics% ','')elif 'is not logged in.' in buffer:print buffer[:-1].replace('\r','').replace('is not logged in','不在线').replace('fics% ','')elif '(U) tells you: ' in buffer:try:buffer=buffer.replace('\r','')  # 万一用户乱输入,可能杯具。我们之前压缩过中文,解压一下i=buffer.index('(U) tells you:')left=buffer[:i]+' 对你说: 'right=base64.b64decode(buffer[i+15:])print left+rightexcept:print buffer.replace('\r','').replace('(U) tells you:', ' 对你说:')buffer=''else:print '连接关闭成功'chatting=Falsebreak
b=threading.Thread(target=blockData,args=(client,))
b.setDaemon(True)
b.start()
s=0
while s<150 and not chatting:time.sleep(0.1)s=s+1
if not chatting:print '服务器响应超时'sys.exit(-1)while chatting:ui=raw_input('')if ui=='quit':client.send('quit\n')s=0while chatting and s<50:time.sleep(0.1)s=s+1sys.exit(0)elif chatting:try:assert len(ui.split(' '))>=2assert len(ui.split(' ')[0])==4assert len(ui)>5except:print '输入的信息格式不正确,请重新输入'else:try:ui=ui[:5]+base64.b64encode(ui[5:])  # 使用base64压缩assert len(ui)<60except:print '输入信息超长,请重新输入'else:client.send(('tell Guest%s\n'%ui))  # fics不支持中文,我们必须编码为utf-8字节码格式

将其使用py2exe 0.6.9(32位)打包,运行时却报MSVCR90.dll找不到的错误,且用VC++2008运行库修复无效。后来360软件管家发现VC++2008 x86的运行库重复安装了。把两个安装项都卸载,然后重装VC++2008,再重新打包(重要)后,终于成功。
运行效果如下:

这里提供demo的下载(client是裸FICS客户端,chat是基于client封装的聊天客户端,也就是图上这样)
链接:https://pan.baidu.com/s/1zeyAcbWuIhukxoEoVJtEBQ
提取码:v144

如果有谁有更好的免费稳定的聊天服务器,也欢迎留言共享

python实现的广域网聊天(无需搭建服务器,基于FICS和socket模块)相关推荐

  1. 微信小程序如何发送短信验证码,无需搭建服务器

    自从微信小程序提供云开发支持,开发者无需搭建后台服务器,使用微信提供的核心API就可以实现应用功能,此时就需要小程序能够自己发送短信,比如短信验证码,榛子云短信(http://smsow.zhenzi ...

  2. Node.js(一)——(Node.js安装及使用,通过Node.js搭建服务器,模块化及自定义模块,npm/yarn/nvm,内置模块fs的使用,buffer及stream,新闻列表案例)

    目录 1.Node.js介绍 2.安装Node.js 3.使用Node.js实现第一个服务器 3.1初步感受Node.js 3.2Google Chrome 默认非安全端口列表,尽量避免以下端口. 3 ...

  3. java tcp聊天程序_java实现基于Tcp的socket聊天程序

    对于步入编程行业不深的初学者或是已经有所领会的人来说,当学习一项新的技术的时候,非常渴望有一个附上注释完整的Demo.本人深有体会,网上的例子多到是很多,但是很杂不完整,写代码这种东西来不得半点马虎, ...

  4. 小程序为什么要搭建服务器,小程序搭建服务器

    小程序搭建服务器 内容精选 换一换 提供多个业务节点提供共享的日志输出目录,方便分布式应用的日志收集和管理.业务特点:多个业务主机挂载同一个共享文件系统,并发打印日志.大文件小I/O:单个日志文件比较 ...

  5. python基础===socket模块的讲解(转)

    一.网络知识的一些介绍 socket 是网络连接端点.例如当你的Web浏览器请求www.jb51.net上的主页时,你的Web浏览器创建一个socket并命令它去连接 www.jb51.net的Web ...

  6. python网络编程能做什么_python网络编程——什么是socket?

    socket又称为"套接字"应用程序一般通过"套接字"向网络发送请求或向网络请求应答网络请求,是计算机之间的进程可以通讯. socket() 函数: pytho ...

  7. Python 3 怎么快速搭建服务器

    Python 3 怎么快速搭建服务器 python 3 环境,我就不多说了 1.新建一个文件夹 2.放文件夹里一个 index.html 文件用来默认访问,不然会炸的 3.进入文件目录 4.执行以下命 ...

  8. python搭建内网网站,python搭建服务器

    python搭建服务器 python搭建服务器以快捷著称,实际上,我们也可以使用python搭建简易的服务器. 1.环境配置 当然首先得搭建python的开发环境,对于mac和linux的用户来说,一 ...

  9. python 数据库性能提升 - TCP聊天+传输文件服务器服务器套接字v2.7

    TCP聊天+传输文件服务器服务器套接字v2.7 刚创建服务器的时候为了后期便于管理, 主要也是MySQL对我不适合, 跨平台使用, 一打包还有得装, 所以直接自己做了个 这是我写的服务器的数据库代码, ...

  10. python+Linux centos7搭建服务器

    我是一个前端出身的,所以搭建服务器环境费了几天,参考了大量资料,现在终于完成了,写一下总结 1.安装python3.X 参考:https://blog.csdn.net/zhangdongren/ar ...

最新文章

  1. pyspark 核心概念
  2. HDU-1162-Eddy's picture
  3. SBT搭建Spark
  4. 深入理解 Session 与 Cookie
  5. rediscluster全局数据_redis迁移,从redis cluster集群迁移数据到另外一个redis cluster集群...
  6. 界址点号_界址点及四至优化
  7. Java盲点:双重检查锁定及单例模式
  8. java调用支付宝接口代码介绍
  9. 用Unity简单实现第三人称人物的移动和转向
  10. Linux服务器的那些性能参数指标
  11. 用HTML搞一个汇率转换器,Currency Converter:实时汇率转换
  12. IOS 发展史各个ipone的发布时间(二)
  13. kali 查看ip地址
  14. 国际标准化比率 INR
  15. [文献阅读]——BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
  16. 华为SNS交换机(OEM博科FC交换机)configupload无法使用ftp协议处理方法
  17. STM32 编码器驱动/旋转编码器旋钮encoder
  18. 根据json 动态生成页面——问卷页面
  19. 横河川仪压力变送器故障代码_压力变送器常见故障及解决办法
  20. TP5 操作excel 导出

热门文章

  1. 注册reg.html是什么,reg命令如何修改注册表?reg命令作用介绍
  2. JavaScript设计模式——观察者模式
  3. 免费使用短信服务接口 ----用Java实现
  4. Unity 面试题整理2020
  5. 计算机相关审稿周期短的ei,计算机比较好发的sci期刊_比较水的计算机ei期刊_ei期刊计算机...
  6. 腾讯IP+文旅的探索实践
  7. vnc远程桌面精灵,七款让人爱不释手的vnc远程桌面精灵
  8. Linux 复制文件命令
  9. 面试逻辑题 三个精灵说真话假话的判断难题
  10. 何加盐深度揭秘:我是怎么找资料的?