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编程的更多相关文章

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

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

  2. python/socket编程之粘包

    python/socket编程之粘包 粘包 只有TCP有粘包现象,UDP永远不会粘包. 首先需要掌握一个socket收发消息的原理 发送端可以是1k,1k的发送数据而接受端的应用程序可以2k,2k的提 ...

  3. PYTHON SOCKET编程简介

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

  4. python socket编程笔记

    用python实现一个简单的socket网络聊天通讯 (Linux --py2.7平台与windows--py3.6平台) 人生苦短之我用Python篇(socket编程) python之路 sock ...

  5. [Python_7] Python Socket 编程

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

  6. Python Socket 编程示例 Echo Server

    简评:我们已经从「Python Socket 编程概览」了解了 socket API 的概述以及客户端和服务器的通信方式,接下来让我们创建第一个客户端和服务器,我们将从一个简单的实现开始,服务器将简单 ...

  7. Python Socket 编程——聊天室演示样例程序

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

  8. python socket编程入门(编写server实例)+send 与sendall的区别与使用方法

    python 编写server的步骤: 1. 第一步是创建socket对象.调用socket构造函数.如: socket = socket.socket( family, type ) family参 ...

  9. 第九章:Python高级编程-Python socket编程

    第九章:Python高级编程-Python socket编程 Python3高级核心技术97讲 笔记 9.1 弄懂HTTP.Socket.TCP这几个概念 Socket为我们封装好了协议 9.2 cl ...

  10. python socket编程详细介绍

    Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络 ...

随机推荐

  1. bzoj 2428 均分数据

    题目大意: 已知N个正整数 将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小 求最小均方差 思路: 模拟退火 #include<iostream> #include<c ...

  2. [JSOI 2016] 最佳团体

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4753 [算法] 很明显的分数规划 可以用树形动态规划(树形背包)检验答案 时间复杂度 ...

  3. swift中使用GCDMulticastDelegate

    在开源库XMPPFramework中提供了一个GCDMulticastDelegate类,使用它可以为一个对象添加多个被委托的对象,以前用oc编写的工程引入了这个类,使用起来十分方便.最近由于换了工作 ...

  4. [odb-users] query results not being cached?

    Burton, Craig crburton at tnsi.comWed Jun 6 13:58:03 EDT 2012 Previous message: [odb-users] query re ...

  5. bzoj1509

    树的直径 我先开始以为是个图,想想并不知道什么求图的直径的方法,结果是棵树 那么直觉告诉我们是在直径上面,实际上就是直径+min(i->u,i->v),扫一遍就行了 #include< ...

  6. springcloud 向Eureka中注册服务异常java.net.ConnectException: Connection refused: connect

    异常如下: 通过debug发现,服务端的url地址仍然是默认的http://localhost:8761/eureka/apps/,也就是说yml文件中配置没有生效,检查后发现yml中相关配置多写了一 ...

  7. UVaLive 6832 Bit String Reordering (模拟)

    题意:给定一个01序列,然后让你你最少的操作数把这它变成目标. 析:由于01必须是交替出现的,那么我们就算两次,然后取最值. 代码如下: #pragma comment(linker, "/ ...

  8. Objective-C NSObject与运行时系统

    创建: 2018/01/26 完成: 2018/02/02 遗留: TODO  NSObject  运行时系统 程序运行时候起作用的系统? NSObject是运行时系统的接口(API)  属性 只有一 ...

  9. Mybatis Generator插件升级版

    一.目的: 1. *mapper.java 文件名称 改为*DAO.java2. mapper以及mapper.xml 重复执行,只会覆盖原模板方法,不会覆盖自定义方法3. 实体类添加中文注释 二.步 ...

  10. 图片预览------photoswipe 使用

    photoswipe 使用 预览图片后,需要点击关闭按钮才能关闭,点击图片事件效果是放大图片,和微信的效果不一致,最后改用微信预览图片的接口了,但是例子可以用,记录一下!! http://www.cn ...