Python进阶开发之网络编程,socket实现在线聊天机器人

系列文章

本文目录

什么是socket?创建socket客户端创建socket服务端socket工作流程图解socket公共函数汇总实战:搭建在线聊天机器人

. 什么是socket?

说到网络编程,难免要提到socket

那什么是socket呢,中文名叫"套接字",更难理解了吧。

通俗来讲,socket表示一个网络连接,通过这个连接,使得主机间或者一台计算机上的进程间可以通讯。

不管是不同主机,还是同一主机。既然是通信,必定有一个发送方,一个接收方。对应一个客户端,和一个服务端。

. 创建socket客户端

  • 创建socket,建立连接
1import socket23# 指定IPv4协议(AF_INET),IPv6协议请使用AF_INET64# 指定使用TCP协议(SOCK_STREAM),UDP协议请使用SOCK_DGRAM5sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)67# 参数是一个tuple,tuple里指定服务器地址(域名或ip)和端口号8sock.connect((‘www.sina.com.cn‘, 80))
  • 发送数据
1# 注意这里str格式要遵循HTTP协议标准。2# 注意结尾一定要用 \r\n\r\n3sock.send("GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\n\r\n".encode("utf-8"))
  • 接收数据
 1buffer = [] 2while True: 3    # 每次最多接收1k字节 4    d = sock.recv(1024) 5    if d: 6        # Python3接收到为bytes类型,要转为str 7        buffer.append(str(d)) 8    else: 9        break10data = ‘‘.join(buffer)

. 创建socket服务端

  • 创建socket
1import socket23sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  • 绑定ip和port
1# 注意以元组格式传入,可以是某网卡的公网ip,或0.0.0.0,或127.0.0.12sock.bind((‘127.0.0.1‘, 9999))
  • 监听端口
1# 指定等待连接的最大数量2sock.listen(5)
  • 接收数据
1while True:2    # 接受一个新连接,阻塞的,只有接收到新连接才会往下走3    sock, addr = s.accept()4    # 每一次连接,都要创建新线程,否则一次只能处理一个连接5    t = threading.Thread(target=tcplink, args=(sock, addr))6    t.start()
  • 连接处理函数
1def tcplink(sock, addr):2    while True:3        data = sock.recv(1024)4        if data == ‘exit‘ or not data:5            break6        sock.send(‘Hello, %s!‘ % data)7    sock.close()

. socket工作流程图解

. socket公共函数汇总

  • 发送数据
1# 发送TCP数据,返回值:发送的字节当量2sk.send("data string")34# 完整发送TCP数据,频繁调用send方法,确保数据发送完成5sk.sendall("data string")67# 发送UDP数据8sk.sendto("data string",address)
  • 接收数据
1# 接收TCP数据,一次最大只接收1k数据2sk.recv(1024)34# 接收UDP数据,一次只接收1k数据,返回值:数据和发送方ip5(data,address) = sk.recvfrom(1024)
  • 获取socket信息
1# 获取远程socket的addr,port2(addr, port) = sk.getpeername()34# 获取本地socket的addr,port5(addr, port) = sk.getsockname()
  • 获取其他信息
 1import socket 2 3# 获取当前主机名 4HostName = socket.gethostname() 5 6# 获取当前主机的ip 7HOST = socket.gethostbyname(HostName) 8 9# 获取当前socket连接的文件描述符10file_no = sk.fileno()
  • 设置socket
 1# 设置连接的超时时间 2sk.settimeout(timeout) 3sk.gettimeout() 4 5# 设置为非阻塞模式,默认是0(阻塞) 6# 非阻塞下,accept和recv时一旦无数据,则报错:socket.Error 7sk.setblocking(1) 8 9# 设置socket内部参数,10# 具体有哪些参数,可以查看socket类的python源码11sk.setsockopt(level,optname,value)12sk.getsockopt(level,optname)

. 实战:搭建在线聊天机器人

通过上面的学习,我们知道,同主机下或不同主机下的两个进程要进行通信(TCP/UDP,不管是消息传输还是文件传输),必定要借助socket这个桥梁。

那接下来,我们就一起来完成这个实战项目:在线聊天机器人

思路:首先,客户端和服务端建立socket连接,然后客户端向服务端发送消息,服务端接收消息,并调用 图灵机器人API接口,获取回复返回给客户端。

