练习题

  1. 什么是C/S架构?

      C/S架构客户端、服务端架构,C/S端软件主要有网络游戏,QQ等
  2. 互联网协议是什么?分别介绍五层协议中每一层的功能?

      互联网协议:计算机之间的通信标准
    物理层:主要是基于电器特性发送高低电压(电信号),高电压对应数字1,低电压对应数字0。原始比特流在物理介质上的传输。
    数据链路层:定义电信号的分组方式,两台主机通过MAC地址进行通信。
    网络层:引入IP地址区分不同的广播/子网,选择正确的路由找到目标主机。
    传输层:建立端口到端口的通信,TCP,UDP。
    应用层:供操作系统或应用进行网络通信的标准接口(FTP,HTTP,TELNET)
  3. 基于tcp协议通信,为何建立链接需要三次握手,而断开链接却需要四次挥手

      因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四次挥手.
  4. 为何基于tcp协议的通信比基于udp协议的通信更可靠?

      TCP协议的通信是面向连接的协议,只要不得到确认,就重新发送数据报,直到得到对方的确认为止。
    UDP协议的通信它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去。
  5. ‍流式协议指的是什么协议,数据报协议指的是什么协议?

      流式协议指TCP
    数据报协议指UDP
  6. 什么是socket?简述基于tcp协议的套接字通信流程

      socket是应用层与TCP/IP协议通信的中间软件抽象层,它是一组接口。它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
    所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。
  7. 什么是粘包? socket 中造成粘包的原因是什么? 哪些情况会发生粘包现象?

      TCP协议是面向流的协议,客户端把多个数据包合并在一起发送到服务端,就产生了粘包。
    由于接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所造成的。
    只有TCP有粘包现象,UDP永远不会粘包

    客户端粘包:
    发送端需要等缓冲区满才发送出去,造成粘包(发送数据时间间隔很短,数据量很小,TCP优化算法会当做一个包发出去,产生粘包)

    服务端粘包:
    接收方不及时接收缓冲区的包,造成多个包接收(客户端发送了一段数据,服务端只收了一小部分,服务端下次再收的时候还是从缓冲区拿上次遗留的数据,产生粘包) 
  8. 基于socket开发一个聊天程序,实现两端互相发送和接收消息
server.py

import socket

IP_PORT = ('127.0.0.1', 9999)
sock_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock_server.bind(IP_PORT) sock_server.listen(5)
print("start ……")
while True:
conn, addr = sock_server.accept() # 阻塞直到有连接为止
print('connect by ', addr)
while True:
try:
data = conn.recv(1024) # 收到数据
if not data:
break
print('server 收到的数据 ', data.decode())
response = input(" input server msg >>> ").strip()
conn.send(response.encode())
print("send to data:", response) except ConnectionResetError: # 适用于windows操作系统,防止客户端断开连接后死循环
break
conn.close() sock_server.close() -----------------------------------------------------------------------
client.py import socket client_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
IP_PORT = ('127.0.0.1', 9999)
client_sock.connect(IP_PORT) while True:
msg = input(" input client msg >>> ").strip()
if not msg:
continue
client_sock.send(msg.encode()) # 发送用户输入的数据,必须是bytes模式
recv_data = client_sock.recv(1024)
print('client recvive data ', recv_data.decode()) # 收到服务器的响应后

  

9. 基于tcp socket,开发简单的远程命令执行程序,允许用户执行命令,并返回结果

server:

