2.5.3.1Python-TCP编程/UDP编程/socket套接字

总目录:https://blog.csdn.net/qq_41106844/article/details/105553392

Python - 子目录:https://blog.csdn.net/qq_41106844/article/details/105553333

 

 

socket在某种意义上为我们封装好了tcp/udp,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。

 

Socket套接字

socket编程离不开的就是socket()函数。我们要使用这个函数来创建套接字对象。

语法

socket.socket([family[, type[, proto]]])

mily: 套接字家族可以使AF_UNIX或者AF_INET

type: 套接字类型可以根据是面向连接的还是非连接分为SOCK_STREAM或SOCK_DGRAM

protocol: 一般不填默认为0.

服务器端常用方法

服务端套接字绑定IP端口:bind()

服务端套接字监听:listen()

服务端监听套接字同意连接:accept()

 

客户端端常用方法

客户端套接字连接服务器:connect()

connect()的扩展版本,出错时返回出错码,而不是抛出异常:connect_ex()

 

公用方法

套接字发送消息:send()

套接字接受消息:recv()

套接字关闭连接:close()

完整发送TCP数据:sendall()

接收UDP数据:recvfrom()

发送UDP数据:sendto()

返回连接套接字的远程地址:getpeername()

返回套接字自己的地址:getsockname()

设置套接字操作的超时期:s.settimeout()

 

 

我们来看一个TCP实例:

server.py

# 导入 socket模块

import socket

 

# 创建 socket 对象

serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

 

# 获取本地主机名

host = socket.gethostname()

 # 设置端口号

port =8888

 

# 绑定端口号

serversocket.bind((host, port))

# 设置最大连接数,超过后排队

serversocket.listen(5)

 

while True:

    # 建立客户端连接

    clientsocket, addr = serversocket.accept()

    print("连接地址: %s" %str(addr))

    msg ='服务端发送的一条消息。' +"\r\n"

    clientsocket.send(msg.encode('utf-8'))

    msg = clientsocket.recv(1024)

    print(msg.decode("utf-8"))

    clientsocket.close()

client.py

# 导入 socket模块

import socket

 

# 创建 socket 对象

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

 

# 获取本地主机名

host = socket.gethostname()

# 设置端口号

port =8888

 

# 连接服务,指定主机和端口

s.connect((host, port))

# 接收小于 1024 字节的数据

msg = s.recv(1024)

s.send("客户端发来的消息。".encode('utf-8'))

s.close()

print (msg.decode('utf-8'))

 
20155953-89f4c8bcb59976fe.png
server运行结构

 

 
20155953-afa1aaad0ef07bc1.png
client运行结果

UDP实例要简单一点

UDP的使用与TCP类似,但是不需要建立连接。此外,服务器绑定UDP端口和TCP端口互不冲突,也就是说,UDP的9999端口与TCP的9999端口可以各自绑定。

server.py

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 绑定端口:

s.bind(('127.0.0.1', 9999))

print('Bind UDP on 9999...')

while True:

    # 接收数据:

    data, addr = s.recvfrom(1024)

    print('Received from %s:%s.' % addr)

    s.sendto(b'Hello, %s!' % data, addr)

 

client.py

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

for datain [b'Michael', b'Tracy', b'Sarah']:

    # 发送数据:

    s.sendto(data, ('127.0.0.1', 9999))

    # 接收数据:

    print(s.recv(1024).decode('utf-8'))

s.close()

 

 
20155953-52a99fd2f1085218.png
 
 
20155953-49bd42fcf03681cb.png
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寒 暄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值