Python,socket编程
TCP协议 IP+端口
应用层协议做的事不同,但都离不开数据的交换,本质上都是收和发~
为什么要三次握手?
目标机器可能不存在,握手期间,发送方也可能down掉。
客户端————服务器,先发请求的那个是客户端,客户端发送的信息的端口是随机的。。服务器端的端口是固定的
先要有接收端,相当于服务器
接收端要申请端口号,服务要启动正常运行开始监听该端口
地址簇Socket Families
相当于网络层的一个东西
socket.AF_UNIX unix本机进程间通信
socket.AF_INET IPV4
socket.AF_INET6 IPV6
a进程和b进程想通信,没有网络的情况下。
a先dump,b再load。通过硬盘的话速度慢,默认在内存中a进程是不能访问b进程数据的,想快速通信可以借助AF_UNIX,本地启动一个socket在七层协议里转一圈
a进程传给b
Socket Types
socket.SOCK_STREAM #for tcp
socket.SOCK_DGRAM #for udp
socket.SOCK_RAW
#原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;
其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。
牛逼了可以伪造IP地址,DDOS攻击,洪水攻击,发送大量请求导致服务关闭
a访问b要三次握手,a发第一次,后a改自己的IP再发请求,b的回应到不了a
导致b端该连接出现挂起,a再改IP地址发请求..再挂起..
socket.SOCK_RDM
#是一种可靠的UDP形式,即保证交付数据报但不保证顺序。SOCK_RAM用来提供对原始协议的低级访问,
在需要执行某些特殊操作时使用,如发送ICMP报文。SOCK_RAM通常仅限于高级用户或管理员运行的程序使用。
socket.SOCK_SEQPACKET #废弃了
实例:先启动服务器监听端口,再启动客户端:
# 服务器
import socket server = socket.socket()
server.bind(("localhost",7000))#只是绑定要监听的端口
server.listen() #监听,我要监听这个端口
print("我开始监听7000端口了---")
conn,addr = server.accept() #等电话,conn就是连接实例,addr为源IP地址随机的 print("请求来了")
# data = server.recv(1024) #接收1024
# 通话中又来一个电话要切换,server.switch()要知道先后顺序,可以给每个请求标记就是上面的conn
data = conn.recv(1024)
print("recv:",data)
conn.send(data.upper())
server.close()
'''输出:
我开始监听7000端口了---
请求来了
recv: b'helloworld'
'''
#客户端
import socket client = socket.socket()
#声明socket类型,同时生成socket对象
#定义协议类型默认是family=AF_INET, type=SOCK_STREAM
client.connect(("localhost",7000))
client.send(b"helloworld")
data = client.recv(1024)
print("recv:", data)
client.close() #输出:recv: b'HELLOWORLD'
可以看出上面这种,客户端和服务器端说一句话就断了,那么我想不停地通信怎么办呢?????可以加上死循环
# 服务器
import socket server = socket.socket()
server.bind(("localhost",7000))
server.listen()
print("我开始监听7000端口了---")
conn,addr = server.accept()
print("请求来了") while True:
data = conn.recv(1024)
print("recv:",data)
conn.send(data.upper())
server.close()
#客户端
import socket client = socket.socket()
client.connect(("localhost",7000))
while True:
msg = input(">>:").strip()
client.send(msg.encode("utf8"))
data = client.recv(1024)
print("recv:", data.decode())
client.close()
perfect~~~试了几次之后。。。
又发现一个问题:客户端断了服务器端为什么也断了?
Windows服务器出错:ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。
Linux服务器:会进入进入死循环,recv不到数据(recv到""空),可以服务器端判断data接收的是否为空,是空break死循环
那么请问,该如何让某一个客户端断了之后其他客户端可以继续连接呢?
先试试。。可以再在conn上加一层死循环
,加了之后Windows还是报10054的错误,Linux里面只能一个通话,另一个占线(挂起),上一个断开了才能跟挂起的那个通话
后面排着队,上一个结束到下一个,异步的情况下listen(3)里面可以给数字,表示最多挂起几个,。一般不要超过10个
客户端如果发一个空过去(直接回车),就卡死了,怎么回事呢?是服务器没收到还是什么呢?
所以不能send空,不能send空,不能send空,重要的事说三遍。。。所以就要在客户端判断一下
那么可以把客户端模拟成SSH呢?
服务器端搞成os.popen().read()就可以了,如果某命令执行结果超过1024byte,客户端还在继续发命令。。那么服务器端还是会不停执行
但客户端每次只能接收1024字节,数据全存在缓冲区排队了
那么,让客户端一次能接收很大的数据会怎样呢???
发一个大文件,虽然客户端一次可以接很大,但是服务器端每次只能发32768,依据操作系统而定,so
让客户端全发,循环发sendall()会怎样呢?
但是神奇了,客户端接收开始有限制了,好像每次最多10M,依系统区别这个也有区别(在centos上试的,而有的系统还会出错)
so...看来。。。没办法一次收过来,带宽有限制,网卡也有限制。。recieve有限制的,send也有限制的。
Python,socket编程的更多相关文章
- Python Socket 编程——聊天室示例程序
上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...
- python/socket编程之粘包
python/socket编程之粘包 粘包 只有TCP有粘包现象,UDP永远不会粘包. 首先需要掌握一个socket收发消息的原理 发送端可以是1k,1k的发送数据而接受端的应用程序可以2k,2k的提 ...
- 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 ...
- python socket编程详细介绍
Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络 ...
随机推荐
- 【Silverlight】Bing Maps学习系列(一):开发前的准备工作
[Silverlight]Bing Maps学习系列(一):开发前的准备工作 微软推出的Bing Maps地图引擎,对外开放了Silverlight和Ajax两种客户端API,同时微软针对全球地图还推 ...
- Rails5 任务注释
任务注释 格式 # TODO: ... # FIXME: ... # OPTIMIZE ... 查看 rails notes 个别查看 rails notes:todo rail ...
- Rails 插入代码与注释
醉了醉了,在原来那个表格最后加了然后更新博客,然后最后写的内容就没了.来来回回试了n次都一样.不得已新开一个 插入代码 <% ... %> 打印值 <%= ... %&g ...
- codehunter 「Adera 6」杯省选模拟赛 网络升级 【树形dp】
直接抄ppt好了--来自lyd 注意只用对根判断是否哟留下儿子 #include<iostream> #include<cstdio> using namespace std; ...
- bzoj 2726: [SDOI2012]任务安排【cdq+斜率优化】
cdq复健.jpg 首先列个n方递推,设sf是f的前缀和,st是t的前缀和: \[ f[i]=min(f[j]+s*(sf[n]-sf[j])+st[i]*(sf[i]-sf[j])) \] 然后移项 ...
- bzoj 1637: [Usaco2007 Mar]Balanced Lineup【瞎搞】
我是怎么想出来的-- 把种族为0的都变成-1,按位置x排升序之后,s[i]表示种族前缀和,想要取(l,r)的话就要\( s[r]-s[l-1]==0 s[r]==s[l-1] \),用一个map存每个 ...
- sql server 大数据处理
对SQL Server数据表进行分区的过程分为三个步骤: 1)建立分区函数 2)建立分区方案 3)对表格进行分区 第一个步骤:建立分区函数 分区函数定义[u]how[/u],即你想要SQL Serve ...
- lnmp环境的nginx的tp5配置
php7.1 server { listen 80; server_name www.tp5.com; access_log /home/wwwroot/access.log combined; er ...
- 树形DP UVA 1292 Strategic game
题目传送门 /* 题解:选择一个点,它相邻的点都当做被选择,问最少选择多少点将所有点都被选择 树形DP:dp[i][0/1]表示当前点选或不选,如果选,相邻的点可选可不选,取最小值 */ /***** ...
- HTML DOM getElementById() 方法
定义和用法 getElementById() 方法可返回对拥有指定 ID 的第一个对象的引用. 语法 document.getElementById(id) 说明 HTML DOM 定义了多种查找元素 ...