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

最新文章

  1. Android优秀学习资料(高手博客
  2. Android控件属性大全(转)
  3. JavaScript严谨模式(Strict Mode)
  4. Java Web 设置默认首页
  5. [GDAL]GEOS和Proj4编译
  6. 常用的几种 SQLServer 分页查询方式实现
  7. 398. Random Pick Index
  8. Microsoft Jet 数据库引擎找不到对象'Sheet1$_'。请确定对象是否存在,并正确地写出它的名称和路径
  9. .net程序在无.net环境下运行
  10. 部署JForum 2.1.9遇到的问题及解决方法
  11. Azure中block和Page的比较 Azure: Did You Know? Block vs Page Blobs
  12. javascript中call()、apply()的区别
  13. hive自定义函数
  14. Linux之cat的使用
  15. IntelliJ IDEA 下的svn配置及使用
  16. Codeforces.838E.Convex Countour(区间DP)
  17. 统计代码执行时间,使用Stopwatch和UserProcessorTime的区别
  18. 得到scp命令的完整路径
  19. 监控分析——Web中间件
  20. (笔试题)删除K位数字

热门文章

  1. 前端入门CSS(3)
  2. es6中箭头函数 注意点
  3. poj2479 Maximum sum
  4. [AIR] AIR程序调用本地默认应用程序打开本地文件
  5. javaweb+spring 项目集成异常的处理
  6. css之IE hack 方法[ IE6 - IE9]
  7. LFR benchmark graphs 人工网络生成程序
  8. 使用图片预加载,解决断网后无法从后台获取提示网络异常的logo图片的问题
  9. linux 手动释放buff/cache
  10. Linux驱动:LCD驱动框架分析