Python 基础之socket编程(一)

可以进行通信玩儿了,感觉不错不错,网络通信就像打电话,我说一句你听一句之后,你再说一句,我听一句,就这样。。。。。下去了。不扯淡了,来来来,看看今天都搞了点啥东西。

一、 客户端与服务器架构

即C/S架构,包括

1.硬件C/S架构(打印机)

2.软件C/S架构(web服务)

二、Socket 是何鬼?

简单来说Socket就是用来完成客户端与服务器之间的通信

例如浏览器访问网页,例如网络游戏等一切基于客户端服务器来实现的C/S架构程序

Socket是基于互联网OSI七层协议的一个结构,准确的说是基于建议互联网模型OSI五层协议的接口

此处延伸一个概念:套接字

套接字在最开始的时候,是应用于进程与进程之间的通信,之后被广泛应用到互联网,基本上分为两个种族

基于文件类型的套接字:AF_UNIX

基于网络类型的套接字:AF_INET

而对于我们来说重点肯定是网络类型,so今后我们会对AF_INET分解研究

套接字的工作流程:

接下来说一下socket通信时用的一些方法:

这里我们可以看出来socket的基本工作流程了,也大致看了一下socket通信时所用到的方法

服务端套接字函数

服务端套接字函数
s.bind() 绑定(主机,端口号)到套接字
s.listen() 开始TCP监听
s.accept() 被动接受TCP客户的连接,(阻塞式)等待连接的到来 客户端套接字函数
s.connect() 主动初始化TCP服务器连接
s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常 公共用途的套接字函数
s.recv() 接收TCP数据
s.send() 发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
s.sendall() 发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
s.recvfrom() 接收UDP数据
s.sendto() 发送UDP数据
s.getpeername() 连接到当前套接字的远端的地址
s.getsockname() 当前套接字的地址
s.getsockopt() 返回指定套接字的参数
s.setsockopt() 设置指定套接字的参数
s.close() 关闭套接字 面向锁的套接字方法
s.setblocking() 设置套接字的阻塞与非阻塞模式
s.settimeout() 设置阻塞套接字操作的超时时间
s.gettimeout() 得到阻塞套接字操作的超时时间 面向文件的套接字的函数
s.fileno() 套接字的文件描述符
s.makefile() 创建一个与该套接字相关的文件

到底socket是如何进行通信的呢?来来来,看两个例子先:

1.简单版的c/s通信

import  socket

phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 买手机

phone.connect(('127.0.0.1',8080)) # 拨通电话

phone.send('hello'.encode('utf-8'))  # 发消息

data=phone.recv(1024)
print('收到服务端的发来的消息:',data)

socket 客户端

import socket

phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  # 买手机 #  socket.SOCK_STREAM 代表tcp协议 (此句的含义是网络通信基于tcp协议)
phone.bind(('127.0.0.1',8080)) #写成元组的形式 #绑定手机卡 phone.listen(5) # 5 代表可以有5个电话在这里等着 #开机操作 print('_____====>') conn,addr = phone.accept() #等待电话 (conn :电话链接;addr:对方的手机号码) msg = conn.recv(1024) #收消息
print('客户端发来的消息是',msg) # 打印收到的消息
conn.send(msg.upper()) # 发送消息 conn.close() # 关闭电话链接
phone.close() # 关手机

socket服务端

2.完善版的c/s通信

from socket import *

ip_port=('127.0.0.1',8080)
back_log=5
buffer_size=1024 tcp_client=socket(AF_INET,SOCK_STREAM)
tcp_client.connect(ip_port) while True:
msg=input('>>: ').strip()
# if not msg:continue
# if msg == 'q':
# break
tcp_client.send(msg.encode('utf-8'))
print('客户端已经发送消息')
data=tcp_client.recv(buffer_size)
print('收到服务端发来的消息',data.decode('utf-8')) tcp_client.close()

socket客户端

from socket import *

ip_port=('127.0.0.1',8080)
back_log=5
buffer_size=1024 tcp_server=socket(AF_INET,SOCK_STREAM)
tcp_server.bind(ip_port)
tcp_server.listen(back_log) print('服务端开始运行了')
conn,addr=tcp_server.accept() #服务端阻塞
print('双向链接是',conn)
print('客户端地址',addr) while True:
data=conn.recv(buffer_size) print('客户端发来的消息是',data.decode('utf-8')) conn.send(data.upper()) conn.close() tcp_server.close()

