端口

在linux系统中,有65536(2的16次方)个端口,分为:

知名端口(Well Known Ports):0-1023,如80端口分配给HTTP服务,21端口分配给FTP服务。

动态端口(Dynamic Ports):1024-65535,一般不固定分配某种服务,而是动态分配。

IP地址

每一个IP地址包括两部分:网络地址和主机地址

A类地址范围:1.0.0.1-126.255.255.254

B类地址范围:128.1.0.1-191.255.255.254

C类地址范围:192.0.1.1-223.255.255.254(常用)

D类地址用于多点广播

E类地址保留,仅作实验和开发用

IP地址127.0.0.1~127.255.255.255用于回路测试

socket

socket(简称套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的。

套接字使用流程:

  1. 创建套接字
  2. 使用套接字收/发数据
  3. 关闭套接字
import socket

# 创建udp的套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 创建tcp的套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# ...这里是使用套接字的功能(省略)...
# 不用的时候,关闭套接字
udp_socket.close()
tcp_socket.close()

UDP(User Datagram Protocol)

中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议。

创建一个基于udp的网络程序流程很简单,具体步骤如下:

  1. 创建[socket()]客户端套接字
  2. 发送[sendto()]/接收[recvfrom()]数据
  3. 关闭[close()]套接字

UDP发送(客户端):

import socket

# 1. 创建udp套接字
udp_socket = socket(AF_INET, SOCK_DGRAM) # 2. 准备接收方的地址
# '192.168.1.103'表示目的ip地址
# 8080表示目的端口
dest_addr = ('192.168.1.103', 8080) # 注意 是元组,ip是字符串,端口是数字 # 3. 从键盘获取数据
send_data = input("请输入要发送的数据:") # 4. 发送数据到指定的电脑上的指定程序中
udp_socket.sendto(send_data.encode('utf-8'), dest_addr) # 5. 关闭套接字
udp_socket.close()

UDP接收(服务端):

import socket

# 1. 创建udp套接字
udp_socket = socket(AF_INET, SOCK_DGRAM) # 2. 绑定IP和端口
udp_socket.bind('',7788) # 3. 等待接收对方发送的数据
recv_data = udp_socket.recvfrom(1024) # 1024表示本次接收的最大字节数 # 4. 显示对方发送的数据
# 接收到的数据recv_data是一个元组
# 第1个元素是对方发送的数据,需要使用发送时的字符集进行decode解码
# 第2个元素是对方的ip和端口
print(recv_data[0].decode('utf-8'))
print(recv_data[1]) # 5. 关闭套接字
udp_socket.close()

使用socket连接阿里云服务器

客户端在window10本地,服务端在阿里云服务器上,让他们能够通信这里需要注意三点(前提是本地机器能够ping通阿里云服务器的公网IP):

1、服务端绑定的IP地址需要为阿里云服务器的私有IP地址,即ifconfig中的ip,或者绑定时ip地址给空字符串'',这样也会默认绑定私有IP

2、客户端连接的IP地址需要为阿里云服务器的公网IP地址,不能为私有IP。

3、在阿里云控制台的安全组中需要开启相应的协议和端口权限,不然无法连接进阿里云服务器,协议为此次连接的协议,端口为服务器绑定的端口,授权对象为客户端的IP或者0.0.0.0/0表示所有IP都可访问

TCP(Transmission Control Protocol)

中文名是传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。

TCP特点

1. 面向连接

通信双方必须先建立连接才能进行数据的传输,双方都必须为该连接分配必要的系统内核资源,以管理连接的状态和连接上的传输。

双方间的数据传输都可以通过这一个连接进行。

完成数据交换后,双方必须断开此连接,以释放系统资源。

这种连接是一对一的,因此TCP不适用于广播的应用程序,基于广播的应用程序请使用UDP协议。

2. 可靠传输

1)TCP采用发送应答机制

TCP发送的每个报文段都必须得到接收方的应答才认为这个TCP报文段传输成功

2)超时重传

发送端发出一个报文段之后就启动定时器,如果在定时时间内没有收到应答就重新发送这个报文段。

TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。

3)错误校验

TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。

4) 流量控制和阻塞管理

流量控制用来避免主机发送得过快而使接收方来不及完全收下。

TCP与UDP的不同点

  • 面向连接(确认有创建三方交握,连接已创建才作传输。)
  • 有序数据传输
  • 重发丢失的数据包
  • 舍弃重复的数据包
  • 无差错的数据传输
  • 阻塞/流量控制

TCP编程

客户端:

  1. 创建[socket()]客户端套接字
  2. 连接[connect()]服务器
  3. 发送[send()]数据
  4. 接收[recv()]返回的数据
  5. 关闭[close()]套接字
import socket

def main():
# 创建套接字
tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置服务器地址
server_addr = ('xxx.xxx.xxx', 7890) # 阿里云服务器公网IP
# 创建连接
tcp_client.connect(server_addr)
while True:
# 获取发送的数据
send_data = input('请输入发送的数据(exit退出):\n')
if send_data == 'exit':
break
tcp_client.send(send_data.encode('utf-8'))
# 接收服务端返回的数据
recv_data = tcp_client.recv(1024)
print('返回数据为:\n', recv_data.decode('utf-8'))
tcp_client.close() if __name__ == '__main__':
main()