import socket
import subprocess
import struct
import json def cmd_exec(cmd):
"""
执行shell命令
:param cmd:
:return:
"""
p = subprocess.Popen(cmd, shell=True,
stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = p.communicate()
if p.returncode != 0:
return stderr
return stdout IP_PORT = ('127.0.0.1', 9999)
sock_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock_server.bind(IP_PORT) sock_server.listen(5)
print("start ……")
while True:
conn, addr = sock_server.accept() # 阻塞直到有连接为止
print('connect by ', addr)
while True:
try:
data = conn.recv(1024) # 收到数据
if not data:
break
print('客户端的命令', data.decode('GBK'))
res = cmd_exec(data.decode('GBK')) # 执行cmd命令
# 构造消息头,命令+结果长度,防止粘包
header = {
'cmd': data.decode('GBK'),
'res_size': len(res)
}
header_json = json.dumps(header)
header_bytes = header_json.encode('utf-8') header = struct.pack('i', len(header_bytes))
# 第二步:把报头长度发送给客户端
conn.send(header)
# 第三步:把报头内容发送给客户端
conn.send(header_bytes) # 第四步:再发送真实的数据
conn.sendall(res) except ConnectionResetError: # 适用于windows操作系统,防止客户端断开连接后死循环
break
conn.close() sock_server.close() -------------------------------------- client: import socket
import struct
import json client_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
IP_PORT = ('127.0.0.1', 9999)
client_sock.connect(IP_PORT) while True:
msg = input(" input client msg >>> ").strip()
if not msg:
continue
client_sock.send(msg.encode('GBK')) # 发送数据 # 第一步:先收报头
header = client_sock.recv(4)
# 第二步:从报头中解析(header数据的长度)
header_size = struct.unpack('i', header)[0]
print('收到报头长度=', header_size)
# 第三步:收到报头解析出对真实数据的描述信息
header_json = client_sock.recv(header_size)
header_dict = json.loads(header_json)
print('收到报头内容=', header_dict)
total_size = header_dict['res_size'] # 第三步:接收真实的数据
recv_size = 0
recv_data = b'' while recv_size < total_size:
data = client_sock.recv(1024)
recv_data += data
recv_size += len(data) print('接收数据 =', recv_data.decode('gbk', 'ignore')) # 如果设置为ignore,则会忽略非法字符; client_sock.close()

  

10. 基于tcp协议编写简单FTP程序,实现上传、下载文件功能,并解决粘包问题

11. 基于udp协议编写程序,实现功能

      1. 执行指定的命令,让客户端可以查看服务端的时间

      2. 执行指定的命令,让客户端可以与服务的的时间同步

server:

from socket import *
import time
import struct
import json server = socket(AF_INET, SOCK_DGRAM)
server.bind(('127.0.0.1', 8880)) while True:
print("waiting for message ……")
# 收到报头长度
action_type, client = server.recvfrom(1024)
print('recv {}'.format(action_type.decode()))
if not action_type:
print('connect is lost ……')
break
if action_type:
print('start sent to server time ……')
server_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
time.sleep(1)
server.sendto(server_time.encode('utf-8'), client) server.close() --------------------------------------------------------
client: from socket import *
import time
import json
import struct def send_msg(client, action_type, **kwargs):
"""
打包消息,发送到服务器
:param action_type:
:param kwargs:
:return:
""" # 发送cmd
print('发送auth报头内容:{}'.format(action_type))
client.sendto(action_type.encode("utf-8"), ('127.0.0.1',8880)) if __name__ == '__main__': client = socket(AF_INET, SOCK_DGRAM) while True:
cmd = input("input cmd >> ").strip()
if not cmd: continue
send_msg(client, cmd)
data, server = client.recvfrom(1024)
if cmd =='gettime':
print("server time is", data.decode())
print("local clock is", time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()))
elif cmd == 'synctime':
print("server time is {} start sync client clock ……".format(data.decode()))
print("local clock is", data.decode())
elif cmd == 'bye':
break
else:
print('input cmd error')
client.close()

  