socket服务端

Python 基础之socket编程(一)的更多相关文章

  1. Python 基础之socket编程(二)

    Python 基础之socket编程(二) 昨天只是对socket编程做了简单的介绍,只是把socket通信的框架搭建起来,要对其中的功能进行进一步的扩充,就来看看今天的料哈! 一.基于tcp的套接字 ...

  2. python基础之socket编程 (转自林海峰老师)

    python基础之socket编程   阅读目录 一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 ...

  3. Python 基础之socket编程(三)

    python 基础之socket编程(三) 前面实现的基于socket通信只能实现什么呢?在tcp协议的通信中就是一个用户说一句,服务端给你回一句,你再给服务端说一句,服务端再给你回一句,就这样一直友 ...

  4. 十三python基础之socket编程

      阅读目录 一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 八 基于UDP的套接字 九 粘包现 ...

  5. python基础之socket编程

    一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 八 基于UDP的套接字 九 粘包现象 十 什么是 ...

  6. Python之路【第十篇】: python基础之socket编程

    阅读目录 一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 八 基于UDP的套接字 九 recv与 ...

  7. Python基础之socket编程(Day29)

    一.客户端/服务器架构 1.硬件c/s架构(打印机) 2.软件c/s架构 互联网中处处是c/s架构 浏览的网页就是如此 C/S架构与socket的关系 socket就是为了完成c/s架构的开发 二.s ...

  8. python基础21 ------python基础之socket编程

    一.C/S架构和B/S架构的简介 略 二.osi七层模型 略 三.socket层 1.如图所示: socket层是存在于应用层和传输层直接抽象出来的一层. 2.socket层是什么? Socket是应 ...

  9. python基础之socket编程(二)

    ssh远程执行命令: 思路分析: 客户端给服务端发送命令,服务端返回一个输出结果传给客户端. #coding:utf-8 #买手机 import socket import struct import ...

随机推荐

  1. is_enable()、is_displayed()、isSelected()

    1.以上三个为布尔类型的函数 2.is_enable()用于存储input.select等元素的可编辑状态,可以编辑返回true,否则返回false 3.is_displayed()本身这个函数用于判 ...

  2. CentOS 7.6 Telnet服务搭建(Openssh升级之战 第一任务备用运输线搭建)

    (以下内容亲手完成,如果需要搬走记得把写博的小白的名字和邮箱一起搬走) 出来玩(学习),总是要还的! 有不明的问题的时候,都来博客园转转,总能找到答案或者灵感,开博3个月都没发一篇帖(不晓得管理员有何 ...

  3. [Luogu3659][USACO17FEB]Why Did the Cow Cross the Road I G

    题目描述 Why did the cow cross the road? Well, one reason is that Farmer John's farm simply has a lot of ...

  4. TensorFlow2.0(8):误差计算——损失函数总结

    .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...

  5. 在Ubuntu16.0.4安装hipcaffe

    1. 安装 AMD ROCm 显卡条件 要安装AMD的 ROCm显卡,必须满足以下条件,只能高于下面信息版本,不能低于. Distribution Kernel GCC GLIBC x86_64 Fe ...

  6. Could not initialize class com.fasterxml.jackson.databind.SerializationConfig

    问题 Spring web 与 Spring eureka集成后出现错误: Caused by: java.lang.NoClassDefFoundError: Could not initializ ...

  7. 自己动手破解Z.EntityFramework.Extensions 4.0.11.0的方法

    因为项目中使用到Z.EntityFramework.Extensions 和 Z.EntityFramework.Plus(免费开源)两个类库,但是Z.EntityFramework.Extensio ...

  8. Shiro learning - 入门案例(2)

    Shiro小案例 在上篇Shiro入门学习中说到了Shiro可以完成认证,授权等流程.在学习认证流程之前,我们应该先入门一个Shiro小案例. 创建一个java maven项目 <?xml ve ...

  9. Redis5源码解析-Sentinel

    简单的概念就不解释.基于Redis5.0.5 从Sentinel主函数触发 在sentinel.c文件的最后面可以发现sentinelTimer函数,这个就是Sentinel的主函数,sentinel ...

  10. Python+requests+unittest+excel实现接口自动化测试框架(转

    一.框架结构:工程目录 二.Case文件设计三.基础包 base 3.1 封装get/post请求(runmethon.py) import requests import json class Ru ...