交互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库
          import socket
        
      • 创建基于UDP的socket
          s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
        
      • 直接发送数据到服务器
          s.sendto(data,('127.0.0.1',9999))
        
      • 接收数据(可以每次接收的大小,如果超过大小会报异常信息)
          s.recv(1024)
        
  • 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)
      
  • TCP客户端
    • 创建一个客户端的基于TCP 协议的socket
        s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
      
    • 建立连接
        s.connect((HOST,PORT))
      
    • 发送消息
        s.send(inputtext)
      
    • 接收消息
        data = s.recv(1024)
      

总结


TCP比UDP的编程无疑是复杂得多的,其中还引入了一个新的概念:线程,个人估计是因为这个原因大妈才建议我们用UDP来实现.

代码

UDP版

TCP版