一、复习
1、网络编程
软件开发架构
b/s架构
c/s架构
本质都是c/s架构
2、互联网协议
OSI七层协议
应用层
表示层
会话层
传输层
网络层
数据链路层
物理连接层
3、 物理连接层:建立物理连接传输电信号
数据链路层(以太网协议)
规定了电信号的分组方式
任何接入互联网的计算机都必须有一块网卡(有一个独一无二的编号:mac地址)
交换机:基于以太网通信特点:靠吼(一旦同时有好多电脑发送请求,交换机吼的话就会产生广播风暴)
网络层(ip协议):
规定了任何接入互联网的一台计算机都必须有一个ip地址(点分十进制)
传输层(TCP,UDP)
tcp,udp基于端口工作的协议
端口范围:0~65535
端口:能够标识一台计算机上某一时刻运行的某一款应用程序
ip+port就能够标识世界上唯一一台计算机上运行的某一款基于互联网通信的软件
TCP(流式协议,可靠协议):三次握手,四次挥手
UDP(数据报协议):
无需建立双向连接,并且传输数据不可靠,可能会出现丢包的情况
通信速度比较快,但是发送的数据不会在内存中保留
应用层:
http协议,ftp协议 二、socket(套接字)
1、基于socket实现客户端与服务端通信
服务端:
  
import socket

server = socket.socket()             #产生服务的对象
server.bind(('127.0.0.1',8080)) #绑定自己的ip+port
server.listen(5) # 半连接池 #允许的最大请求数(开客户端的次数) conn,addr = server.accept() #等待接收,conn是类的对象,addr是客户端那个人的地址 data = conn.recv(1024) #接收客户端发送的信息
print(data)
conn.send(b'hello') #回复信息 conn.close() #关闭通信连接
server.close() #关闭服务端
客户端:
import socket

