前言

以前做了实验都是直接分享实验报告。反思了一下,实验报告又臭又长,最多只有同做这个实验的朋友会耐着性子看一看。为了提供更有效的知识分享,能为更多的朋友提供一些参考,以后的文章我都会尽量主题鲜明,简洁易读哒。


目录

  • 前言
  • 一.Socket
  • 二.采用TCP进行数据发送的简单程序(python)
    • C-S之间的动作次序
    • Server:
    • Client:
    • 测试
  • 三.采用UDP进行数据发送的简单程序(python)
    • C-S之间的动作次序
    • Server:
    • Client:
    • 测试
  • 四.参考资料
  • 五.总结

一.Socket

Socket(套接字)是一种抽象层,应用程序通过它来发送和接收数据,就像应用程序打开一个文件句柄,将数据读写到稳定的存储器上一样。一个socket允许应用程序添加到网络中,并与处于同一个网络中的其他应用程序进行通信。一台计算机上的应用程序向socket写入的信息能够被另一台计算机上的另一个应用程序读取,反之亦然。
不同类型的socket与不同类型的底层协议族以及同一协议族中的不同协议栈相关联。现在TCP/IP协议族中的主要socket类型为流套接字(sockets sockets)和数据报套接字(datagram sockets)。流套接字将TCP作为其端对端协议(底层使用IP协议),提供了一个可信赖的字节流服务。一个TCP/IP流套接字代表了TCP连接的一端。数据报套接字使用UDP协议(底层同样使用IP协议),提供了一个"尽力而为"(best-effort)的数据报服务,应用程序可以通过它发送最长65500字节的个人信息。一个TCP/IP套接字由一个互联网地址,一个端对端协议(TCP或UDP协议)以及一个端口号唯一确定。

二.采用TCP进行数据发送的简单程序(python)

服务器首先运行,等待连接建立

1.服务器进程必须先处于运行状态

  • 创建欢迎socket
  • 和本地端口绑定
  • 在欢迎socket上阻塞式等待接收用户的链接

客户端主动和服务器建立连接

2.创建客户端本地套接字(隐式捆绑到本地port)

  • 指定服务器进程的IP地址和端口号,与服务器进程连接

3.连接API调用有效时,客户端P与服务器建立了TCP连接

4.当与客户端连接请求到来时

  • 服务器接受来自用户端的请求,接触阻塞式等待,返回一个新的socket(与欢迎socket不一样),与客户端通信

C-S之间的动作次序

  1. 服务器运行,并打印准备好接收
  2. 客户端从标准输入装置读取一行字符,发送给服务器
  3. 服务器从socket读取字符然后打印出来
  4. 客户端输入1 结束连接

Server:

import socket# 指定IP为本机IP 端口号任意指定为6666
ip_port = ('127.0.0.1', 6666)
# 最多可以连接back_log个客户端
back_log = 1
# 创建一个TCP套接字
serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 对socket的配置重用ip和端口号
serverSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 绑定端口号
serverSocket.bind(ip_port)  # 绑定哪个ip就要运行在哪台机器上
# 设置半连接池
serverSocket.listen(back_log)  # 让服务器聆听来自客户的TCP请求print('The server is ready to receive')
while 1:# 阻塞等待,创建连接connectionSocket, addr = serverSocket.accept()  # 当客户敲门,创建了一个新的套接字,为这个客户服务while 1:try:msg = connectionSocket.recv(1024).decode('utf-8')  # # 每次最多接收1k字节,并将报文转码if msg == '1':connectionSocket.closeprint("服务器收到消息:", msg)except Exception as e:  # 异常检查break
serverSocket.close()

IP使用回环地址127.0.0.1。 127.0.0.1是一个特殊的IP地址,表示本机地址,如果绑定到这个地址,客户端必须同时在本机运行才能连接,也就是说,外部的计算机无法连接进来。

端口号小于1024的是Internet标准服务的端口,端口号大于1024的,可以任意使用。 只要确保客户端和服务器使用的是同一组端口即可

创建Socket时,AF_INET指定使用IPv4协议,如果要用更先进的IPv6,就指定为AF_INET6SOCK_STREAM指定使用面向流的TCP协议

listen(n)传入的值, n表示的是服务器拒绝(超过限制数量的)连接之前,操作系统可以挂起的最大连接数量。n也可以看作是"排队的数量"

Client:

import socket
# 创建客户端套接字
clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 发起和服务器的TCP连接
clientSocket.connect(('127.0.0.1', 6666))
while 1:msg = input('please input')# 防止空消息if not msg:continueclientSocket.sendall(msg.encode('utf-8'))if msg == '1':break
clientSocket.close()

客户端和服务器端差别不大,就不赘述解释了

测试

三.采用UDP进行数据发送的简单程序(python)

在客户端和服务器之间没有连接

  • 没有握手
  • 发送端在每一个报文中明确地指定目标的IP地址和端口后
  • 服务器必须从收到的分组中提取出发送端的IP和端口号

C-S之间的动作次序

  1. 服务器运行,并打印准备好接收
  2. 客户端从标准输入装置读取一行字符,发送给服务器
  3. 服务器将小写字母转成大写字符再发给客户端
  4. 客户端打印转换后的结果

Server:

from socket import *
#创建套接字
udp_ser = socket(AF_INET, SOCK_DGRAM)
#绑定端口
udp_ser.bind(('127.0.0.1', 666))
print("The UDP-server is ready to receive")
while 1:msg, adrr = udp_ser.recvfrom(1024)modmsg = msg.decode().upper()udp_ser.sendto(modmsg.encode(), adrr)

