~~网络编程(四):socket套接字~~
进击のpython
*****
网络编程——socket
socket的中文意思叫做套接字,socket方法其实也叫套接字方法
我们研究过TCP/UDP协议,但是要是让我们自己搭建,就十分困难了
而这时候,socket就出来了
socket他是存在在应用层和传输层之间的一堆接口
他把复杂的协议都封装好了,你想用的时候,直接调用就行
就跟我们写模块一样,把麻烦的代码写进去,等到用的时候只需要调用就行了
那你想想,咱们在研究模块的时候,是不是学会方法怎么用就行??
那咱们学套接字方法,也是学会方法就行
我要是想给你打电话的话应该是怎么个过程?
# 首先我得有电话
# 输入想打的电话
# 等待你接听
# 跟你bb两句
# 听你bb两句
那你接电话呢?
# 首先你得有电话
# 你还得有电话号码
# 然后你得有电话线
# 等着接电话
# 铃响接电话
# 听你bb两句
没问题吧!
那我要是想写成socket通信呢?
首先我得先创建两个py文件是吧,通信嘛,当然要两个:客户端和服务端
然后要在两个文件都调用socket模块是吧
接下来就继续吧!
解释一下啊,socket里面的两个属性,第一个是套接字的类型,我们这个是基于网络的嘛,所以是AF_INET
第二个是你数据的传输方式,SOCK_STREAM是流式传输,也就是TCP协议
在这我们要学习一个方法 bind 绑定,因为是手机绑定,所以是phone.bind
里面要添加一个元组参数 IP 和 端口
其中ip 我设置的是127.0.0.1,代表着本机的意思,我这不是要在自己电脑上操作嘛
端口最大到65535 其中,1-1024 是系统的端口,1024之后的就是应用的了,你随便选个就行
这里就是又一个方法了 listen 监听
里面要传一个参数,这个5是什么意思呢?
我这个电话接通的时候,别人又给我打电话,我也不能挂了啊
那这种状态可以维持几个手机同时给我打电话呢?5个
那最后,我就开始等电话了是吧
那客户端呢?是不是要买手机啊我用绑定ip嘛?
换句话说我用手机绑定手机卡,说只能用这个手机的这张卡才能给你打电话???
这显然不对啊,所以,客户端不用绑定
![1565065172405](D:\python 学习笔记\assets\1565065172405.png)
客户端的拨号,用到了connet方法,里面放一个元组参数,元组由服务端的ip和端口构成
那我要是运行,是不是应该先运行服务端,再运行客户端.这个能理解吧
那我们执行一下
看到了吧,这就算是连接上了,那我们看看我们拿的是什么东西
(<socket.socket fd=484, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8080), raddr=('127.0.0.1', 52621)>, ('127.0.0.1', 52621))
首先可以肯定这是个元组是吧,第一个元素是个什么东西?是不是套接字对象啊
第二个元素呢?是不是客户端的ip以及端口信息啊
那我们是不是可以通过解构的方式把这两个信息拿到啊
connet, client_addr = phone.accept()
那你说我这是不是就算是拿到了管道啊,那我有了管道了,我是不是就可以进行传输了啊
那我就可以收信息了,怎么收?又用到一个方法recv
connet.recv(1024)
它里面要传个参数,传接受的最大字节数
你给我传一个,我就收一个,你要是给我传1025个,我也收1024个
至于为什么是1024呢?我们后面说,你现在就先这么写
那我要是发消息呢?send方法
connet.send()
里面传发送的东西
打完电话就该挂电话了对吧
connet.close()
挂完电话是不是就关机了啊
phone.close()
那服务端完事了,客户端是不是也应该写点什么了
服务端是接收-发送
那我客户端是不是应该是发送-接收
客户端发送怎么写?send
phone.send("hello".encode("utf-8"))
别忘了把编码缀上
接收呢??recv
k = phone.recv(1024)
print(k)
然后呢?关机!
phone.close()
行啦!我们来看看写完的长什么样
执行一下吧(别忘了先执行服务端,再执行客户端)
这样,就完成了一个简单的C/S结构!
话不多说,自己多敲几遍
正常人谁那么搞啊,不都是有来言有去语的吗
那我们是不是就应该用循环来搞这个需求
循环放在哪呢?我们不是要循环收发这个过程嘛
那我们就应该循环收发信息这一块的代码啊
# 服务端
import socket
# 买手机
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定手机卡
phone.bind(("127.0.0.1", 8080))
# 开机
phone.listen(5)
# 等电话
connet, client_addr = phone.accept()
# 收发消息
while 1:
k = connet.recv(1024)
print(f'从客户端接收的消息:{k}')
connet.send(k.upper())
# 挂电话
connet.close()
# 关机
phone.close()
# 客户端
import socket
# 买手机
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 拨号
phone.connect(("127.0.0.1", 8080))
# 发收信息
while 1:
msg = input(">>>")
phone.send(msg.encode("utf-8"))
k = phone.recv(1024)
print(f"从服务端接收的消息:{k}")
# 关闭
phone.close()
# 服务端
从客户端接收的消息:b'as'
从客户端接收的消息:b'ds'
从客户端接收的消息:b'fa'
# 客户端
>>>as
从服务端接收的消息:b'AS'
>>>ds
从服务端接收的消息:b'DS'
>>>fa
从服务端接收的消息:b'FA'
>>>
还有一点就是想说,你们在调试的时候没遇到这个报错吗?
OSError:[Errno 48] Address already in use
这个问题就是说你刚关那个程序,然后系统还没有把你定义的端口给回收,你就又用了,就会出这个错误
怎么解决呢?
一种办法是修改客户端和服务端的端口,但是你不觉得太傻逼了吗?
所以还有另一种方法,就是在程序服务端绑定ip和端口下面添加一段这个代码
phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
这样就没事了,这个就是如果我发现这个端口被占用了,我就重新启用他
不是,那你们没有遇到bug嘛?
比如我在服务端直接敲回车,结果是什么???
你会发现你的程序执行不了了
那是谁的问题呢?是没发过去还是没接过来呢?
我们在send的下面写一个打印,发现可以被打印,那就说明我发过去了
而当我在接收的下面写一个打印,发现没有被打印,说明我没有接受到
而且服务端也没有执行原来有的print
那就说明是我发过去了,但是他什么都没有接收,所以她始终都在接受的这个位置等我传
也就是说空字符串是没办法单独传过去的,怎么解决这个问题呢?加个判断就好了啊
if not msg:continue
这样bug就没了
还有问题!你在断开客户端的时候,你会发现,服务端报错了!
ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。
这是我们不能忍的啊,我不跟你链接了,你就报错?这不符合常识
所以我们就可以用异常捕获来处理
try:
k = connet.recv(1024)
print(f'从客户端接收的消息:{k}')
connet.send(k.upper())
except ConnectionResetError:
break
这样就没问题了!
这里多说一句啊,我这个代码是在windows里运行的,如果你是linux运行的
服务端是不会报错的,他会不停的接收一个空,一直循环不报错
这样就会使程序变成死循环!,这是我们所不能接受的!
所以,在服务端加个判断
if not k:break
这样就万无一失了!
毕竟正常人不会发送个空过来!
*有点东西*
*继续深究*
~~网络编程(四):socket套接字~~的更多相关文章
- 网络编程与socket套接字
网络编程与socket套接字 传输层 PORT协议 port是一种接口,数据通过它在计算机和其他设备(比如打印机,鼠标,键盘或监视器)之间,网络之间和其他直接连接的计算机之间传递 TCP协议 传输 ...
- 02网络编程( socket套接字+TCP粘包 )
目录 02 网络编程 一.socket套接字编程 二.简易代码模板 2.1 服务端 2.2 客户端 三.通信循环及代码优化 四.黏包现象 五.struct模块 六.简易版本报头 七.上传文件数据 * ...
- linux网络编程-(socket套接字编程UDP传输)
今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...
- 【网络编程】Socket套接字网络编程模型
一.Linux网络模型 -- Socket套接字编程 图片:Socket 抽象层 Socket编程--不同协议,统一接口 Socket的实质就是一个接口, 利用该接口,用户在使用不同的网络协议时,操作 ...
- 31_网络编程(Socket套接字编程)_讲义
今日内容介绍 1.网络三要素及传输协议 2.实现UDP协议的发送端和接收端 3.实现TCP协议的客户端和服务器 4.TCP上传文件案例 01网络模型 *A:网络模型 TCP/IP协议中的四层分别是应用 ...
- python网络编程:socket套接字
一.socket 二.TCP服务器 三.TCP客户端 四.UDP服务器 五.UDP客户端 六.聊天的客户端 七.聊天的服务器 一.socket """ 学习网络编程 其实 ...
- Unix网络编程--卷一:套接字联网API
UNIX网络编程--卷一:套接字联网API 本书面对的读者是那些希望自己编写的程序能够使用成为套接字(socket)的API进行彼此通信的人. 目录: 0.准备环境 1.简介 2.传输层:TCP.UD ...
- VC++学习之网络编程中的套接字
VC++学习之网络编程中的套接字 套接字,简单的说就是通信双方的一种约定,用套接字中的相关函数来完成通信过程.应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问 ...
- [网络编程之Socket套接字介绍,套接字工作流程,基于TCP协议的套接字程序]
[网络编程之Socket套接字介绍,套接字工作流程,基于TCP协议的套接字程序] 为何学习socket套接字一定要先学习互联网协议: 1.首先:要想开发一款自己的C/S架构软件,就必须掌握socket ...
- Linux网络编程:原始套接字简介
Linux网络编程:原始套接字编程 一.原始套接字用途 通常情况下程序员接所接触到的套接字(Socket)为两类: 流式套接字(SOCK_STREAM):一种面向连接的Socket,针对于面向连接的T ...
随机推荐
- MFC 添加C++类,别的类不通过C++类的定义的对象就可以直接调用C++类里面的成员函数;
MFC 添加C++类,不用定义C++类的对象,别的类不通过C++类的定义的对象就可以直接调用C++类里面的成员函数: 1先在mfc程序中添加普通类CProdata,然后删除头文件Prodata.h里面 ...
- Tomcat的介绍
Tomcat简介 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选. 支持Se ...
- day08获取图片
wxml: <!--pages/publish/publish.wxml--> <text>pages/publish/publish.wxml</text> &l ...
- 2020阿里巴巴官方最新Redis开发规范!
本文主要介绍在使用阿里云Redis的开发规范,从下面几个方面进行说明. 键值设计 命令使用 客户端使用 相关工具 通过本文的介绍可以减少使用Redis过程带来的问题. 一.键值设计 1.key名设计 ...
- 这些 CSS 命名规范将省下你大把调试时间
我听说很多开发者厌恶 CSS.而在我的经验中,这往往是由于他们并没有花时间来学习 CSS. CSS 算不上是最优美的『语言』,但迄今二十多年来,它都是美化 web 举足轻重的工具.从这点来说,也还算不 ...
- 关于display的box和flex布局
关于二者的区别于联系,在知乎上看到有人这么回答的 flex 2012年的语法,也将是以后标准的语法,大部分浏览器已经实现了无前缀版本. box是2009年的语法,已经过时,是需要加上对应前缀的. 另外 ...
- Java编程技术之浅析Java容器技术
Java容器 集合是一种存储数据的容器,是Java开发中使用最频繁的对象类型之一. 或许提起Collection,都会第一时间意识到List和Set以及Map等相关关键词.因为这几乎是我们日常开发里接 ...
- 2020/7/6博客日报Java的开始--pthread的安装
1.今天进行了Java环境的安装,安装eclipse之后学习了eclipse的使用方法,如何建立项目,并完成了最基本的Java hello的运行: 今天是Java的开端,开始进入Java编程: 今天了 ...
- SQL注入原理及代码分析(二)
前言 上一篇文章中,对union注入.报错注入.布尔盲注等进行了分析,接下来这篇文章,会对堆叠注入.宽字节注入.cookie注入等进行分析.第一篇文章地址:SQL注入原理及代码分析(一) 如果想要了解 ...
- 树莓派4B踩坑指南 - (16)外接4k显示器的相关设置
最近某宝新买了个4k显示器, 总价700多, 质量凑合, 就把树莓派接上来了, 这一下苦了眼睛了, 于是有了此番调整 1. 先解决4k下60帧的刷新率 在\boot\config.txt的末尾加入一条 ...