在这里,我们需要先去图灵机器人(http://www.tuling123.com)申请帐号,并创建机器人应用,获取授权码。

一切准备就绪,就可以写我们的代码了。

  • 客户端
 1import socket 2import time 3 4class ChatClient: 5    def __init__(self, username, port): 6        self.username = username 7        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 8        self.socket.connect(("127.0.0.1", port)) 910    def send_msg(self, msg):11        self.socket.send("{username}::{msg}".format(username=self.username,msg=msg).encode("utf-8"))1213    def recv_msg(self):14        data=self.socket.recv(1024)15        if data:16            print("\n【机器人小图】"+" "+time.strftime(‘%Y-%m-%d:%H:%M:%S‘,time.localtime(time.time())))17            print(data.decode("utf-8"))18            return True19        return False2021    def main(self):22        data = self.socket.recv(1024)23        print(data.decode("utf-8"))24        msg = input("请输入消息:")25        self.send_msg(msg)26        while True:27            if self.recv_msg():28                msg=input("\n我:")29                self.send_msg(msg)30                if msg == "exit":31                    print("聊天室已关闭")32                    break3334if __name__ == ‘__main__‘:35    cc = ChatClient(username="小明", port=9999)36    cc.main()
  • 服务端
 1import socket 2import time 3import threading 4import requests 5import json 6 7 8class ChatServer: 9    def __init__(self, port):10        # 绑定服务器的ip和端口,注意以tuple的形式11        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)12        self.socket.bind(("0.0.0.0", port))13        self.socket.listen(5)14        # 图灵机器人,授权码15        self.key = "your tuling robot key"16        print("正在监听 127.0.0.1 :{}...".format(port))1718    def tcplink(self, sock, addr):19        # 每次连接,开始聊天前,先欢迎下。20        sock.send("你好,欢迎来到机器人聊天器!".encode("utf-8"))21        while True:22            data = sock.recv(1024).decode("utf-8")23            print(sock.getpeername())24            print(sock.getsockname())25            print(sock.fileno())26            username = data.split("::")[0]27            msg = data.split("::")[1]28            if msg == "exit":29                break30            if msg:31                print("【"+username+"】 "+time.strftime(‘%Y-%m-%d:%H:%M:%S‘,time.localtime(time.time())))32                print(msg)33                response = self.get_response(msg)34                sock.send(response.encode("utf-8"))35        sock.close()36        print("与 {} 结束聊天!".format(username))3738    def get_response(self, info):39        # 调用图灵机器人API40        url = ‘http://www.tuling123.com/openapi/api?key=‘ + self.key + ‘&info=‘ + info41        res = requests.get(url)42        res.encoding = ‘utf-8‘43        jd = json.loads(res.text)44        return jd[‘text‘]4546    def main(self):47        while True:48            sock, addr = self.socket.accept()49            t=threading.Thread(target=self.tcplink, args=(sock, addr))50            t.start()5152if __name__ == ‘__main__‘:53    cs = ChatServer(port=9999)54    cs.main()

将服务端程序跑起来,然后运行客户端,看下效果。

至此,我们看到我们机器人已经正常和我们调侃。


关注公众号,获取最新文章

原文地址:https://www.cnblogs.com/wongbingming/p/8973898.html

时间: 2024-10-03 17:06:47

Python进阶开发之网络编程,socket实现在线聊天机器人的相关文章

python进阶九_网络编程(一)

Python网络编程一 一.一些基本概念 在Python网络编程这一节中会涉及到很多网络相关的术语,对于一些最基本的概念,如TCP/IP,Socket等等不再赘述,不明白的可以自己去查一查,对于一些常见但是可能不是很熟悉的术语这里做了一个简要的介绍,后续遇到不会因此止步. SNTP:简单网络时间协议(Simple Network Time  Protocol)简单来说就是用来同步因特网中的计算机时钟,需要注意的是这里的SNTP是用户数据报(UDP)协议. MIME:Multipurpose In

Python 之 网络编程——SOCKET开发

一.预备知识 对于我们,主要掌握5层协议就行. 物理层: 转成二进制数序列数据链路层: 形成统一的协议:Internet协议 包括数据头(18个字节,前6个字节原地址,中间6个字节为目标地址,后6个字节为数据的描述)和数据网络层: 有IP协议,包括IP头和数据传输层: 包括tcp.UDP两个协议:基于端口(0-65535)的协议应用层: 包括http.ftp协议 TCP协议:流式协议,先把管道修好 客户端   服务端 C-------------------------------->S   <

java网络编程socket\server\TCP笔记(转)

java网络编程socket\server\TCP笔记(转) 2012-12-14 08:30:04|  分类: Socket |  标签:java  |举报|字号 订阅 1 TCP的开销 a  连接协商三次握手,c->syn->s,s->syn ack->c, c->ack->s b  关闭协商四次握手,c->fin->s, s->ack-c,s->fin->c,c->ack->s c  保持数据有序,响应确认等计算开销 d

linux 网络编程 socket bind failed 问题解决

今天写一个简单的socket网络通讯的程序的时候,用ctrl+c结束服务器端程序之后,再次启动服务器出现了bind failed:the address already in use的错误.在网上查了一下以后找到了原因,在此记录一下.这个IBM的官网上说到了这一点:http://www.ibm.com/developerworks/cn/linux/l-sockpit/.详细介绍如下: bind 普遍遭遇的问题是试图绑定一个已经在使用的端口.该陷阱是也许没有活动的套接字存在,但仍然禁止绑定端口(

python 14章,网络编程

一,socket 模块 套接字包括两类:服务器,客户机, 创建一个套接字后让它等待连接 服务器: import socket s = socket.socket() port = 1234 host = socket.gethostname() print host s.bind((host,port)) s.listen(5) while True: get,addr = s.accept() print 'Got connection from',addr get.send('Thank y

Android 网络编程 Socket

1.服务端开发 创建一个Java程序 public class MyServer { // 定义保存所有的Socket,与客户端建立连接得到一个Socket public static List<Socket> socketList = new ArrayList<Socket>(); public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(

网络编程socket基本API详解(转)

网络编程socket基本API详解 socket socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信. socket起源于UNIX,在Unix一切皆文件哲学的思想下,socket是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件. socket 类型 常见的socket有3种类

Java:进阶学习(1)——网络编程

Java:进阶学习(1)--网络编程 基础 Socket与ServerSocket Socket又称"套接字",网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. Socket方法 getInetAddress();    远程服务端的IP地址 getPort();    远程服务端的端口 getLocalAddress()    本地客户端的IP地址 getLocalPort()    本地客户端的端口 getInputStream();   

iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载+使用输出流代替文件句柄

前言:本篇讲解,在前篇iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载的基础上,使用输出流代替文件句柄实现大文件断点续传.    在实际开发中,输入输出流用的比较少,但是用起来也是很方便的.iOS开发用到的输入输出流和在Java中的输入输出流是几乎一样的,本质也是一个意思:将网络返回的数据当做流来处理.    输入输出的理解:输入到哪里?输出到哪里?这个问题不难理解,输入输出是要站着服务器角度来思考的,下面用图来解释:    代码关键词: 1.在接收到响应头的代理