Client:

from socket import *
#创建套接字
udp_cli = socket(AF_INET, SOCK_DGRAM)
while 1:msg = input('input:')udp_cli.sendto(msg.encode('utf-8'), ('127.0.0.1', 666))data, addr = udp_cli.recvfrom(1024)print(data.decode('utf-8'))

测试

四.参考资料

1.HUN《计算机网络》实验方案
2.b站中科大郑老师的网课PPT
3.《计算机网络-自顶向下方法》
4.CSDN的优秀博主(抱歉前几天看的,忘存ID了 o(╥﹏╥)o)

五.总结

纸上学来终觉浅,绝知此事要躬行
快敲代码试试叭

【计算机网络】python——socket编程(TCP/UDP)相关推荐

  1. 计算机网络之Socket编程(UDP)

    计算机网络通信Socket编程 实现方式:在visual studio平台上使用C#语言编写局域网上的一对一聊天程序. **原理概述:**用UDP协议实现服务器和客户端是一台电脑上的两个进程.当客户端 ...

  2. 网络编程—网络基础概览、socket,TCP/UDP协议

    网络基础概览 socket概览 socket模块-TCP/UDP的实现 TCP/UDP总结 网络基础概览 osi七层协议各层主要的协议 # 物理层传输电信号1010101010 # 数据链路层,以太网 ...

  3. Python网络编程——TCP与UDP

    Python网络编程 TCP(复杂可靠)与UDP(简单不可靠)的区别 1) TCP提供面向连接的传输,通信前要先建立连接(三次握手机制): UDP提供无连接的传输,通信前不需要建立连接. 2) TCP ...

  4. Linux Kernel TCP/IP Stack — Socket Layer — TCP/UDP Socket 网络编程

    目录 文章目录 目录 TCP/UDP Socket 逻辑架构 创建 Socket 绑定 Socket 请求建立 Socket 连接 监听 Socket 接受请求 关闭连接 数据的发送和接收 send ...

  5. tcp与udp的socket编程,udp代码实现客户端服务端,tcp代码实现客户端服务端(单线程、多线程、多进程分别实现),三次握手

    socket编程 网络字节序 定义 为什么网络数据需要转换为网络字节序? Udp协议 Tcp协议 Udp的socket编程 编程流程 接口 创建套接字 绑定地址信息 发送 接收 关闭 主机字节序转换成 ...

  6. [Python_7] Python Socket 编程

    0. 说明 Python Socket 编程 1. TCP 协议 [TCP Server] 通过 netstat -ano 查看端口是否开启 # -*-coding:utf-8-*-"&qu ...

  7. python socket编程_Python Socket编程实现网络编程

    对于有经验的开发人员来说,掌握的编程语言应该是不少的.在这些编程语言中,网络编程的应用时必不可少的.其中Python也是这样的编程语言.我们今天将会在这里为大家详细介绍一下Python Socket编 ...

  8. python/socket编程之粘包

    python/socket编程之粘包 粘包 只有TCP有粘包现象,UDP永远不会粘包. 首先需要掌握一个socket收发消息的原理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 发 ...

  9. PYTHON SOCKET编程简介

    原文地址: PYTHON SOCKET编程详细介绍 Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 Socke ...

  10. Python Socket 编程——聊天室示例程序

    上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...

最新文章

  1. SLAM本质剖析-Open3D
  2. Vue核心50讲 | 第四回:Vue 官方赠送的橙色装备,岂能不要
  3. C#SetWindowPos窗口置顶
  4. java html api 百度云,Javase-6.0_中文API_HTML(最新更新)
  5. [数据结构与算法] 单链表的简单demo
  6. 输错密码?这个 sudo 会“嘲讽”你
  7. 怎么设置某个用户生成hdfs文件的权限_管理 HDFS 服务
  8. FFMpeg的avcodec_send_packet/avcodec_receive_frame是异步解码
  9. iometer使用教程linux,Iometer磁盘测试工具中文使用说明手册 二
  10. 人文社科课题中计算机知识的作用,人文社科类项目申请书模板.doc
  11. windows操作系统定时关机和取消定时关机命令
  12. 编辑器,在线编辑器,微信编辑器,公众号编辑器,UEditor编辑器
  13. 关于无线充电的三大标准和四种实现方式的介绍
  14. 应用程序开发选择工具应注重运行效率还是易用性
  15. 明天9:00 | ECCV 2022 全球博士TalK——计算机视觉领域顶会
  16. JAVA算法:三角形周长(JAVA版本算法)
  17. 操作系统笔记整理12——磁盘存储器的管理
  18. 学术期刊的 LaTeX整理合集(持续更新中)
  19. 《Eloquent JavaScript 3rd》笔记
  20. 一个很NB的数学绘图工具-geogebra

热门文章

  1. 平狄克微观经济学笔记和课后习题答案
  2. mysql将多行结果合并
  3. 新型红包套路,论推广和运营,灰产们真是一把好手
  4. win10计算机打开一直读进度条,win10开机读条后黑屏怎么办_win10开机读条之后黑屏修复方法-win7之家...
  5. openlayers绘制自定义点线面样式,带清除功能Vue版
  6. Windows 程式设计书籍
  7. 基于Matlab答题卡图像检测识别研究
  8. Delphi中的线程类--之(2)
  9. Vue 如何实现登录后,跳转到登录之前要访问的页面
  10. echarts做中国地图分布