服务端:

  1. 创建[socket()]服务端套接字
  2. 绑定[bind()]IP和端口
  3. 监听[listen()]将套接字变为可以被动链接
  4. 等待[accept()]客户端的连接,返回新的服务套接字服务于该客户端
  5. 新的服务套接字接收[recv()]数据
  6. 给客户端返回[send()]数据
  7. 关闭[close()]新的服务套接字
  8. 关闭[close()]监听的服务套接字
import socket

def client_server(client_socket):
while True:
# 接收数据
recv_data = client_socket.recv(1024)
if not recv_data:
# 关闭服务套接字
client_socket.close()
break
print('接收的数据为:', recv_data.decode('utf-8'))
# 返回数据
client_socket.send('已接收'.encode('utf-8')) def main():
# tcp创建套接字
tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定端口
local_addr = ('', 7890)
tcp_server.bind(local_addr)
# 使用listen将其变为被动
tcp_server.listen(128)
while True:
print('准备接收连接.....')
# 等待客户端连接,若有新客户端连接,返回一个新的套接字专门服务这个客户端
client_socket, client_addr = tcp_server.accept()
print('接收到连接,IP:%s PORT:%s' % (client_addr[0], client_addr[1]))
client_server(client_socket) # 关闭监听的套接字
tcp_server.close()
if __name__ == '__main__':
main()

python-socket网络编程笔记(UDP+TCP)的更多相关文章

  1. Python Socket 网络编程

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...

  2. Python Socket 网络编程 (客户端的编程)

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...

  3. Python Socket网络编程详解

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

  4. 25 python socket网络编程

    一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务端为你提供视频 ...

  5. Python - Socket网络编程 - 第二十六天

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

  6. python 之 网络编程(基于TCP协议的套接字通信操作)

    第八章网络编程 8.1 基于TCP协议的套接字通信 服务端套接字函数 s.bind() 绑定(主机,端口号)到套接字 s.listen() 开始TCP监听 s.accept() 被动接受TCP客户的连 ...

  7. python 之网络编程(基于TCP协议Socket通信的粘包问题及解决)

    8.4 粘包问题 粘包问题发生的原因: 1.发送端需要等缓冲区满才发送出去,造成粘包(发送数据时间间隔很短,数据了很小,会合到一起,产生粘包),这样接收端,就难于分辨出来了,必须提供科学的拆包机制. ...

  8. python——socket网络编程

    一.OSI七层模型

  9. python socket网络编程之粘包问题详解

    一,粘包问题详情 1,只有TCP有粘包现象,UDP永远不会粘包 你的程序实际上无权直接操作网卡的,你操作网卡都是通过操作系统给用户程序暴露出来的接口,那每次你的程序要给远程发数据时,其实是先把数据从用 ...

随机推荐

  1. python0.1

    python基础 python是一种高级编程语言,而编程语言分为3种 编程语言 编程语言是一种人与计算机沟通的工具. 编程就是就将人的需求通过攥写编程语言命令计算机完成指令. 编程的意义在于将人类的生 ...

  2. Redis系列(六):数据结构List双向链表LPUSH、LPOP、RPUSH、RPOP、LLEN命令

    1.介绍 redis中的list既实现了栈(先进后出)又实现了队列(先进先出) 1.示意图 2.各命令详解 LPUSH/RPUSH LPUSH: 从队列的左边入队一个或多个元素 将所有指定的值插入到存 ...

  3. 自定义Springboot全局异常类

    一.简要说明 如何实现网上文章基本是随便一搜就可以很快找到, 这里不再赘述. 二.Spring-web和Spring-webmvc 通过idea查看到两个注解位于 spring-web-5.2.2.R ...

  4. Javascript中的"函数是第一类对象(first-class object)"

    本身这句话很好解释,函数有两个主要特点,援引自 陈新 译的<JavaScript模式>: 1.函数是第一类对象: 函数可以在运行时动态创建,还可以在程序执行过程中创建. 函数可以分配变量, ...

  5. python之浅谈编程语言

    一.编程语言的分类 机器语言(低级语言) 可以直接和硬件交互,用0和1和计算机沟通 优点:执行效率高(因为可以直接和计算机沟通) 缺点:开发效率低(都是用0和1进行编码) 汇编语言 同样可以直接和硬件 ...

  6. 半导体质量管理_SQM 供应商质量管理

    供应链上的质量保证 SPACE的此附加组件可帮助您与全球生产现场的供应商和分包商更紧密地合作.基于电子分析证书(eCOA,电子分析证书),您可以为整个供应链实施具有约束力的质量标准,并可以对其进行验证 ...

  7. pdf流文件转图片

    需求:将后台返回的pdf流文件转换成图片与页面其他内容一起打印pdf流文件不能直接在前台显示,需要借助pdf.js+viewer.js. 一般情况下,如果要打印pdf流文件,可以直接在新打开的view ...

  8. vue页面原样导出excel表格

    github地址:https://github.com/wuzhiaite/vue-samples 1.excel导出 做过业务系统的知道,进行涉及到excel的导出,列表数据动则几十万,但是也有一部 ...

  9. 列拖拽顺序调整-sortable.js使用

    最近在做一个单表统计功能,涉及到一个查询列配置,但是查询出来的列顺序,可以进行配置,通过写列的排序当然阔以,但是方法就不美丽了.所以,在网上搜了一下拖拽的组件,最终定位Sortable.js,简单易用 ...

  10. Python——格式化GMT时间

    1.背景 最近在做视频上传去获取大小.时间的功能,视频是存在金山云的,由于金山sdk接口用例执行后返回的结果中的时间是http头部时间,时间格式为‘Tue, 08 May 2018 06:17:00 ...