python学习 网络编程--socket

网络通信标准---网络协议
互联网协议--osi七层协议
五层协议:应用层:应用层、表示层、会话层
          传输层:传输层
    网络层:网络层
    数据链路层:数据链路层
    物理层:物理层
物理层就是用来发送电信号的
数据链路层跑协议,分组标准。 ethernet以太网协议,规定电信号如何分组
电信号拿来后是一堆数据,只要规定了怎么分组才能拿到正确数据
ethernet规定
一组电信号构成一个数据报,叫做帧
每一数据帧分成:报头head和数据data两部分
但凡接入互联网必须要有网卡
每个网卡出厂都有自己的MAC地址   前六位厂商地址后几位自己地址
MAC是全世界独一无二的
以通讯角度来说,以太网协议有物理层和数据链路层已经可以实现通讯了
以太网有广播的工作方式
广播包只能在局域网里面传,要不数据量太大会造成网络的故障
网络层---ip协议  ipv4/ipv6
ip数据包也分成head和data部分 ip头的意思和以太网差不多
ip地址和ip子网掩码中间的运算得出一个地址,是网段地址
按位与运算   两个同时是1才是1  二进制的ip地址和子网掩码进行计算
按照这个网段地址找到范围,然后再找到这个机器
ipv4/ipv6网关是用来帮助跨过子网的关口
跨子网,要用网关和网关进行通讯
用以太网的广播方式将数据交给网关,但是得先获得网关的MAC地址
但是我们知道的只有网关的IP地址
所以需要ARP协议,局域网内,用IP地址解析成MAC地址。这样用网关的IP地址获取MAC地址
才能将数据交给网关
如果发送端主机发送了目标MAC地址为FF.FF.FF.FF.FF.FF那么它就知道发送端需要获取MAC
但是接受数据的主机不知道是不是向它要MAC地址,所以还需要发送一个IP地址,让他知道是自己需要的
ARP协议里面的
同一子网地址内都用以太网的广播方式
IP地址和MAC地址可以确定一个机器在什么位置

-------------------------------------------------------------------------------------------------------------------------------------------

传输层跑两种协议:tcp协议和udp协议得到端口    确定要传输的是这个机器的哪个软件
ip加端口确定了全世界独一无二的软件
软件用机器的哪个端口,65536个端口前1024是操作系统用,后面全是自己的软件用
应用层:httpp ftp mai  协议   可以自己定协议
数据前一般都要加头  然后是数据
DHCP :自动分配IP地址
DNS:域名服务   将网址域名地址解析成IP地址
tcp协议:
建立双向连接,用来进行数据的交互相互发送。
工作方式:c传给s一个请求,然后s再发送一个确认和一个请求,然后c再发送一个确认
所以一共发送了三次,三次握手
为了确认是否以我发送的那个数据,你俩进行回应,所以我的数据要加一个序列
如果你发送回来的时候我的序列+1证明是用我的数据进行回应
tcp协议又称为可靠协议,发送完包一定要等待对方确认收到了我的包进行了回应,才算发成功
如果没有回应过一段时间再发一次,所以是可靠协议。
可靠在发送完数据并不清空内存,直到对方回应确认收到后才收到
udp协议不用建立连接,被称为不可靠协议,发送完数据就清空内存,不等对方的确认信息。
tcp有断开连接,udp没有
谁最后确认数据收到谁先断,四次挥手断链接

------------------------------------------------------------------------------------------------------------------------------------

socket编程:
应用层与运输层之间多了一个socket抽象层
将传输协议都封装好直接用
基于应用层与传输层之间的抽象层
用基于网络的套接字:AF——INET
服务器端:先初始化socket(),然后与端口绑定bind()服务端的固定地址,对端口进行监听listen()看谁来链接了
accept()阻塞直到有客户端链接  和connect()组成一队进行链接

import socket
socket.socket(socket.AF_INET,socket.SOCK_STREAM)
服务端:
import socket
#买手机
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)   打开了这个服务端最后要关闭
#绑定手机卡
phone.bind((‘127.0.0.1‘,8080))#127.0.0.1指的就是自己这台机器的IP地址
#开机
phone.listen(5)#5代表最大挂起的链接数
#等电话链接
conn,addr=phone.accept()       等待建立链接accept()等待建立
print(‘客户端IP:%s,客户端端口:%s‘%(addr[0],addr[1]))
data=conn.recv(1024)  #最大收1024       recv()接受数据,括号内最大接收量
print(data.decode(‘utf-8‘))
conn.send(data.upper())      send()发送数据
#6、挂电话
conn.close()           建立的链接要关闭
#7.关机
phone.close()

客户端:
import socket
#买手机
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)  一样打开这个端口
#绑定手机卡   客户端没必要绑定所以不用了
#开机  也不用监听了

phone.connect((‘127.0.0.1‘,8080))    主动建立链接,前面IP地址后面是端口
phone.send(‘hello‘.encode(‘utf-8‘))  发送数据

data=phone.recv(1024)
print(data.decode(‘utf-8‘))
#关机
phone.close()          同样要关机

