2018-7-22-Python全栈开发day30-socket原理与粘包-part1-TCP服务

1.服务端与客户端的循环收发消息

  在之前的程序中,客户端和服务端执行完一次收发动作后,就会关闭连接,然而现实中客户端和服务端可以实现循环收发消息。  

  解决办法:在收发过程中执行一个循环来实现循环收发

  服务端:

  

from socket import *#导入模块
tcp_server=socket(AF_INET,SOCK_STREAM)#建立socket对象
tcp_server.bind(('127.0.0.1',8080))#绑定地址
tcp_server.listen(5)#建立半连接池

conn,addr=tcp_server.accept()#准备和客户端进行连接

while 1:#建立死循环,可以无限进行收发
    data=conn.recv(1024)#data为从客户端收到的数据
    print(data)
    conn.send(data.upper())
tcp_server.close()

  客户端:

  

from socket import *
client_server=socket(AF_INET,SOCK_STREAM)#建立socket
client_server.connect(('127.0.0.1',8080))#连接地址

while 1:
    msg=input('please input something and I will give the upper')#循环收发,循环输入内容
    if msg=='quit':#判断推出循环条件
        break
    client_server.send(msg.encode('utf-8'))#因为是手动输入的内容,所以要进行编码
    data=client_server.recv(1024)#再从服务端收消息
    print(data)
client_server.close()

2.解决客户端断开连接,服务端持续收空的问题

  当客户端断开连接时,服务端并没有退出循环,而是持续从服务端的内核态缓存中读取数据,但是由于客户端并没有发来消息,所以每次收的都是空

  解决:

  

from socket import *#导入模块
tcp_server=socket(AF_INET,SOCK_STREAM)#建立socket对象
tcp_server.bind(('127.0.0.1',8080))#绑定地址
tcp_server.listen(5)#建立半连接池

conn,addr=tcp_server.accept()#准备和客户端进行连接

while 1:#建立死循环,可以无限进行收发
    data=conn.recv(1024)#data为从客户端收到的数据
    if not data:break#在这里加入,如果收不到消息,则断开

    print(data)
    conn.send(data.upper())
tcp_server.close()

3.如果客户端输入的为空,则服务端和客户端陷入停滞等待阶段

  原因:如果客户端发空,则从并没有数据从用户态转到内核态缓存中,服务端也就收不到数据,只要客户端数据输入后进行判断是否有数据进入内核态就可以

  客户端;

  

from socket import *
client_server=socket(AF_INET,SOCK_STREAM)#建立socket
client_server.connect(('127.0.0.1',8080))#连接地址

while 1:
    msg=input('please input something and I will give the upper')#循环收发,循环输入内容
    if not msg:continue
    if msg=='quit':#判断推出循环条件
        break
    client_server.send(msg.encode('utf-8'))#因为是手动输入的内容,所以要进行编码
    data=client_server.recv(1024)#再从服务端收消息
    print(data)
client_server.close()

4.基于tcp服务做一个时间服务器,带格式

  服务端:

import time
from socket import *

tcp_server = socket(AF_INET, SOCK_STREAM)  # 建立socket对象
tcp_server.bind(('127.0.0.1', 8080))  # 绑定地址
tcp_server.listen(5)  # 建立半连接池

conn,addr=tcp_server.accept()
while 1:
    data=conn.recv(1024)#输入的话那边encode
    if data =='quit':break
    conn.send(time.strftime(data.decode('utf-8'),time.localtime()).encode('utf-8'))

conn.close()
tcp_server.close()
View Code

  客户端

  

from socket import *
client_server=socket(AF_INET,SOCK_STREAM)#建立socket
client_server.connect(('127.0.0.1',8080))#连接地址

while 1:
    msg=input('please input 格式')#循环收发,循环输入内容
    if not msg:continue
    if msg=='quit':#判断推出循环条件
        break
    client_server.send(msg.encode('utf-8'))#因为是手动输入的内容,所以要进行编码
    data=client_server.recv(1024)#再从服务端收消息
    print(data.decode('utf-8'))
client_server.close()
View Code

5.TCP实现并发

  后期利用socketserver

    

转载于:https://www.cnblogs.com/hai125698/p/9351442.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值