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. Mac下搭建react native开发环境

    安装必需软件 Homebrew Homebrew, Mac系统的包管理器,用于安装NodeJS和一些其他必需的工具软件. /usr/bin/ruby -e "$(curl -fsSL htt ...

  2. E20170616-hm

     transaction   n. 交易,业务,事务; 办理,处理; (一笔) 交易,(一项)事务; (学会等的) 会议记录,学报;  isolation   n. 隔离; 孤独; 隔离状态; 孤立状 ...

  3. 获取openid [微信小程序]

    public function wxapi(){ $data=$this->requestdata(); if(!$data['code']) exit(json_encode(array('s ...

  4. 字符类型C++(ascll码表)

    ascll码: 序号 字符 序号 字符 序号 字符 序号 字符 序号 字符 序号 字符 32 空格 48 0 64 @ 80 P 96 ` 112 p 33 ! 49 1 65 A 81 Q 97 a ...

  5. linux编译安装gcc5.3.0

    1.下载GCC5.3.0安装包 #su #cd /opt #wget http://ftp.gnu.org/gnu/gcc/gcc-5.3.0/gcc-5.3.0.tar.gz 2.解压 #.tar. ...

  6. [Qt及Qt Quick开发实战精解] 第1章 多文档编辑器

      这一章的例子是对<Qt Creator快速人门>基础应用篇各章节知识的综合应用, 也是一个规范的实例程序.之所以说其规范,是因为在这个程序中,我们对菜单什么时候可用/什么时候不可用.关 ...

  7. ACM_发工资(简单贪心)

    发工资咯: Time Limit: 2000/1000ms (Java/Others) Problem Description: 作为广财大的老师,最盼望的日子就是每月的8号了,因为这一天是发工资的日 ...

  8. Android 性能优化(22)*性能工具之「Hierarchy Viewer」 Hierarchy Viewer Walkthrough

    Hierarchy Viewer Walkthrough 1.In this document Prerequisites Setting the ANDROID_HVPROTO variable W ...

  9. Kali linux 2016.2(Rolling)安装之后的常用配置

    前言 使用默认的Kali Linux设置来学习是可以的,但是我们通常要修改系统的一些基本设置,来最大化使用Kali平台的功能. 以下内容 网络的基础知识 使用图形用户界面来配置网卡 使用命令行来配置网 ...

  10. Git学习笔记(2)-创建仓库

    一.Git简介 1.Git是什么 Git是分布式版本控制系统 2.Git有什么特点 (1)Git是分布式的SCM,SVN是集中式的 (2)Git每个历史版本存储完整的文件,SVN存储文件差异 (3)G ...