什么是⽹络

  网络能把双方或多方连在一起的工具,即把数据从一方传递到另一方进行数据传递。

  网络编程就是不同电脑上的软件能够进行数据传递。即进程间的通讯。

什么是TCP/IP协议

  协议就是大家一起遵守的约定。

  计算机都遵守的⽹络通信协议叫做 TCP/IP协议

OSI七层协议 

  互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层

什么是IP

  某个电脑在网络中的具体位置

  ⽤来在⽹络中标记⼀台电脑的⼀串数字,⽐如192.168.1.1;在本地 局域⽹上是惟⼀的。

什么是端口

  在计算机中端口就是某个程序的具体位置

   端⼝是通过端⼝号来标记的,端⼝号只有整数,范围是从0到65535

.什么是socket

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

 socket层

  Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

  所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。

Socket套接字工作流程

  服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束

tcp三次握⼿ -------建立连接

tcp四次挥⼿接-------断开连接

TCP十种状态

TCP通信的完整通讯过程,如下图:

基于socket服务端客户端代码

服务端代码

 # -*- coding: utf-8 -*-

 # 声明字符编码
# coding:utf-8
import socket # 创建服务端套接字
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 这个配置是防止客户端直接关闭,服务器再次启动报错。(原因是TCP的四次挥手未完成。)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 绑定IP及端口
server.bind(('', 7777))
# 设置监听最多10个客户端
server.listen(10) def socket_server():
while True:
# 等待客户端的连接,返回客户端套接字和客户端信息
client_socket, client_info = server.accept()
while True:
try:
# 等待接收客户端发来的消息
client_msg = client_socket.recv(1024)
print("%s:%s" % (client_info, client_msg.decode('utf-8')))
# 给客户端发消息
client_socket.send("服务器收到了".encode("utf-8"))
except Exception as e:
print("%s 未正常断开", client_info)
print(e)
break
# 关闭套接字
client_socket.close()
server.close() if __name__ == "__main__":
socket_server()

客户端代码

 # -*- coding: utf-8 -*-

 # 声明字符编码
# coding:utf-8 import socket # 创建客户端socket 套接字
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接服务器
client.connect(('172.16.6.5', 7777)) def socket_client():
while True:
send_msg = input(">>")
# 向服务器发送消息
client.send(send_msg.encode("utf-8"))
# 等待服务器回消息
server_msg = client.recv(1024)
print("<< %s" % server_msg.decode('utf-8'))
# 关闭连接
client.close() if __name__ == "__main__":
socket_client()

socket通讯基本方法总结

  服务端套接字函数
    s.bind() 绑定(主机,端口号)到套接字
    s.listen() 开始TCP监听
    s.accept() 被动接受TCP客户的连接,(阻塞式)等待连接的到来   客户端套接字函数
    s.connect() 主动初始化TCP服务器连接
    s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常   公共用途的套接字函数
    s.recv() 接收TCP数据
    s.send() 发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
    s.sendall() 发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
    s.recvfrom() 接收UDP数据
    s.sendto() 发送UDP数据
    s.getpeername() 连接到当前套接字的远端的地址
    s.getsockname() 当前套接字的地址
    s.getsockopt() 返回指定套接字的参数
    s.setsockopt() 设置指定套接字的参数
    s.close() 关闭套接字   面向锁的套接字方法
    s.setblocking() 设置套接字的阻塞与非阻塞模式
    s.settimeout() 设置阻塞套接字操作的超时时间
    s.gettimeout() 得到阻塞套接字操作的超时时间   面向文件的套接字的函数
    s.fileno() 套接字的文件描述符
    s.makefile() 创建一个与该套接字相关的文件

什么是UDP?

  UDP是⼀种⾯向⽆连接的协议,每个数据报都是⼀个独⽴的信息,包括完整 的源地址或⽬的地址,它在⽹络上以任何可能的路径传往⽬的地,因此能否 到达⽬的地,到达⽬的地的时间以及内容的正确性都是不能被保证的。

  UDP通信时不需要建⽴连接,数据的传输⾃然是不可靠 的,UDP⼀般⽤于多点通信和实时的数据业务,⽐如 语⾳⼴播 视频 QQ TFTP(简单⽂件传送) SNMP(简单⽹络管理协议) RIP(路由信息协议,如报告股票市场,航空信息)

  DNS(域名解释

  创建⼀个udp客户端程序的流程是简单,具体步骤如下:

UDP服务端

 # -*- coding: utf-8 -*-

 # 声明字符编码
# coding:utf-8 import socket def udp_server():
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) server.bind(('', 8888))
while True:
server_msg, client_info = server.recvfrom() print('%s << %s' % (client_info, server_msg.decode('utf-8')))
msg = input('>>')
server.sendto(msg.encode('utf-8'), client_info) if __name__ == "__main__":
udp_server()

UDP客户端

 # -*- coding: utf-8 -*-

 # 声明字符编码
# coding:utf-8 import socket def udp_client():
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while True:
msg = input('>>')
client.sendto(msg.encode('utf-8'), ('127.0.0.1', 8888))
server_msg, server_info = client.recvfrom()
print('%s << %s' % (server_info, server_msg.decode('utf-8'))) if __name__ == "__main__":
udp_client()

