Python socket 编程实验
实验内容
1.编写一个基于UDP协议的客户机与服务器程序,实现相互通讯。
2.编写一个基于TCP协议的客户机与服务器程序,实现相互通讯。
3.捕获以上两种通讯的数据包,使用Wireshark进行分析,以深入了解TCP、UDP协议的数据传输机制。
TCP编程及监听分析
1、建立一个TCP服务器连接需要6个步骤:
(1)创建socket对象。
调用socket构造函数:
socket=socket.socket(familly,type)
family的值可以是AF_UNIX(Unix域,用于同一台机器上的进程间通讯),也可以是AF_INET(对于IPV4协议的TCP和 UDP),至于type参数,SOCK_STREAM(流套接字)或者 SOCK_DGRAM(数据报文套接字)、SOCK_RAW(raw套接字),TCP使用SOCK_STREAM参数。
(2)将socket绑定(指派)到指定地址上,socket.bind(address)
address必须是一个双元素元组,((host,port)),主机名或者ip地址+端口号。如果端口号正在被使用或者保留,或者主机名或ip地址错误,则引发socke.error异常。
(3)绑定后,必须准备好套接字,以便接受连接请求。
socket.listen(backlog)
backlog指定了最多连接数,至少为1,接到连接请求后,这些请求必须排队,如果队列已满,则拒绝请求。
(4)服务器套接字通过socket的accept方法等待客户请求一个连接:
connection,address=socket.accept()
调用accept方法时,socket会进入'waiting'(或阻塞)状态。客户请求连接时,方法建立连接并返回服务器。accept方法返回一个含有两个元素的元组,形如
(connection,address)。第一个元素(connection)是新的socket对象,服务器通过它与客户通信;第二个元素(address)是客户的internet地址。
(5)处理阶段,服务器和客户通过send和recv方法通信(传输数据)。
服务器调用send,并采用字符串形式向客户发送信息。send方法返回已发送的字符个数。服务器使用recv方法从客户接受信息。调用recv时,必须指定一个整数来控制本次调用所接受的最大数据量。recv方法在接受数据时会进入'blocket'状态,最后返回一个字符串,用它来表示收到的数据。如果发送的量超过recv所允许,数据会被截断。多余的数据将缓冲于接受端。以后调用recv时,多余的数据会从缓冲区删除。
(6)传输结束,服务器调用socket的close方法以关闭连接。
2、建立一个TCP客户端连接则需要4个步骤:
(1)创建一个socket以连接服务器 socket=socket.socket(family,type)
(2)使用socket的connect方法连接服务器 socket.connect((host,port))
(3)客户和服务器通过send和recv方法通信。
(4)结束后,客户通过调用socket的close方法来关闭连接。
3、建立TCP服务器与TCP客户端程序
tcp-server.py
创建套接字,绑定套接字,开始监听,就是一个while循环一直监听有没有消息连接。
#-*- coding: utf-8 -*-
#@Time : 2021/4/15 15:16
#@Author : HUGBOY
#@File : tcp-server.py
#@Software: PyCharm
import socket
# 开启ip和port
ip_port = ('192.168.1.111', 666)
# 生成一个句柄
sk = socket.socket()
# 绑定ip和port
sk.bind(ip_port)
# 最多连接数
sk.listen(5)
# 开启死循环
print('server waiting...')
# 等待链接 阻塞
conn, addr = sk.accept()
# 获取客户端请求
print('链接成成功, 客户端为:', addr)
while True:
client_data = conn.recv(1024)
print('[收到客户端数据]:' + client_data.decode('utf-8'))
if client_data == 'q':
break
# 发送数据
msg = input('回复客户端:>>>')
conn.sendall(msg.encode('utf-8'))
# Close
conn.close()
sk.close()
ctp-client.py
创建套接字,连接,等待输入,发送。
#-*- coding: utf-8 -*-
#@Time : 2021/4/15 15:09
#@Author : HUGBOY
#@File : tcp-client.py
#@Software: PyCharm
import socket
# 服务端ip和port
ip_port = ('192.168.1.111', 666)
# 生成一个句柄
sk = socket.socket()
# 请求链接服务器
sk.connect(ip_port)
while True:
msg = input('向服务端发送:')
# 发送数据
sk.sendall((msg.encode('utf-8')))
if msg == 'q':
break
# 接收数据
server_reply = sk.recv(1024)
if not server_reply:
break
print('[收到服务端数据]:' + server_reply.decode('utf-8'))
# Close
sk.close()
实验任务
查出通讯三次握手、源端口、目的端口、TTL值、IP版本号、协议类型、IP头长度以及传输的数据内容。
三次握手
源端口
目的端口
TTL值
IP版本号
协议类型
IP头长度
传输数据内容
UDP编程及监听分析
由于UDP是无连接的,与TCP的区别在服务器端表现为,无需监听函数listen()对客户端的连接进行监听; 在客户端的表现为客户端的socket无需与服务器建立连接就能够进行数据的发送与接收,即无需connect()函数。
1、建立一个UDP服务器连接需要4个步骤:
1)创建socket对象。调用socket构造函数:
socket=socket.socket(familly,type)
family的值可以是AF_UNIX(Unix域,用于同一台机器上的进程间通讯),也可以是AF_INET(对于IPV4协议的TCP和 UDP),至于type参数,SOCK_STREAM(流套接字)或者 >SOCK_DGRAM(数据报文套接字),SOCK_RAW(raw套接字),UDP 使用SOCK_DGRAM参数。
2)将socket绑定(指派)到指定地址上,socket.bind(address)
address必须是一个双元素元组,((host,port)),主机名或者ip地址+端口号。如果端口号正在被使用或者保留,或者主机名或ip地址错误,则引发socke.error异常。
3)处理阶段,服务器和客户通过sendto()和recvfrom()方法通信(传输数据)。
4)传输结束,服务器调用socket的close方法以关闭连接。
2、建立一个UDP客户端连接则需要4个步骤:
1)创建一个socket以连接服务器 socket=socket.socket(family,type)
2)使用socket的connect方法连接服务器 socket.connect((host,port))
3)客户和服务器通过sendto()和recvfrom()方法通信。
4)结束后,客户通过调用socket的close方法来关闭连接。
3、编写UDP服务器与客户端程序
udp-server.py
创建套接字,开始监听,就是一个while循环一直监听有没有消息连接。
#-*- coding: utf-8 -*-
#@Time : 2021/4/15 18:55
#@Author : HUGBOY
#@File : udp-server.py
#@Software: PyCharm
from socket import *
host = '192.168.1.111'
port = 666
addr = (host, port)
s = socket(AF_INET, SOCK_DGRAM)
s.bind(addr)
print('等待客户端连接...')
while True:
data, addr = s.recvfrom(1024)
print(addr + ':' + data.decode('utf-8'))
msg = '收到。'
s.sendto(msg.encode('utf-8'), addr)
s.close()
udp-client.py
创建套接字,while循环一直监听有没有消息连接。
#-*- coding: utf-8 -*-
#@Time : 2021/4/15 17:13
#@Author : HUGBOY
#@File : udp-client.py
#@Software: PyCharm
from socket import *
host = '192.168.1.111'
port = 666
addr = (host, port)
s = socket(AF_INET, SOCK_DGRAM)
while True:
msg = input('向客户端发送:')
s.sendto(msg.encode('utf-8'), addr)
data, addr = s.recvfrom(1024)
print(addr, ':', data.decode('utf-8'))
s.close
实验任务:
查出通讯的源端口、目的端口、TTL值、IP版本号、协议类型、IP头长度以及传输的数据内容。
查出通讯的源端口
目的端口
TTL值
IP版本号
协议类型
IP头长度
传输的数据内容
参考
Python socket 编程实验的更多相关文章
- python/socket编程之粘包
python/socket编程之粘包 粘包 只有TCP有粘包现象,UDP永远不会粘包. 首先需要掌握一个socket收发消息的原理 发送端可以是1k,1k的发送数据而接受端的应用程序可以2k,2k的提 ...
- Python Socket 编程——聊天室示例程序
上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...
- PYTHON SOCKET编程简介
原文地址: PYTHON SOCKET编程详细介绍 Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 Soc ...
- python socket编程笔记
用python实现一个简单的socket网络聊天通讯 (Linux --py2.7平台与windows--py3.6平台) 人生苦短之我用Python篇(socket编程) python之路 sock ...
- [Python_7] Python Socket 编程
0. 说明 Python Socket 编程 1. TCP 协议 [TCP Server] 通过 netstat -ano 查看端口是否开启 # -*-coding:utf-8-*- "&q ...
- Python Socket 编程示例 Echo Server
简评:我们已经从「Python Socket 编程概览」了解了 socket API 的概述以及客户端和服务器的通信方式,接下来让我们创建第一个客户端和服务器,我们将从一个简单的实现开始,服务器将简单 ...
- Python Socket 编程——聊天室演示样例程序
上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和client的代码了解主要的 Python Socket 编程模型.本文再通过一个样例来加强一下对 Socket ...
- python socket编程入门(编写server实例)+send 与sendall的区别与使用方法
python 编写server的步骤: 1. 第一步是创建socket对象.调用socket构造函数.如: socket = socket.socket( family, type ) family参 ...
- 第九章:Python高级编程-Python socket编程
第九章:Python高级编程-Python socket编程 Python3高级核心技术97讲 笔记 9.1 弄懂HTTP.Socket.TCP这几个概念 Socket为我们封装好了协议 9.2 cl ...
随机推荐
- [Fundamental of Power Electronics]-PART II-8. 变换器传递函数-8.4 变换器传递函数的图形化构建
8.4 变换器传递函数的图形化构建 第7章推导出的buck变换器小信号等效电路模型在图8.55中再次给出.让我们用上一节的图解方法来构造该变换器的传递函数和端阻抗. Fig. 8.55 Small-s ...
- python基础(四):切片和索引
Python中的序列有元组.列表和字符串,因此我们都可以通过索引和切片的方式,来获取其中的元素. 索引 Python中的索引,对于正向索引,都是从0开始的.但是对于反向索引,确实从-1开始的.如图所示 ...
- 用递归求n皇后问题
此问题是指在n*n的国际象棋棋盘上 ,放置n个皇后,使得这n个皇后均不在,同一行,同一列,同一对角线上,求出合法的方案的数目. 本题可以简单转化为就是求n的全排列中的数放在棋盘上使得这几组数,符合均不 ...
- Java 使用 Maven BOM 统一管理版本号
一个中大型的 Java 项目往往包含若干 JAR 包,这些 JAR 包有着不同的版本号.如果这些 JAR 包单独发布,然后直接通过版本号引用相应的 JAR 包,不同版本的兼容性维护将变得十分麻烦.为了 ...
- 【macOS】Homebrew & Homebrew cask macOS软件包管理神器
Homebrew Homebrew 与 Homebrew Cask Homebrew 是基于 OS X 的套件管理工具,是一个开源的 Ruby 脚本,专门用于快速下载软件.更通俗地讲,Homebrew ...
- 自动化kolla-ansible部署ubuntu20.04+openstack-victoria之镜像上传-11
自动化kolla-ansible部署ubuntu20.04+openstack-victoria之镜像上传-11 欢迎加QQ群:1026880196 进行交流学习 镜像上传 #controller1 ...
- Mybatis3源码笔记(七)Plugin
1.Mybatis3的插件其实主要是用到了责任链和动态代理两种模式相结合而生成的.下面我们看一个例子,在执行所有update操作时,执行一个小小的测试输出. @Intercepts({@Signatu ...
- JDBC_09_Statement 和 PreparedStatement
Statement 和 PreparedStatement * Statement数据库操作对象存在SQL注入问题,而PreparedStatement预编译数据库操作对象解决了SQL注入问题. * ...
- JavaScript设计模式(一):单例模式
单例模式的定义与特点 单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式.例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗 ...
- k8s 创建私有docker仓库 登陆授权令牌的Secret
参考https://kubernetes.io/zh/docs/tasks/configure-pod-container/pull-image-private-registry/ Kubernete ...