交互101-NET版日记本软件
背景
system: mac 10.11
python: 2.7.10
真的如大家所说那么简单吗?
在写私人教程之前看了一下写得快的同学的日记,普遍反映都说比上次GUI简单多了.个人认为网络编程需要用到的知识会更多一些,更容易在实际编程中出现问题.只是日记本这个软件用GUI的实现会更繁琐,而用CLI会比较直接,毕竟GUI需要做界面的设计和代码实现,按理工作量是CLI的两倍.所以我们都觉得CLI比简单,但是网络编程尤其是socket编程其实需要了解更多的知识.
net交互需要了解什么?
什么是socket套接字?
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket.python官方文档则说"socket-底层的网络接口",看到底层我已经开始醉了,先不管用起来再说.
简单理解sever和client的关系的话可以打一个比方:server类似银行的atm机,它启动准备就绪之后就一直在等待用户这些客户端来给它发送数据,然后atm机器通过处理后向用户返回数据.如果没有客人业就是说客户端不发送消息的话,atm机就会一直空闲的状态下等待请求进来.
UDP socket怎么用?
- 服务端:
- 导入socket库
import socket
- 创建UDP
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
- 绑定连接
s.bind('127.0.0.1',9999)
- 从客户端接收数据(可以大小)
While True: data,addr = s.recvfrom(1024)
- 导入socket库
- 客户端:
- 还是导入socket库
import socket
- 创建基于UDP的socket
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
- 直接发送数据到服务器
s.sendto(data,('127.0.0.1',9999))
- 接收数据(可以每次接收的大小,如果超过大小会报异常信息)
s.recv(1024)
- 还是导入socket库
- 服务端:
UDP是什么鬼? UDP a is connection-less protocol.不是面向连接的协议,看起来就是不可靠的.
TCP又是什么? TCP is a connection oriented stream over an IP network. 它是面向连接的协议,可靠.
思考
大妈布置作业的时候为啥选用UDP而不是TCP呢?他说不是命令我们用UDP,那么TCP可以吗?怎么用?他们的写法有什么不同.
尝试用TCP完成编码
- TCP 服务端
- 创建服务端socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
- 绑定端口和ip地址
s.bind((HOST, PORT))
- 监听端口(可以设置允许连接的客户端数量)
s.listen(5)
- 接收请求
# 接受一个新连接: sock, addr = s.accept() # 创建新线程来处理TCP连接: t = threading.Thread(target=tcplink, args=(sock, addr)) t.start()
- 读取指令,并根据情况返回数据给客户端
data = s.recv(1024)
- 读取数据并返回
while True: data = sock.recv(1024) time.sleep(2) sock.send('哈哈,你写了, %s!' % data)
- 创建服务端socket
- TCP客户端
- 创建一个客户端的基于TCP 协议的socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
- 建立连接
s.connect((HOST,PORT))
- 发送消息
s.send(inputtext)
- 接收消息
data = s.recv(1024)
- 创建一个客户端的基于TCP 协议的socket
总结
TCP比UDP的编程无疑是复杂得多的,其中还引入了一个新的概念:线程,个人估计是因为这个原因大妈才建议我们用UDP来实现.