client = socket.socket()         #产生客户端对象(不传参数的话,默认tcp协议)
client.connect(('127.0.0.1',8080)) #找到服务器的ip+port client.send(b'how are you ') #向服务端发送信息
data = client.recv(1024) #接收服务端回复的信息
print(data)
client.close() #关闭通信连接
2、tcp协议的特点:
如果客户端发来(‘hello’)
服务端:
conn,addr = server.accept()
data = conn.recv(4) #只能接收4个字节
print(data) #b'hell'
data = conn.recv(5) #带着第一次遗留的接收5个字节
print(data) #b'ohell'
data = conn.recv(5) #带着第二次遗留的接收5个字节
print(data) #b'ohell'
3、最终解决粘包问题
服务端:
import socket
import subprocess
import struct
import json server = socket.socket()
server.bind(('127.0.0.1',8098))
server.listen(5) while True:
conn,addr = server.accept()
while True:
try: # 当客户端人为断掉后,服务端会报错,需要捕捉异常
data = conn.recv(1024).decode('utf-8')
if len(data) == 0:break #针对Linux和Mac系统,客户端异常断开反复收空的情况
obj = subprocess.Popen(data,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
stdout = obj.stdout.read()
stderr = obj.stderr.read() # 接收客户端发送过来的指令
print(len(stdout+stderr)) header_dic = {
'filename':'cls.txt',
'len':len(stdout+stderr) # 制作自定义的字典,可以自己添加信息
}
header_bytes = json.dumps(header_dic).encode('utf-8') # 制作报头
header = struct.pack('i',len(header_bytes)) # 将需要发送给客户的数据打包成固定4个字节
conn.send(header) # 先发报头
conn.send(header_bytes) #再发字典
conn.send(stdout+stderr) #再发真实数据内容
except ConnectionResetError:
break
conn.close()
server.close() 客户端:
import socket
import struct
import json client = socket.socket()
client.connect(('127.0.0.1',8098)) while True:
msg = input('>>>:').encode('utf-8')
if len(msg) == 0:continue
client.send(msg)
header = client.recv(4) # 接收报头 # 对这个头进行解包,获取真实数据的长度
head_len = struct.unpack('i',header)[0]
head_dic = json.loads(client.recv(head_len).decode('utf-8'))
print(head_dic) # 对需要接收的数据进行循环接收
total_size = head_dic['len']
recv_size = 0
res = b''
while recv_size < total_size:
data = client.recv(1024)
res += data
recv_size += len(data)
print(res.decode('gbk'))

DAY31、socket套接字的更多相关文章

  1. day31 socket套接字编程

    为什么要有套接字编程? 在上节课的学习中,我们学习了OSI七层协议,但是如果每次进行编程时我们都需要一层一层的将各种协议使用在我们的程序中,这样编写程序实在是太麻烦了,所以为了让程序的编写更加的简单, ...

  2. java 25 - 3 网络编程之 Socket套接字

    Socket Socket套接字: 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字. Socket原理机制: 通信的两端都有Socket. 网络通信其实就是Socket ...

  3. 进程、线程、socket套接字-资源大小 & 切换代价

    另,进程 & 线程的很多知识可以看这里:http://www.cnblogs.com/charlesblc/p/6135666.html 今天查了一下进程和线程的资源占用. 比如问:栈和堆的大 ...

  4. linux网络环境下socket套接字编程(UDP文件传输)

    今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...

  5. linux网络编程-(socket套接字编程UDP传输)

    今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...

  6. socket套接字TCP API

    socket套接字TCP API socket概念 socket又称"套接字",是计算机网络中进程间通信数据通道的一个端点.或称之为句柄.IP地址+port号就能够唯一确定一个so ...

  7. 进程间通信系列 之 socket套接字实例

    进程间通信系列 之 概述与对比   http://blog.csdn.net/younger_china/article/details/15808685  进程间通信系列 之 共享内存及其实例   ...

  8. 进程间通信系列 之 socket套接字及其实例

    进程间通信系列 之 概述与对比   http://blog.csdn.net/younger_china/article/details/15808685  进程间通信系列 之 共享内存及其实例   ...

  9. 一、网络编程-UDP传输协议及socket套接字使用

    知识点基本介绍:1.网络通信协议一般就是UDP和TCP俩种传输协议,这一章先说UDP,UDP是一种比较简单的传输协议,如qq使用的就是UDP          2.ip:ip就是标记网络中中的一台电脑 ...

  10. 网络编程初识和socket套接字

    网络的产生 不同机器上的程序要通信,才产生了网络:凡是涉及到倆个程序之间通讯的都需要用到网络 软件开发架构 软件开发架构的类型:应用类.web类 应用类:qq.微信.网盘.优酷这一类是属于需要安装的桌 ...

随机推荐

  1. Linux实战教学笔记33:lvs+keepalived集群架构服务

    一,LVS功能详解 1.1 LVS(Linux Virtual Server)介绍 LVS是Linux Virtual Server 的简写(也叫做IPVS),意即Linux虚拟服务器,是一个虚拟的服 ...

  2. JavaScript怎么让字符串和JSON相互转化

    var obj = str.parseJSON(); //由JSON字符串转换为JSON对象 var obj = JSON.parse(str); //由JSON字符串转换为JSON对象

  3. Spark scala和java的api使用

    1.利用scala语言开发spark的worcount程序(本地运行) package com.zy.spark import org.apache.spark.rdd.RDD import org. ...

  4. const&static&extern

    const 结论: 如果const写在指针变量名的旁边, 那么指针的指向不能变, 而指向的内存空间的值可以变 如果const写在数据类型的左边或者右边, 那么指针的指向可以改变, 但是指向的内存空间的 ...

  5. HttpClient 上传/下载文件计算文件传输进度

    1.使用ProgressMessageHandler 获取进度 using namespace System.Net.Http; HttpClientHandler hand = new HttpCl ...

  6. 独立看门狗实验-IWDG

    为什么要看门狗? 注意:喂狗是0XAAAA写到KR. 头文件iwdg.h iwdg.c

  7. bootstrap实现去点列表、内联列表、水平定义列表

    内联列表:通过添加类名“.list-inline”来实现内联列表,简单点说就是把垂直列表换成水平列表,而且去掉项目符号(编号),保持水平显示. 去点列表:通过给无序列表添加一个类名“.list-uns ...

  8. Perl 学习笔记-子程序

    1.定义子程序 使用sub关键字定义 ;   子程序名和标识符同要求, 但是有的特殊的可以用 &符号;  子程序是全局的, 不需要再使用前声明;  重名函数后者覆盖前者. sub roger{ ...

  9. Mysql设计索引的原则

    内容来自书籍<深入浅出MySQL++数据库开发.优化与管理维护+第2版+唐汉明> 设计索引的原则1. 搜索的索引列,不一定是所要选择的列.换句话说,最适合索引的列是出现在 WHERE 子句 ...

  10. C# 判断是否是在设计模式下有效的方法

    public static bool IsDesignMode() { bool returnFlag = false; #if DEBUG if (LicenseManager.UsageMode ...