socket编程

一、什么是socket

socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。它把复杂的TCP/IP协议隐藏在socket接口的后面,对使用者而言,一组接口就是全部,让socket去组织数据。
osi七层

二、分类

常用的三类TCP/IP协议的套接字:

  1. 流式套接字(SOCK_STREAM):
    流式套接字用于提供面向链接、可靠的数据传输服务,使用TCP协议。
  2. 数据报套接字(SOCK_DGRAM):
    数据报套接字提供了一种无连接的服务,该服务不能保证数据传输的可靠性,使用UDP协议。
  3. 原始套接字(SOCK_RAW):
    原始套接字允许对较低层次的协议直接访问,如IP,常用与检验新的协议的实现,或者访问现有服务中配置的新设备。

三、套接字工作流程

套接字工作流程

四、基于TCP的套接字

TCP服务端:

# TCP服务端
# 循环链接
from socket import *
ip_port = ('127.0.0.1',8000)
back_log = 5
buffer_size = 1024
tcp_server = socket(AF_INET,SOCK_STREAM)         #建立服务端
tcp_server.bind(ip_port)                         #绑定ip及端口
tcp_server.listen(back_log)                      #开启服务端
while True:
    print("服务端开启了,等待连接")
    conn,addr = tcp_server.accept()              #等待连接
    print("客户端地址:",addr)
    while True:
        try:
            msg = conn.recv(buffer_size)         #收信息
            if not msg: break
            print("来自客户端的信息>>>",msg.decode("utf-8"))
            conn.send(msg.upper())               #发信息
        except Exception:
            print("该链接关闭\n")
            break
    conn.close()                                #关闭链接
tcp_server.close()                              #关闭服务端

TCP客户端:

## TCP 客户端
from socket import *
ip_port = ('127.0.0.1',8000)
buffer_size = 1024

tcp_client = socket(AF_INET,SOCK_STREAM)                  #建立客户端
tcp_client.connect(ip_port)                               #建立连接

while True:
    msg = input(">>>")
    if not msg: continue
    if msg == 'quit': break
    tcp_client.send(msg.encode('utf-8'))                  #发信息
    data = tcp_client.recv(buffer_size)                   #收信息
    print("来自服务端的信息>>>",data.decode("utf-8"))

tcp_client.close()

这是一个简单的TCP服务端与客户端,客户端发送一段字符串,服务端将其大写并返回给客户端。

客户端运行结果:
客户端运行结果
服务端运行结果:
服务端运行结果

五、基于UDP的套接字

UDP服务端:

#UDP服务端
from socket import *
ip_port = ("127.0.0.1",8080)
udp_server = socket(AF_INET,SOCK_DGRAM)  #数据报
udp_server.bind(ip_port)

while True:
    data,addr = udp_server.recvfrom(1024)
    print(data.decode("utf-8"))
    udp_server.sendto(data.upper(),addr)
udp_server.close()

UDP客户端:

#UDP客户端
from socket import *
ip_port = ('127.0.0.1',8080)
udp_client = socket(AF_INET,SOCK_DGRAM)  #数据报

while True:
    msg = input(">>>")
    udp_client.sendto(msg.encode("utf-8"),ip_port)

    data,addr = udp_client.recvfrom(1024)
    print(data.decode("utf-8"))

由于UDP并不需要建立链接,因此服务端可以同时跟多个客户端通信。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值