zoukankan      html  css  js  c++  java
  • 用Python写的一个多线程机器人聊天程序

    本人是从事php开发的, 近来想通过php实现即时通讯(兼容windows)。后来发现实现起来特别麻烦, 就想到python。听说这家伙在什么地方都能发挥作用。所以想用python来做通讯模块。。。所以主要学习pythonn的多线程和tcp连接。

    但是没有用过python, 所有在学习python的同时写个小小的程序 -》 和机器人聊天

    本程序机器人由【图灵机器人 http://www.tuling123.com】提供, 把编写的例子发了出来供初学python的朋友们学习和熟悉。

    注意:python版本必须为3.x +, 不兼容2.x版本的python

    文件列表: 

    main_server.py: 服务端程序,用于接收客户端的信息, 并返回Jinko回答的话

     1 # tcp server
     2 import socket;
     3 import time;
     4 import threading;
     5 from JinkoRobot import *;
     6 
     7 #应用程序入口类
     8 class ApplicationServer:
     9 
    10     #构造函数初始化 socket 
    11     def __init__(self, host="localhost", port=8005):
    12         self.connList = [];
    13         self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM);
    14         self.socket.bind((host, port));
    15         self.socket.listen(100);
    16         print("我是Jinko, 我来自[图灵机器人:http://www.tuling123.com]");
    17         print("");
    18         print("赶紧打开客户端和我聊天吧!");
    19         self.accept();
    20 
    21     #多线程接受用户请求
    22     def accept(self):
    23         while True:
    24             connection, address = self.socket.accept();
    25             # print('connect')
    26             thread = ChatThread(connection);
    27             thread.start();
    28 
    29 #聊天线程
    30 class ChatThread(threading.Thread):
    31 
    32     def __init__(self, conn):
    33         threading.Thread.__init__(self);
    34         self.__connection = conn;
    35 
    36     def run(self):
    37         while True:
    38             try:
    39                 recv = self.__connection.recv(8192);
    40             except:
    41                 break;
    42 
    43             # print("收到:" + recv.decode('utf-8'))
    44             rebot = JinkoRobot();
    45             rebot.listenFor(recv.decode('utf-8'));
    46             answer = rebot.answer();
    47             # print('say:' + answer)
    48             self.__connection.send(answer.encode('utf-8'));
    49 
    50 ApplicationServer();

    main_client.py: 客户端程序, 用于和Jinko发起聊天

     1 import socket;
     2 import time;
     3 
     4 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM);
     5 print("正在和Jinko连线...");
     6 sock.connect(('localhost', 8005));
     7 print("");
     8 
     9 
    10 while True:
    11     speak = input("和Jinko说点什么:");
    12 
    13     if speak == "quit":
    14         break;
    15 
    16     if speak == "":
    17         continue;
    18 
    19     # print("发送中..." + "("+ speak +")")
    20     sock.send(speak.encode('utf-8'));
    21     # print("已发送")
    22 
    23     print("Jinko在思考...");
    24     answer = sock.recv(8192);
    25     print("Jinko回复你:" + answer.decode('utf-8'));
    26     print("");
    27 
    28 sock.close();

    JinkoRobot.py: 它就是Jinko啦啦啦~~

     1 #Jinko Robot
     2 import json;
     3 import urllib.request;
     4 import urllib.parse;
     5 
     6 class JinkoRobot:
     7     
     8     __answer = '';
     9 
    10     def __init__(self):
    11         pass;
    12 
    13     #倾听话语
    14     def listenFor(self, string):
    15         self.__answer = self.thinking(string);
    16 
    17     # 思考着
    18     def thinking(self, string):
    19         says = urllib.parse.quote_plus(string);
    20         f = urllib.request.urlopen("http://www.tuling123.com/openapi/api?key=4bc32d41c10be18627438ae45eb839ac&info=" + says);
    21         json_str = f.read();
    22         thinkdata = json.loads(json_str.decode('utf-8'));
    23         f.close();
    24         
    25         if(thinkdata['code'] > 40000 and thinkdata['code'] < 40010):
    26             return "今天Jinko被你问得有点累了, 过会再问吧!";
    27 
    28         if(thinkdata['code'] == 200000):
    29             return thinkdata['text'] + ", 猛戳这里>>" +  thinkdata['url'];
    30 
    31         if(thinkdata['code'] == 302000) :
    32             info = thinkdata['text'];
    33 
    34             for content in thinkdata['list']:
    35                 info += "
    
    >" + content['article'] 
    36                         + "  来源于" + content['source'] 
    37                         + "  详细信息请猛戳这里>>" + content['detailurl'];
    38             
    39             return info;
    40 
    41         if(thinkdata['code'] == 305000):
    42             info = thinkdata['text'];
    43 
    44             for key in thinkdata['list']:
    45                 info += "
    
    >" + key + ": 车次>" + content['trainnum'] 
    46                         + "" + content['start'] + "" + content['terminal'] 
    47                         + "  发车时间:" + content['starttime'] 
    48                         + "  到达时间:" + content['endtime'] 
    49                         + "  详细信息请猛戳这里>>" + content['detailurl'];
    50             
    51             return info;
    52 
    53         return thinkdata['text'];
    54 
    55     #和你交流回答
    56     def answer(self):
    57         return self.__answer;

    运行效果图:

    最后我想说下, 我只是python的初学者,没啥python经验哈

    顺便提供下zip下载包:http://files.cnblogs.com/files/JinkoWu/ChatWithRobot.zip

  • 相关阅读:
    Android状态栏白底黑字,只需两步轻松搞定
    MyBatis注解
    MyBatis延迟加载和缓存
    MyBatis关联查询
    mybatis智能标签1
    Mybatis智能标签
    增删改查
    初始MyBatis
    第7章:Servlet 基础
    第3章 JSP数据交互(二)
  • 原文地址:https://www.cnblogs.com/JinkoWu/p/5051837.html
Copyright © 2011-2022 走看看