python3-套接字(socket)

 

目录

socket 模块:通信模块

基于tcp的通信(单链接服务端和客户端)

基于tcp的通信循环(单链接)

基于tcp的通信循环+解决空传输等待(单链接)

基于tcp的通信循环+解决空传输等待+保持服务器监听(单链接)

基于UDP的通信(多链接)


socket 模块:通信模块

'''
套接字(socket):
    基本上是一个信息通道,两段各有一个程序。通过网络位于不同的计算机上,通过套接字和对方通信
    Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。
    在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,
    对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

    套接字两大类:
        1.服务器套接字
        2.客户端套接字

服务端套接字函数
    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()        创建一个与该套接字相关的文件
'''

基于tcp的通信(单链接服务端和客户端)

'''服务端'''

import socket

IP = '127.0.0.1'
PORT = 8080
ADDR = (IP, PORT)
# 1.创建服务器的socket对象
ser = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print(ser)
# 2.设置服务器地址
ser.bind(ADDR)
# 3.设置服务端半连接池,同一时刻的最大请求数限制
ser.listen(5)
# 4.获取双相链接对象和服务端地址
conn, addr = ser.accept()
print(conn)
print(addr)
# 5.收发数据
# # 接受1024字节数据
data = conn.recv(1024)
conn.send('服务端:已接收数据'.encode('utf-8'))
print(data.decode('utf-8'))
# 6.断开客户端连接
conn.close()
# 7.关闭服务器(一般不关闭)
ser.close()

'''客户端'''

import socket

IP = '127.0.0.1'
PORT = 8080
ADDR = (IP, PORT)
# 1.创建客户端的socket对象
cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2.连接服务器地址
cli.connect(ADDR)
# 3.收发数据
cli.send('客户端:发送信息'.encode('utf-8'))
# 接受1024字节数据
date = cli.recv(1024)
print(date.decode('utf-8'))
# 4.关闭客户端
cli.close()

基于tcp的通信循环(单链接)

'''服务端'''

import socket

IP = '127.0.0.1'
PORT = 3306
ADD = (IP, PORT)

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(ADD)
server.listen(5)
conn, addr = server.accept()
while True:
    date = conn.recv(1024)
    print(date.decode('utf-8'))
    if date.decode('utf-8') == 'q':
        conn.send('已退出'.encode('utf-8'))
        break
    conn.send(date.upper())
conn.close()
server.close()

'''客户端'''

import socket

IP = '127.0.0.1'
PORT = 3306
ADD = (IP, PORT)
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(ADD)
while True:
    msg = input('请输入(q退出)>>>>').strip()
    if not msg:continue
    client.send(msg.encode('utf-8'))
    date = client.recv(1024)
    print(date.decode('utf-8'))
    if msg == 'q':
        break
client.close()

基于tcp的通信循环+解决空传输等待(单链接)

'''服务端'''

import socket

IP = '127.0.0.1'
PORT = 3306
ADD = (IP, PORT)

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(ADD)
server.listen(5)
conn, addr = server.accept()
while True:
    try:  # 针对win系统
        date = conn.recv(1024)
        if not date: break  # 针对linux系统

        print(date.decode('utf-8'))
        if date.decode('utf-8') == 'q':
            conn.send('已退出'.encode('utf-8'))
            break
        conn.send(date.upper())
    except ConnectionResetError:
        break
conn.close()
server.close()

'''客户端'''

import socket

IP = '127.0.0.1'
PORT = 3306
ADD = (IP, PORT)
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(ADD)
while True:
    msg = input('请输入(q退出)>>>>').strip()
    if not msg:continue
    client.send(msg.encode('utf-8'))
    date = client.recv(1024)
    print(date.decode('utf-8'))
    if msg == 'q':
        break
client.close()

基于tcp的通信循环+解决空传输等待+保持服务器监听(单链接)

'''服务端'''
import socket

IP = '127.0.0.1'
PORT = 3306
ADD = (IP, PORT)

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(ADD)
server.listen(5)
while True:
    conn, addr = server.accept()
    while True:
        try:  # 针对win系统
            date = conn.recv(1024)
            if not date: break  # 针对linux系统

            print(date.decode('utf-8'))
            if date.decode('utf-8') == 'q':
                conn.send('已退出'.encode('utf-8'))
                break
            conn.send(date.upper())
        except ConnectionResetError:
            break
    conn.close()

'''客户端'''
import socket

IP = '127.0.0.1'
PORT = 3306
ADD = (IP, PORT)
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(ADD)
while True:
    msg = input('请输入(q退出)>>>>').strip()
    if not msg: continue
    client.send(msg.encode('utf-8'))
    date = client.recv(1024)
    print(date.decode('utf-8'))
    if msg == 'q':
        break
client.close()

基于UDP的通信(多链接)

'''服务端'''
import socket
ip_port=('127.0.0.1',8080)

server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
server.bind(ip_port)

while True:
    msg,addr=server.recvfrom(1024)
    print(msg,addr)

    server.sendto(msg.upper(),addr)
'''客户端'''
import socket
ip_port=('127.0.0.1',8080)
client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

while True:
    msg=input('>>: ').strip()
    if not msg:continue

    client.sendto(msg.encode('utf-8'),ip_port)

    back_msg,addr=client.recvfrom(1024)
    print(back_msg.decode('utf-8'),addr)
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值