码迷,mamicode.com
首页 > 编程语言 > 详细

python入行036(socket模块)

时间:2020-04-20 21:36:58      阅读:85      评论:0      收藏:0      [点我收藏+]

标签:关闭   之间   最大   div   nec   exce   not   应用层   是什么   

1 socket是什么

  socket是一个位于应用层和传输层之间的“抽象层”,他把复杂的tcp/ip协议族隐藏在socket接口后面。socket抽象层位于传输层上面, 用户无需深入理解tcp/udp协议,只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。

2 基于TCP的套接字

2.1 简单版

# 服务器端
import socket


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 创建服务器套接字对象

s.bind((127.0.0.1, 8080))  # 绑定(ip, 端口号)到套接字对象

s.listen(5)  # 开始监听,5指的是半连接池的大小
print("服务器启动完成,开始监听")

conn, client_addr = s.accept()  # 被动接受客户端的连接,(阻塞式)等待连接的到来
print(client_addr)

data = conn.recv(1024)  # 接收TCP数据,最大接收的数据量为1024Bytes,收到的是bytes类型
print(data.decode(utf-8))

conn.send(hello.encode(utf-8))  # 发送TCP数据

conn.close()  # 关闭服务器套接字对象
# 客户端
import socket


c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 创建客户端套接字对象

c.connect((127.0.0.1, 8080))  # 主动初始化服务器连接

c.send(hello, world.encode(utf-8))  # 发送TCP数据

data = c.recv(1024)  # 接收TCP数据
print(data.decode(utf-8))

c.close()  # 关闭客户端套接字对象

2.2 加上通信循环

# 服务器端
import socket


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 创建服务器套接字对象

s.bind((127.0.0.1, 8080))  # 绑定(ip, 端口号)到套接字对象

s.listen(5)  # 开始监听,5指的是半连接池的大小
print("服务器启动完成,开始监听")

conn, client_addr = s.accept()  # 被动接受客户端的连接,(阻塞式)等待连接的到来

while True:
    try:
        data = conn.recv(1024)  # 接收TCP数据,最大接收的数据量为1024Bytes,收到的是bytes类型
        if not data:
            break
        print(客户端发送的消息, data.decode(utf-8))
        conn.send(hello.encode(utf-8))  # 发送TCP数据
    except Exception:
        break
conn.close()  # 关闭conn连接
# 客户端
import socket


c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 创建客户端套接字对象

c.connect((127.0.0.1, 8080))  # 主动初始化服务器连接

while True:
    msg = input("输入要发送的消息>>>: ").strip()
    if not msg:
        continue
    c.send(msg.encode(utf-8))  # 发送TCP数据

    data = c.recv(1024)  # 接收TCP数据
    print(data.decode(utf-8))

c.close()  # 关闭客户端套接字对象

2.3 加上连接循环

# 服务器端
import socket


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 创建服务器套接字对象

s.bind((127.0.0.1, 8080))  # 绑定(ip, 端口号)到套接字对象

s.listen(5)  # 开始监听,5指的是半连接池的大小
print("服务器启动完成,开始监听")

# 加上连接循环
while True:
    conn, client_addr = s.accept()  # 被动接受客户端的连接,(阻塞式)等待连接的到来

    while True:
        try:
            data = conn.recv(1024)  # 接收TCP数据,最大接收的数据量为1024Bytes,收到的是bytes类型
            if not data:
                break
            print(客户端发送的消息, data.decode(utf-8))
            conn.send(hello.encode(utf-8))  # 发送TCP数据
        except Exception:
            break
    conn.close()  # 关闭conn连接
# 客户端
import socket


c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 创建客户端套接字对象

c.connect((127.0.0.1, 8080))  # 主动初始化服务器连接

while True:
    msg = input("输入要发送的消息>>>: ").strip()
    if not msg:
        continue
    c.send(msg.encode(utf-8))  # 发送TCP数据

    data = c.recv(1024)  # 接收TCP数据
    print(data.decode(utf-8))

c.close()  # 关闭客户端套接字对象

 3 基于UDP协议的套接字

# 服务器端
import socket

server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 数据报协议=》udp协议

server.bind((127.0.0.1,8081))

while True:
    data,client_addr=server.recvfrom(1024)
    server.sendto(data.upper(),client_addr)


server.close()
# 客户端
import socket

client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 流式协议=》tcp协议

while True:
    msg=input(>>>: ).strip()
    client.sendto(msg.encode(utf-8),(127.0.0.1,8081))
    res=client.recvfrom(1024)
    print(res)

client.close()

 

python入行036(socket模块)

标签:关闭   之间   最大   div   nec   exce   not   应用层   是什么   

原文地址:https://www.cnblogs.com/mmmmmrz/p/12739909.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!