基于tcp协议通信的套接字

以打电话举例:

import socket

#1.买手机
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#SOCK_STEAM=>TCP流式协议,

#2.拨号
phone.connect(('127.0.0.1',8080))

#3.发收消息
phone.send('hello'.encode('utf-8')) # 只能发bytes类型
data=phone.recv(1024)
print('收到服务端的消息: ',data)

#4.挂电话链接
phone.close()
客户端
import socket

#1.买手机
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #SOCK_STEAM=>TCP流式协议,
print(phone) #是用来接收链接请求,从而建立链接的
# 结果:<socket.socket fd=268, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0>
#2.插手机卡
phone.bind(('127.0.0.1',8080)) #0-65535

#3.开机
phone.listen(5) # 同一时刻最大请求数为5个

print('start....')
#4.等待电话请求
conn,client_addr=phone.accept() #(双向链接的套接字对象,存放客户端ip和端口的小元组)
print(conn) # conn代表双向链接,用来收发消息
#结果:<socket.socket fd=304, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8080), raddr=('127.0.0.1', 3482)>
print(client_addr)
# 结果:('127.0.0.1', 3482)

#5.收发消息
data=conn.recv(1024) #1024接收的最大字节数bytes
print('收到客户的数据',data)
conn.send(data.upper())

#6.挂电话链接
conn.close()

#7.关机
phone.close()
服务端
服务端套接字函数
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() 创建一个与该套接字相关的文件
原文地址:https://www.cnblogs.com/zhouhao123/p/11267594.html