建议大家先百度搜索下了解下socket通信和http通信的区别。
我是刚百度过。毕竟学校学的东西早就忘光了。
忘了不可怕,可怕的是忘了却以为自己什么都知道。(很明显,我以前就是这种人 ← 笑哭)
案例一
from socket import *
# IP
myhost = ''
# 端口号
myport = 8080
# 新建socket
sockobj = socket(AF_INET,SOCK_STREAM)
# 绑定地址
sockobj.bind((myhost,myport))
# 设置最大连接数
sockobj.listen(128)
while True:
# 接收数据信息,地址信息
connection ,address = sockobj.accept()
# 打印地址信息
print("class of address:"+str(type(address)))
print( "connect by "+str(address))
while True:
# 从数据信息中取1024个字节
data = connection.recv(1024)
# 如果data为空,结束连接
if not data:
break
# 打印data类型
print("class of data:"+str(type(data)))
# 回传信息
rstr =bytes("echo:",encoding='utf-8')+ data
connection.send(rstr)
# 关闭连接
connection.close()
代码相对简单。这是利用原生的socket进行编程的。
结果如下:
如果用的是linux系统,直接nc 127.0.0.1 8080 就连接上了,因为我用的是windows,专门下载的nc工具,如果你也是Windows的话,请在文章最后下载压缩包,那里有nc工具和相关代码。
记住新建socket → 绑定地址 → 设置连接数,上面的代码就没有问题了。可以考虑多默写几遍。理解下其中深意。
当然如果你觉得这已经是最简单的了,那你就错了。
接下来我们引入python专门用于socket编程的库来试试。
案例二
看看代码,这里有三个地方需要注意下,
1、socketserver 这是python 3.x的,如果你用的是2.x 需要改为SocketServer
2、在返回值的时候,我为了好看加了个回车也就是‘\n’但是需要把转成byte类型才能和data.upper()合到一起回传。
3、一定记住port要int类型,我写的时候写成了‘8080’一只报错,我一脸懵逼都不知道哪里错了。这是错误提示:an integer is required (got type str)
怎么样,引入Python的库,你专注的工作重点就从构造socket转向写自己需要的业务了吧?是不是省了很多事儿?
案例三
以上两个例子都只支持一个客户端,可实际情况下,肯定不止一个啊?
只要把案例二稍微修改下。就搞定了~
StreamRequestHandler 是 BaseRequestHandler的一个子类,可以以文件流形式操作来接收和发送byte数据。
这时候我们就可以利用它同时与多个客户端交互了。
结果如下:
如上,Python代码少不少?
了解下,为后来自己搭建后台服务器打个基础。
能明白多少就明白多少,大不了自己多敲几遍。