day_31 网络编程之socket

socket

​ 什么是socket 翻译为套接字

​ 是一套编程接口,内部封装了一堆底层协议,隐藏了内部复杂的实现细节,提供简单的使用接口

​ 咱们只要按照socket编程接口来编写出的代码,就已经遵循了各种协议

​ 简单的说就是一个封装好的模块

​ 要学习的就是模块的使用方法

socket的发展

​ 最开始socket使用来完成进程间通讯的,并不是用来网络通讯,那时候还没有网络

​ 后来有了网络之后 .基于之前的socket来进行了更新 使其可以支持网络通讯

​ 所以socket分为两种类型

​ AF_UNIX : 进程间通讯

​ AF_INET : 网络通讯 

 socket在OSI中的位置 

import socket

# 作为服务器必明确自己的ip和端口号    并且不应该变化
# 参数1指定 socket类型AF_INET 表示网络类型
#参数2指定的传输协议为 SOCK_STREAM表示TCP协议 SOCK_DGRAM UDP协议
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)    # 1.买电话机

# 默认就是网络类型   TCP协议
#server = socket.socket()

# 127.0.0.1这叫回送地址   表示当前电脑本身
# ip一定本机ip   本机可能会有多个IP (无线|有限)
# 注意:需要参数是一个元组   端口就是普通整数
server.bind(("127.0.0.1",1688))   # 2.插入手机卡

# 无论是服务器端还是客户端 都是socket 类型

# 开始监听1688端口    盯着这个端口看以后没有数据过来  
server.listen()   # 3.手机开始待机

# 接收链接请求
# 第一个是表示客户端的socket    第二个客户端的地址信息
while True:
client_socket,client_addr = server.accept()
buffer_size = 1024 #缓冲区  就是一个临时的容器  


while True:
try:
data = client_socket.recv(1024) #缓冲区大小 不能随便写 太大会导致内存溢出 太小效率低 在内存能够承受的情况下 大一些

# 在linux中 对方如果强行下线了 服务器不会抛出异常 只会收到空消息
# 得加上判断 如果为空则意味着 对方下线了 应该关闭链接 跳出循环
# windows上正常关闭 也会收到空消息 if 必须要加
if not data:
client_socket.close()
break

print(data.decode("utf-8")) # 解码时必须保证双方同意编码方式
# 转为大写在发回去
client_socket.send(data.upper())
except ConnectionResetError as e:
print("%s %s" % (client_addr[0],client_addr[1]),e)
# 如果对方下线了 那服务器也应该关闭对应的客户端对象
client_socket.close()
break


# 通常服务器不会关闭
# server.close()
 
import socket

# 买个电话
client = socket.socket()

# 作为客户端 ip和端口可以变化   所有系统会自动分配随机端给客户端
client.connect(("127.0.0.1",1688))


# 添加循环 用来重复收发数据
while True:
    # 收发的顺序  必须很对面相反  否则卡死了
    # 开始通话
    # 发送数据   注意发送的内容只能是二进制  bytes
    client.send("hello".encode("utf-8"))

    # 接收数据  单位为字节
    data = client.recv(1024)
    print(data)

    
client.close()

猜你喜欢

转载自www.cnblogs.com/jixu/p/10940404.html