udp总结

  1. udp是TCP/IP协议族中的⼀种协议能够完成不 同机器上的程序间的数据通信

  2. udp服务器、客户端 udp的服务器和客户端的区分:

    往往是通过 请求服务 和 提供服务 来进⾏ 区分 请求服务的⼀⽅称为:客户端 提供服务的⼀⽅称为:服务器

  3. udp绑定问题

    ⼀般情况下,服务器端,需要绑定端⼝,⽬的是为了让其他的客户端能 够正确发送到此进程 客户端,⼀般不需要绑定,⽽是让操作系统随机分配,这样就不会因为 需要绑定的端⼝被占⽤⽽导致程序⽆法运⾏的情况

Python学习笔记【第十三篇】:Python网络编程一Socket基础的更多相关文章

  1. Python 学习笔记(十三)Python函数(二)

    参数和变量 >>> def foo(a,b): #函数是一个对象 return a+b >>> p =foo #对象赋值语句.将foo函数赋值给p这个变量 > ...

  2. Python 学习笔记(十三)Python函数(一)

    函数基础 函数:函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.Python提供了许多内建函数,比如print().可以自己创建函数,这 ...

  3. python学习笔记(十八)网络编程之requests模块

    上篇博客中我们使用python自带的urllib模块去请求一个网站,或者接口,但是urllib模块太麻烦了,传参数的话,都得是bytes类型,返回数据也是bytes类型,还得解码,想直接把返回结果拿出 ...

  4. Python学习笔记(十三)

    Python学习笔记(十三): 模块 包 if name == main 软件目录结构规范 作业-ATM+购物商城程序 1. 模块 1. 模块导入方法 import 语句 import module1 ...

  5. openresty 学习笔记番外篇:python的一些扩展库

    openresty 学习笔记番外篇:python的一些扩展库 要写一个可以使用的python程序还需要比如日志输出,读取配置文件,作为守护进程运行等 读取配置文件 使用自带的ConfigParser模 ...

  6. openresty 学习笔记番外篇:python访问RabbitMQ消息队列

    openresty 学习笔记番外篇:python访问RabbitMQ消息队列 python使用pika扩展库操作RabbitMQ的流程梳理. 客户端连接到消息队列服务器,打开一个channel. 客户 ...

  7. python学习笔记:安装boost python库以及使用boost.python库封装

    学习是一个累积的过程.在这个过程中,我们不仅要学习新的知识,还需要将以前学到的知识进行回顾总结. 前面讲述了Python使用ctypes直接调用动态库和使用Python的C语言API封装C函数, C+ ...

  8. [Python学习笔记][第七章Python文件操作]

    2016/1/30学习内容 第七章 Python文件操作 文本文件 文本文件存储的是常规字符串,通常每行以换行符'\n'结尾. 二进制文件 二进制文件把对象内容以字节串(bytes)进行存储,无法用笔 ...

  9. [Python学习笔记][第五章Python函数设计与使用]

    2016/1/29学习内容 第四章 Python函数设计与使用 之前的几页忘记保存了 很伤心 变量作用域 -一个变量已在函数外定义,如果在函数内需要修改这个变量的值,并将这个赋值结果反映到函数之外,可 ...

随机推荐

  1. Vue.js 入门教程

    Vue.js 入门教程:https://cn.vuejs.org/v2/guide/index.html

  2. python networkx:绘制网络图

    1.简单使用 import networkx as nx import matplotlib.pyplot as plt G = nx.Graph() G.add_edge(1,2) nx.draw_ ...

  3. Web开发的小知识点

    ServletConfig:用于读取配置文件信息 ServletContext:这是一个容器,代表一个web应用程序,多个Servlet可以通过这个容器共享数据信息(注意:这样的数据共享有线程安全问题 ...

  4. A能ping通B,BpingA请求超时

    除了防火墙等,杀毒软件都已经关了: A是外网,B是内网,A有两个ip地址,请ping A 的内网地址.

  5. jquery 3.4.0

    jQuery 3.4.0 的更新内容主要是错误修复和功能改进,列举部分如下: 针对 .width 和 .height 的性能改进 支持 nonce 和 nomodule 针对 Radio 元素新增事件 ...

  6. 关于管理,你可能一直有 3 个误解zz

    很多管理者认为,下属绩效低是由于其能力不行.其实,下属的绩效是由管理者决定的.一个好的管理者,必须对管理有正确的认知,才能形成有效的管理行为,让下属拥有绩效,并获得成长.来源丨春暖花开(ID:CCH_ ...

  7. 设置tableView的组的头视图的高度

    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return 1 ...

  8. [swarthmore cs75] Lab 0 Warmup & Basic OCaml

    课程回顾 Swarthmore学院16年开的编译系统课,总共10次大作业.本随笔记录了相关的课堂笔记以及第1次大作业. 什么是编译 编译就是执行Program->Program'转换的过程,如下 ...

  9. Android逆向破解表单登录程序

    Android逆向破解表单登录程序 Android开发 ADT: android studio(as) 程序界面如下,登录成功时弹出通知登录成功,登录失败时弹出通知登录失败. 布局代码 <?xm ...

  10. SVM探讨

    目录 SVM探讨 SVM算法 硬间隔最大化的优化目标 软间隔最大化 SVM探讨 SVM算法 根据处理问题的复杂度,SVM 可由简到繁分为三种: 线性可分支持向量机:硬间隔最大化. 线性支持向量机:数据 ...