持续性数据的交互,还有排队的进行链接:
服务端:
import socket
#买手机
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#绑定手机卡
phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
phone.bind((‘192.168.11.52‘,8080))#127.0.0.1指的就是自己这台机器的IP地址
#开机
phone.listen(5)#5代表最大挂起的链接数
#等电话链接
print(‘starting...‘)
while True:   #链接循环
    conn,addr=phone.accept()
    print(‘客户端IP:%s,客户端端口:%s‘%(addr[0],addr[1]))
    while True:            #通信循环
        try:                  #用到try是因为有时候会发生但无法预知的错误
            data=conn.recv(1024)  #最大收1024
            if not data:break  #针对linux
            print(data.decode(‘utf-8‘))
            conn.send(data.upper())
        except ConnectionResetError:
            break
#6、挂电话
        conn.close()       #断开连接
#7.关机
phone.close()

客户端:

import socket
#买手机
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#绑定手机卡   客户端没必要绑定所以不用了
#开机  也不用监听了
#等电话链接
phone.connect((‘192.168.11.52‘,8080))
while True:
    msg=input(‘请输入:‘).strip()
    phone.send(msg.encode(‘utf-8‘))
    data=phone.recv(1024)
    print(data.decode(‘utf-8‘))
#关机
phone.close()

客户端向服务端发送空消息的话   服务端的接收会卡住

时间: 2024-10-10 16:07:32

python学习 网络编程--socket的相关文章

Python学习---网络编程 1217[all]

OSI七层模型: 物理层, 数据链路层, 网络层,传输层,会话层,表达层,应用层 应用层:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等 传输层:TCP,UDP 网络层:IP,ICMP,OSPF,EIGRP,IGMP 数据链路层:SLIP,CSLIP,PPP,MTU [图片来自网络] 网络通信要素: A:IP地址    (1) 用来标识网络上一台独立的主机 (2) IP地址 = 网络地址 + 主机地址(网络号:用于识别主机所在的网络/网段.主机号:用于识别该网络中的主

Python 之 网络编程——SOCKET开发

一.预备知识 对于我们,主要掌握5层协议就行. 物理层: 转成二进制数序列数据链路层: 形成统一的协议:Internet协议 包括数据头(18个字节,前6个字节原地址,中间6个字节为目标地址,后6个字节为数据的描述)和数据网络层: 有IP协议,包括IP头和数据传输层: 包括tcp.UDP两个协议:基于端口(0-65535)的协议应用层: 包括http.ftp协议 TCP协议:流式协议,先把管道修好 客户端   服务端 C-------------------------------->S   <

python学习-网络编程

socket socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯. socket 与 file 的却别: file 是对指定文件进行打开,读写,关闭 socket 是对服务器和客户端的 socket 进行打开,读写,关闭 一.socket 客户端与服务器交互流程 简单实例 服务端将客户端发送的字符串转成大写后再返回给客户端 import socket sk = socket.socket()

Python的网络编程 Socket编程

Socket是进程间通信的一种方式,与其他进程间通信的一个主要不同是:能实现不同主机间的进程间通信,网络上各种各样的服务大多都是基于Socket来完成通信的,要解决网络上两台主机间的通信问题,首先要唯一标识该进程,在TCP/IP网络协议中,就是通过(IP地址,协议,端口号)三元组来标识进程的,解决了进程标识问题,就有了通信的基础了 TCP是一种面向连接的传输层协议,TCP Socket是基于一种Client-Server的编程模型,服务端监听客户端的连接请求,一旦建立连接即可以进行传输数据,那么

Python之网络编程 Socket编程

本节内容: Socket语法及相关 SocketServer实现多并发 Socket语法及相关 socket概念 socket本质上就是在2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实现数据的互相传递. 我们知道网络 通信 都 是基于 ip+port 方能定位到目标的具体机器上的具体服务,操作系统有0-65535个端口,每个端口都可以独立对外提供服务,如果 把一个公司比做一台电脑 ,那公司的总机号码就相当于ip地址, 每个员工的分机号就相当于端口, 你想找公司某个人,必须 先打电

Python的网络编程socket

(1)利用socket进行简单的链接 Python里面的socket支持UDP.TCP.以及进程间的通信,socket可以把我们想要发送的东西封装起来,发送过去,然后反解成原来的样子,事实上网路通信可以理解成都是建立在socket之上,下面的代码是演示利用socket进行简单的链接 #要成一次通信,至少要有两个人,也就是一个服务端,一个客户端 #服务端 '''必须先开启着,等待客户端来进行链接请求, 所以自己要先有个地址,也就是IP,也要现有自己的端口,没有端口进不去''' import soc

Python之网络编程 socket补充

1 文件上传 客户端 import socket import os import json import struct FILE_PATH = os.path.join(os.path.dirname(__file__), 'demo.mp4') def socket_client(): client = socket.socket() client.connect(('127.0.0.1',8848)) # 1.制作字典形式的报头 head_dic = { 'MD5': 1232445466

python学习 网络编程--主机命令执行

import osos.system()执行系统命令只能执行命令不能返回值import subprocess  能执行系统命令res=subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)第一个参数是执行命令的字符串形式,第二个是shell=True代表使用命令解释器PIPE是subprocess提供的一个功能,管道.可以让结果不打印存在管道里面print(res.stdout.read()

python学习1:socket模块(TCP/IP网络编程)

本文只关心python的网络编程,并重点学习TCP/IP单元. 一.简单了解下: 1.什么是TCP/IP.UDP? TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的.         UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议.它是属于TCP/IP协议族中的一种.        这里有一张图,表明了这些协议的关系.