本人是從事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 ...