Python网络练习题的更多相关文章

  1. Python 网络编程(二)

    Python 网络编程 上一篇博客介绍了socket的基本概念以及实现了简单的TCP和UDP的客户端.服务器程序,本篇博客主要对socket编程进行更深入的讲解 一.简化版ssh实现 这是一个极其简单 ...

  2. Python 网络编程(一)

    Python 网络编程 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. ...

  3. 笔记之Python网络数据采集

    笔记之Python网络数据采集 非原创即采集 一念清净, 烈焰成池, 一念觉醒, 方登彼岸 网络数据采集, 无非就是写一个自动化程序向网络服务器请求数据, 再对数据进行解析, 提取需要的信息 通常, ...

  4. Python网络socket学习

    Python 网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的 ...

  5. python入门练习题1

    常见python入门练习题 1.执行python脚本的两种方法 第一种:给python脚本一个可执行的权限,进入到当前存放python程序的目录,给一个x可执行权限,如:有一个homework.py文 ...

  6. Python学习(22)python网络编程

    Python 网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的 ...

  7. Day07 - Python 网络编程 Socket

    1. Python 网络编程 Python 提供了两个级别访问网络服务: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口 ...

  8. 关于Python网络爬虫实战笔记③

    Python网络爬虫实战笔记③如何下载韩寒博客文章 Python网络爬虫实战笔记③如何下载韩寒博客文章 target:下载全部的文章 1. 博客列表页面规则 也就是, http://blog.sina ...

  9. 关于Python网络爬虫实战笔记①

    python网络爬虫项目实战笔记①如何下载韩寒的博客文章 python网络爬虫项目实战笔记①如何下载韩寒的博客文章 1. 打开韩寒博客列表页面 http://blog.sina.com.cn/s/ar ...

随机推荐

  1. 假期训练六(poj-1753,递归+hdu-2844,多重背包)

    题目一:传送门 题意:有一个4*4的棋盘,每次翻转一个棋子和它的上下左右的四个棋子,判断翻转多少次之后可以变为纯色的棋盘. 思路:总共有C(0,16)+C(1,16)+C(2,16)+……+C(16, ...

  2. urllib — URL handling modules

    urllib is a package that collects several modules for working with URLs: •urllib.request for opening ...

  3. aliyun API 调试

    打开https://ai.aliyun.com/,登录阿里云账号,选择控制台,右侧标签中选择产品服务,选择自己需要的子标签(如图像识别),选择API调试,按要求填写表格. 其中请求Body参照API文 ...

  4. logcat命令详解【二】

    eclipse 自带的 LogCat 工具太垃圾了, 开始用 adb logcat 在终端查看日志; 1. 解析 adb logcat 的帮助信息 在命令行中输入 adb logcat --help  ...

  5. vue的过渡和动画

    简单过渡 .fade-enter-active, .fade-leave-active { transition: all .5s; } /*.fade-enter, .fade-leave-to { ...

  6. ubuntu设置IP地址、网关的方法

    打开terminal(用Ctrl+Alt+T打开) 1. 输入ifconfig  打印如下: enp1s0    Link encap:Ethernet  HWaddr 6c:4b:90:0b:53: ...

  7. [转]两表join的multi update语句在MySQL中的执行流程分析

    出自:http://hedengcheng.com/?p=209 两表join的multi update语句,执行结果与预计不一致的分析过程 — multi update结论在实际应用中,不要轻易使用 ...

  8. oss+上传文件夹

    最近公司做工程项目,实现文件夹云存储上传. 网上找了一天,发现网上很多代码都存在相似问题,最后终于找到了一个满足我需求的项目. 工程如下: 这里对项目的文件夹传输功能做出分析,怎么实现文件夹上传的,如 ...

  9. 严格别名规则“-fstrict-aliasing”和“-fno-strict-aliasing”及类型双关

    “-fstrict-aliasing”表示启用严格别名规则,“-fno-strict-aliasing”表示禁用严格别名规则,当gcc的编译优化参数为“-O2”.“-O3”和“-Os”时,默认会打开“ ...

  10. python基础回顾

    1.第二个缺点就是代码不能加密.如果要发布你的Python程序,实际上就是发布源代码,这一点跟C语言不同,C语言不用发布源代码,只需要把编译后的机器码(也就是你在Windows 上常见的xxx.exe ...