2.网络编程--练习
一.面向连接与无连接的区别?
套接字:最初用于一台主机进程与进程之间的通信,后来用于网络之间的通信。任何类型的通信开始之前,网络程序必须创建套接字,即通信端点!
1.面向连接,在通信开始之前,必须先建立一个连接。无连接,在通信开始之前,不需要先建立连接。
2.面向连接通信的主要通信协议是TCP,提供序列化、可靠的、不重复的数据交付,没有记录边界。就是说每个消息可以拆分成多个片段,且每个消息片段都确保能够到达目的地,然后后将它们按顺序组合在一起,再形成完整的消息交付给对方。
无连接通信的主要协议是UDP,在数据传输过程中,无法保证数据的顺序性、可靠性、重复性,但是它保存了记录边界。就是说消息是整体发送的,而非片段。
3.面向连接在网络传输时,使用TCP/IP协议组合;在非网络传输时,使用TCP/AF_LOCAL或TCP/AF_UNIX协议组合。
无连接在网络传输时,使用UDP/IP协议组合。
4.面向连接使用的套接字的类型是SOCK_STREAM,无连接使用的套接字类型是SOCK_DGRAM;
补充:TCP,全称transmission control protocol,传输控制协议;UDP,全称User Datagram Protocol,用户数据报协议
补充:那么,数据包既然会丢失,怎样能保证程序能够正常工作呢?事实上,每个使用UDP的程序都要有自己的对数据进行确认的协议。比如,TFTP协议定义了对于每一个发送出去的数据包,远程在接受到之后都要回送一个数据包告诉本地程序:“我已经拿到了!(一个“ACK”包)。如果数据包发的送者在5秒内没有的得到回应,它就会重新发送这个数据包直到数据包接受者回送了“ACK”信号。这些知识对编写一个使用UDP协议的程序员来说是非常必要的。
无连接服务器一般都是面向事务处理的,一个请求一个应答就完成了客户程序与服务程序之间的相互作用。
二、举例说说C/S架构
服务器就是一系列硬件或软件,为一个或多个客户端(服务的用户)提供所需的“服务”。其存在的目的就是等待客户端的请求,并响应他们(提供服务),然后等待更多的请求。
补充:CS与BS的区别:CS双向通信。任务分别在客户端和服务端运行,减少服务端压力。但是客户端需要客户端软件,因此在维护成本上很大。
B/S结构,即Browser/Server(浏览器/服务器)结构。在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现,形成所谓3-tier结构。
补充:分布式:一个业务分拆多个子业务,部署在不同的服务器上;集群:同一个业务,部署在多个服务器上
三、socket编程实现半双工与全双工聊天
单独一篇文章
四、网络互连和套接字:实现一个TCP C/S,令其能够识别date、os、ls命令
#!/usr/bin/env python # coding: utf-8 import socket from time import ctime import os import re HOST = '' PORT = 50006 ADDR = (HOST, PORT) #获取指定路径的文件列表,默认为当前文件列表 def list_dir(path=os.curdir): files = os.listdir(path) filenames = [] for file in files: filenames.append(file) return '\n'.join(filenames) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(ADDR) s.listen(5) while True: conn, addr = s.accept() print('Connected by ', addr) while True: data = conn.recv(1024) s_data = '' if not data: break data = data.decode('utf-8') #判断指令为time if data == 'date': s_data = '[%s]'%ctime() #判断指令为os elif data == 'os': s_data = '[%s]'%os.name else: #判断指令为ls if data == 'ls': s_data = list_dir() else: #判断指令为ls path patt = 'ls\s([^\s]+)' m = re.match(patt,data) if m: path = m.group(1) if os.path.exists(path): s_data = list_dir(path) else: s_data = 'not exist path' else: s_data = 'this is no order' + data conn.send(s_data.encode('utf-8')) conn.close() s.close()
客户端:
import socket HOST = 'localhost' PORT = 50006 ADDR = (HOST, PORT) with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect(ADDR) while True: data = input('>>> ') if not data:break s.send(data.encode('utf-8')) data = s.recv(1024) if not data:break data = data.decode('utf-8') print(data)
posted on 2018-04-27 11:01 myworldworld 阅读(171) 评论(0) 收藏 举报