Socket编程

一、网络通信开发框架

1、web类:csdn , 博客园 , 力扣……可以直接使用浏览器打开的。

2、应用类:微信 , QQ , 抖音……需要进行安装

这两类的软件通信对应了不同的开发架构

1、C/S架构

C/S(Clinet和Server)就是客户端与服务端架构 , 这种机构是从用户层面进行划分的 , 该模式对用户的电脑操作系统的环境依赖比较大。

2、B/S架构

B/S(Brower和Server)就是浏览器和客户端架构 ,该模式只需要通过浏览器发送http协议请求服务商对应的资源 。

二、socket_TCP网络通信

socket : 套接字,是用来实现网络编程进行数据传输的一种技术手段

套接字分为两种
    1.UDP协议
        UDP协议没有C/S架构的概念 
        速度很快 但是数据丢失率高
        写信
    2.TCP协议
        速度相对较慢 但是安全性高 几乎可以保证数据完美接收

socket把复杂的TCP/IP协议族封装隐藏好了 ,我们只需要遵循socket的规定进行编写就行了

tcp传输的是可靠的数据(基于连接)的通信协议
当对于网络通讯质量比较高的时候:传输文件 , 浏览网页……
udp传输的是不可靠的数据;会出现丢包现象(基于非连接)。
当实时性要求比较高时
我要给你发消息

1、有手机
2、有微信号
3、打开微信
4、添加好友
5、接受,发送消息
6、退出微信
7、关掉手机
​
通信步骤:
1、连接
2、传输数据
3、关闭连接
​
服务端的创建流程
1、创建服务端socket对象
2、绑定自己的IP以及端口号
3、设置监听模式,设置最大的连接数
4、等待客户端连接
5、接受客户端数据
6、给客户端发送数据
7、关闭
​
socket --> bind --> listen --> accept --> recv(收)/send(发) --> close
# 服务端
import socket
​
# 1、创建服务端socket对象
'''
socket_family 网络地址类型 AF_INET 表示ipv4
socket_type 套接字类型,SOCK_STREAM表示tcp套接字
'''
telphone = socket.socket(socket.AF_INET , socket.SOCK_STREAM)
​
# 2、绑定自己的IP以及端口号
'''
bind的参数必须是一个元组
这个元组的参数(ip , port)
'''
telphone.bind(('127.0.0.1' , 10086))
​
# 3、设置监听模式,设置最大的连接数
telphone.listen(5)
​
# 4、等待客户端连接
'''
accept 有两个返回值:1、客户端连接的套接字对象 ;2、连接的客户端地址
客户端连接的套接字对象:用来获取客户端消息的
'''
conn , clinet = telphone.accept()
​
# 5、接受客户端数据
# recv的参数时每次最多接受最大的字节
data = conn.recv(1024)
print(data)
​
# 6、给客户端发送数据
conn.send(data)
​
# 7、关闭
conn.close()
telphone.close()
# 服务端
import socket
​
# 1、创建服务端socket对象
'''
socket_family 网络地址类型 AF_INET 表示ipv4
socket_type 套接字类型,SOCK_STREAM表示tcp套接字
'''
telphone = socket.socket(socket.AF_INET , socket.SOCK_STREAM)
​
# 2、绑定自己的IP以及端口号
'''
bind的参数必须是一个元组
这个元组的参数(ip , port)
'''
telphone.bind(('127.0.0.1' , 10086))
​
# 3、设置监听模式,设置最大的连接数
telphone.listen(5)
​
# 4、等待客户端连接
'''
accept 有两个返回值:1、客户端连接的套接字对象 ;2、连接的客户端地址
客户端连接的套接字对象:用来获取客户端消息的
'''
conn , clinet = telphone.accept()
​
# 5、接受客户端数据
# recv的参数时每次最多接受最大的字节
data = conn.recv(1024)
print(data)
​
# 6、给客户端发送数据
conn.send(data)
​
# 7、关闭
conn.close()
telphone.close()

