本人是从事php开发的, 近来想通过php实现即时通讯(兼容windows)。后来发现实现起来特别麻烦, 就想到python。听说这家伙在什么地方都能发挥作用。所以想用python来做通讯模块。。。所以主要学习pythonn的多线程和tcp连接。
但是没有用过python, 所有在学习python的同时写个小小的程序 -》 和机器人聊天
本程序机器人由【图灵机器人 http://www.tuling123.com】提供, 把编写的例子发了出来供初学python的朋友们学习和熟悉。
注意:python版本必须为3.x +, 不兼容2.x版本的python
文件列表:
main_server.py: 服务端程序,用于接收客户端的信息, 并返回Jinko回答的话
# tcp server
import socket;
import time;
import threading;
from JinkoRobot import *;
#应用程序入口类
class ApplicationServer:
#构造函数初始化 socket
def __init__(self, host="localhost", port=8005):
self.connList = [];
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM);
self.socket.bind((host, port));
self.socket.listen(100);
print("我是Jinko, 我来自[图灵机器人:http://www.tuling123.com]");
print("");
print("赶紧打开客户端和我聊天吧!");
self.accept();
#多线程接受用户请求
def accept(self):
while True:
connection, address = self.socket.accept();
# print('connect')
thread = ChatThread(connection);
thread.start();
#聊天线程
class ChatThread(threading.Thread):
def __init__(self, conn):
threading.Thread.__init__(self);
self.__connection = conn;
def run(self):
while True:
try:
recv = self.__connection.recv(8192);
except:
break;
# print("收到:" + recv.decode('utf-8'))
rebot = JinkoRobot();
rebot.listenFor(recv.decode('utf-8'));
answer = rebot.answer();
# print('say:' + answer)
self.__connection.send(answer.encode('utf-8'));
ApplicationServer();
main_client.py: 客户端程序, 用于和Jinko发起聊天
import socket;
import time;
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM);
print("正在和Jinko连线...");
sock.connect(('localhost', 8005));
print("");
while True:
speak = input("和Jinko说点什么:");
if speak == "quit":
break;
if speak == "":
continue;
# print("发送中..." + "("+ speak +")")
sock.send(speak.encode('utf-8'));
# print("已发送")
print("Jinko在思考...");
answer = sock.recv(8192);
print("Jinko回复你:" + answer.decode('utf-8'));
print("");
sock.close();
JinkoRobot.py: 它就是Jinko啦啦啦~~
#Jinko Robot
import json;
import urllib.request;
import urllib.parse;
class JinkoRobot:
__answer = '';
def __init__(self):
pass;
#倾听话语
def listenFor(self, string):
self.__answer = self.thinking(string);
# 思考着
def thinking(self, string):
says = urllib.parse.quote_plus(string);
f = urllib.request.urlopen("http://www.tuling123.com/openapi/api?key=4bc32d41c10be18627438ae45eb839ac&info=" + says);
json_str = f.read();
thinkdata = json.loads(json_str.decode('utf-8'));
f.close();
if(thinkdata['code'] > 40000 and thinkdata['code'] < 40010):
return "今天Jinko被你问得有点累了, 过会再问吧!";
if(thinkdata['code'] == 200000):
return thinkdata['text'] + ", 猛戳这里>>" + thinkdata['url'];
if(thinkdata['code'] == 302000) :
info = thinkdata['text'];
for content in thinkdata['list']:
info += "\n\n>" + content['article'] \
+ " 来源于" + content['source'] \
+ " 详细信息请猛戳这里>>" + content['detailurl'];
return info;
if(thinkdata['code'] == 305000):
info = thinkdata['text'];
for key in thinkdata['list']:
info += "\n\n>" + key + ": 车次>" + content['trainnum'] \
+ " 从" + content['start'] + "到" + content['terminal'] \
+ " 发车时间:" + content['starttime'] \
+ " 到达时间:" + content['endtime'] \
+ " 详细信息请猛戳这里>>" + content['detailurl'];
return info;
return thinkdata['text'];
#和你交流回答
def answer(self):
return self.__answer;
运行效果图:
最后我想说下, 我只是python的初学者,没啥python经验哈
我最近用Python写了一个算法,不需要写任何规则就能自动识别一个网页的内容
我最近用Python写了一个算法,不需要写任何规则就能自动识别一个网页的内容,目前测试了300多个新闻网站的新闻页,都能准确识别
用Python写了一个postgresql函数,感觉很爽
用Python写了一个postgresql函数,感觉很爽 CREATE LANGUAGE plpythonu; postgresql函数 CREATE OR REPLACE FUNCTION myfu ...
使用itchat实现一个微信机器人聊天回复功能
近看到好多群里都有一个@机器人的功能,挺有趣的,想自己也玩下,就通过百度一点点实现,在这总结一下整个从无到有的过程. 首先,要知道itchat,它是Python写的,所以想要实现这个机器人的功能,需要 ...
python写的一个集合
起因:原本打算用python写一个抢火车票的脚本.在那 期间遇见各种浏览器驱动失败的节奏....打算先缓一下 然后就去写集合了. 0x01 源码: # -*- coding:'utf-8' -*- # ...
试着用c写了一个多线程的同步
在Java中写多线程相关的程序简单很多,在多线程中需要同步的时候,使用synchronized就行了. 最近学习c的多线程与同步,感觉实现起来,要写的代码比较多一些,这也许是因为java封装的比较好吧 ...
python socket编程 实现简单p2p聊天程序
目标是写一个python的p2p聊天的项目,这里先说一下python socket的基础课程 一.Python Socket 基础课程 Socket就是套接字,作为BSD UNIX的进程通信机制,取后 ...
socket实例C语言:一个简单的聊天程序
我们老师让写一个简单的聊天软件,并且实现不同机子之间的通信,我用的是SOCKET编程.不废话多说了,先附上代码: 服务器端server.c #include #incl ...
使用Python写的第一个网络爬虫程序
今天尝试使用python写一个网络爬虫代码,主要是想訪问某个站点,从中选取感兴趣的信息,并将信息依照一定的格式保存早Excel中. 此代码中主要使用到了python的以下几个功能,因为对python不 ...
10分钟用Python告诉你两个机器人聊天能聊出什么火花
欲直接下载代码文件,关注我们的公众号哦!查看历史消息即可! 现在不是讲各种各样的人工智能嘛,AI下棋,AI客服,AI玩家--其实我一直很好奇,两个AI碰上会怎样,比如一起下棋,一起打游戏-- 今天做个 ...
随机推荐
PRINCE2风险模块
我们前几个节学习了PRINCE2七大主题的商业论证.组织.质量和计划,今天我们开展对于风险模块的讲解. 风险:目的是识别.评估和控制不确定性,从而提高项目的成功率.PRINCE2对风险登记册进行了详细 ...
sqlserver同步后在不重新初始化快照的情况下新增表
在已有事务复制中,时长需要新增表.索引,这些变更时不会同步到从库中.如果采用默认的设置,每次都需要重新初始化快照,从库重新应用快照和未执行的同步命令,这显然是无法在线上实践的方法.另一种 ...
(一)win7下cocos2d-x 21 + vs2010
1.下载SDK http://cocos2d.cocoachina.com/download,我下载2.1版本,cocos2d-2.1rc0-x-2.1.2-hotfix.zip @ Apr.08, ...
MVC - 布局
布局类似于APSX视图的母版页 用的是Razor的语法 创建布局 布局页面默认放在Shared目录 有几个自动生成的cshtml文件 删除它们 然后创建一个视图 命名为MyLayOut 取消勾选使用母 ...
css-文本及其他
css7-文本和其他 text-align行内元素对齐方式,值为 左/中/右 对齐:left/right/center.test{text-align:cen ...
ArrayList与LinkedList时间复杂度之对比
package ArrayList; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections ...
getReadableDatabase 和 getWritableDatabase的区别
(1)getWritableDatabase()方法以读写方式打开数据库.一旦数据库的磁盘空间满了,数据库就只能读而不能写,此时用getWritableDatabase()打开数据库就会出错. (2) ...
Linux系统一些常用命令(持续增加)
这些命令什么的全是从网上找的,防止忘记,留下来备忘 1.linux服务器如何从另一台服务器拷东西:可以用scp命令scp user@remote.machine:/remote/path /local ...
2018";百度之星";程序设计大赛 - 资格赛hdu6349三原色(最小生成树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6349 题目: 三原色图 Time Limit: 1500/1000 MS (Java/Others) ...
golang string int int64转换
#string到int int,err:=strconv.Atoi(string) #string到int64 int64, err := strconv.ParseInt(string, 10, 6 ...