网络编程: 基于TCP协议的socket, 实现一对一, 一对多通信
2024-09-01 17:59:43
TCP协议 面向连接 可靠的 面向字节流形式的
tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端
TCP协议编码流程:
服务器端: 客户端
实例化对象 实例化对象
绑定IP地址和端口号
监听
接收客户端的连接 连接服务器
收发 收发
关闭 关闭
问题:有的同学在重启服务端时可能会遇到
解决方法:
#加入一条socket配置,重用ip和端口
import socket
from socket import SOL_SOCKET,SO_REUSEADDR
sk = socket.socket()
sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加
sk.bind(('127.0.0.1',8898)) #把地址绑定到套接字
sk.listen() #监听链接
conn,addr = sk.accept() #接受客户端链接
ret = conn.recv(1024) #接收客户端信息
print(ret) #打印客户端信息
conn.send(b'hi') #向客户端发送信息
conn.close() #关闭客户端套接字
sk.close() #关闭服务器套接字(可选)
tcp三次握手: 一定是client先发起请求
a 客户端发起请求连接服务器
b 服务器返回:接收到请求,并要求连接客户端
c 客户端回复:可以连接
四次挥手: 谁先发起断开连接的请求都可以
a 客户端发起断开连接的请求:
意思是: 我想和你断开连接,我没有数据要继续发送了,但是如果你有数据需要发送,我可以继续接收
b 服务器回复 : 我接收到你的请求了
c 服务器发送 : 我已经准备好断开连接了
d 客户端回复 : 收到你的信息,断开连接
tcp实现的一个聊天室, 可以实现一对多,但是必须断掉别人的连接, 然后才能和下一个人聊,本质还是一对一
只是创建一个死循环,让服务器一直处于待机状态
while 1:
conn,addr = sk.accept()
import socket sk = socket.socket()
sk.bind(('127.0.0.1',8888))
sk.listen() while 1: conn,addr = sk.accept() msg_r = conn.recv(1024)
if msg_r.decode('utf-8') != 'q':
print(msg_r.decode('utf-8')) else:
break msg_s = input('>>>')
if msg_s != 'q':
conn.send(msg_s.encode('utf-8'))
else:
conn.send(msg_s.encode('utf-8'))
break
sever1
import socket name = input('请输入你的名字:\n') sk = socket.socket()
sk.connect(('127.0.0.1', 8888)) while 1: msg_s = input('>>>')
if msg_s != 'q':
sk.send((name + msg_s).encode('utf-8'))
else:
sk.send(msg_s.encode('utf-8'))
break msg_r = sk.recv(1024)
if msg_r != 'q':
print(msg_r.decode('utf-8'))
else:
break sk.close()
client1
import socket name = input('请输入你的名字:\n') sk = socket.socket()
sk.connect(('127.0.0.1', 8888)) while 1: msg_s = input('>>>')
if msg_s != 'q':
sk.send((name + msg_s).encode('utf-8'))
else:
sk.send(msg_s.encode('utf-8'))
break msg_r = sk.recv(1024)
if msg_r != 'q':
print(msg_r.decode('utf-8'))
else:
break sk.close()
client2
最新文章
- Android优秀学习资料(高手博客
- Android控件属性大全(转)
- JavaScript严谨模式(Strict Mode)
- Java Web 设置默认首页
- [GDAL]GEOS和Proj4编译
- 常用的几种 SQLServer 分页查询方式实现
- 398. Random Pick Index
- Microsoft Jet 数据库引擎找不到对象'Sheet1$_'。请确定对象是否存在,并正确地写出它的名称和路径
- .net程序在无.net环境下运行
- 部署JForum 2.1.9遇到的问题及解决方法
- Azure中block和Page的比较 Azure: Did You Know? Block vs Page Blobs
- javascript中call()、apply()的区别
- hive自定义函数
- Linux之cat的使用
- IntelliJ IDEA 下的svn配置及使用
- Codeforces.838E.Convex Countour(区间DP)
- 统计代码执行时间,使用Stopwatch和UserProcessorTime的区别
- 得到scp命令的完整路径
- 监控分析——Web中间件
- (笔试题)删除K位数字