添加循环的通信

# 服务端
import socket
​
# 1、创建服务端socket对象
'''
socket_family 网络地址类型 AF_INET 表示ipv4
socket_type 套接字类型,SOCK_STREAM表示tcp套接字
'''
telphone = socket.socket(socket.AF_INET , socket.SOCK_STREAM)
​
# 2、绑定自己的IP以及端口号
'''
bind的参数必须是一个元组
这个元组的参数(ip , port)
'''
telphone.bind(('127.0.0.1' , 10086))
​
# 3、设置监听模式,设置最大的连接数
telphone.listen(5)
​
# 4、等待客户端连接
'''
accept 有两个返回值:1、客户端连接的套接字对象 ;2、连接的客户端地址
客户端连接的套接字对象:用来获取客户端消息的
'''
conn , clinet = telphone.accept()
​
while True:
    try:
        # 5、接受客户端数据
        # recv的参数时每次最多接受最大的字节
        data = conn.recv(1024)
        # 如果客户端是正常停止程序,那么这里会不断的打印空白行
        print(data.decode('utf-8'))
        # 6、给客户端发送数据
        conn.send(data)
    # 捕获到ConnectionResetError , 就可以停止接受发送消息
    except ConnectionResetError:
        break
​
# 7、关闭
conn.close()
telphone.close()
# 客户端
import socket
​
phone = socket.socket(socket.AF_INET , socket.SOCK_STREAM)
​
# 连接服务器
# ip与端口号必须与服务端一致
phone.connect(('127.0.0.1' , 10086))
​
while True:
​
    # 不能发送空白消息
    msg = input('>>(q:退出)').strip()
    # 判断消息是否位空
    if not msg :
        continue
    if msg == 'q':
        break
    # 发送数据
    phone.send(msg.encode('utf-8'))
    # 接受数据
    data = phone.recv(1024)
    print(data.decode('utf-8'))
​
phone.close()

三、socket_UDP网络通信

# 服务端
import socket
​
telphone = socket.socket(socket.AF_INET , socket.SOCK_DGRAM)
​
telphone.bind(('127.0.0.1' , 8080))
​
while True:
    # 接收消息
    msg , clinet = telphone.recvfrom(1024)
    print(msg.decode('utf-8'))
    # 发送消息
    telphone.sendto(msg , clinet)
# 客户端
import socket
​
phone = socket.socket(socket.AF_INET , socket.SOCK_DGRAM)
ip_port = ('127.0.0.1' , 8080)
​
while True:
    # upd 套接字可以接收空白的消息
    msg = input('>>(q退出)').strip()
    if msg == 'q':
        break
    # 发消息
    phone.sendto(msg.encode('utf-8') , ip_port)
    # 接收消息
    get_data , sever = phone.recvfrom(1024)
    print(get_data.decode('utf-8'))
​

四、编码格式讲解

    # byte是字节单位
    byte kb mb gb tb zb
    1024byte = 1kb 
    1024kb = 1mb
    ...
    UTF-8编码格式中:
        一个中文的汉字和符号 占用三个字节
        一个英文的字母和符号 占用一个字节
    GBK编码格式中:
        一个中文的汉字和符号 占用两个字节
        一个英文的字母和符号 占用一个字节
​
    A发送信息给B 内容是 '今天过来吃饭' 编码格式是UTF-8
    178 -45 -98/ 178 89 -56/ 123 85 -85/....
    B的接收格式是GBK
    178 -45/ -98 178/ 89 -56/ 123 85/....
    # 在编程的过程中 要保持编码的格式一致 一般使用utf-8

五、网络工作的模式

1.单工模式
    只能接收信息不能发送信息~~~ 收音机
2.半双工模式
    你在发送消息的时候 不能接收消息 你在接收消息的时候不能发送消息 发送和接收不能同时进行  对讲机~~~ 
3.全双工模式
    接收和发送可以同时进行~~~ QQ和微信
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值