TCP协议

在连接内多和客户端说几句

#server端
import socket
sk = socket.socket()
sk.bind(('127.0.0.1',9001))
sk.listen() while True
conn,addr = sk.accept()
while True
bad = input('>>>')
conn.send(bad.encode('utf-8'))
if bad.upper() == 'Q':
break
msg = conn.recv(1024).decode('utf-8')
if msg.upper == 'Q':break
print(msg)
conn.close() #挥手 断开连接 sk.close() #归还申请的操作系统资源
#client
import socket
sk = socket.socket()
sk.connect(('127.0.0.1',9001)) while True:
msg = sk.recv(1024)
msg2 = msg.decode('utf-8')
if msg2.upper == 'Q':break
print(msg2)
send_msg = input('>>>')
sk.send(send_msg.encode('uft-8'))
if send_msg.upper == 'Q':break
sk.close()

为什么要加while True

  1. 因为要进行多次通信

sk代表什么?

  1. sk代表启用的通信服务

conn代表什么?

  1. conn代表自己的IP地址,和对方的地址和端口

能够接受多个客户端的请求

  1. 为什么加while True

    1. 因为在一个客户端断开连接之后不能管不服务,要等待另一个客户端连接
  2. 怎么退出
    1. 在接收或者传输的时候先检查是不是要退出,要是退出的话就break

UDP协议

语法:

#server
import socket
sk = socket.socket(tyep = socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',9000)) msg,addr = sk.recvfrom(1024)
print(msg.decode('utf-8'))
msg = input('>>>')
sk.sendto(msg.encode('utf-8'),addr) #client
import socket
sk = socket.socket(type = socket.SOCK_DGRAM)
server = ('127.0.0.1',9000)
while True:
msg = input('>>>')
if msg.upper == 'Q':break
sk.sendto(msg.encode('utf-8'),server)
msg = sk.recv(1024).decode('utf-8')
if msg.upper() == 'Q':break
print(msg)

涉及到的新方法

  1. type = socket.SOCK_DGRAM 在开启socket方法的时候加上这段代码,表示就是用UDP协议
  2. recvfrom:在server端接收信息的时候用recvfrom就可以把客户机的IP地址获取到

和TCP协议的区别

  1. 它可以同时建立多个连接,当一个连接断开后不会影响其他连接

粘包现象

  1. TCP协议的特点

    1. 多条消息之间没有边界,并且还有一大堆优化算法
  2. 什么叫做粘包
    1. 多条数据粘在一起
  3. 为什么会出现粘包
    1. 发送端:两条消息都很短,发送的间隔时间也非常短
    2. 接收端:多条消息由于没有及时接收,而在接收方的缓存短堆在一起导致粘包
  4. 怎么处理
#server
import struct
import socket sk = socket.socket()
sk.bind(('127.0.0.1',9001))
sk.listen() conn,addr = sk.accept()
msg1 = input('>>>').encode()
msg2 = input('>>>').encode()
blen = struct.pack('i',len(msg1))
conn.send(blen)
conn.send(msg1)
conn.send(msg2)
sk.close() #cilent
import struct
import socket sk = socket.socket()
sk.connect(('127.0.0.1',9001))
length = sk.recv(4)
length = struct.unpack('i',length)[0]
msg1 = sk.recv(length)
msg2 = sk.recv(1024)
print(msg1.decode('utf-8'))
print(msg2.decode('utf-8')) sk.close()

什么叫自定义协议

  1. 在网络传输的时候,人为的为它定制一个协议,让它遵守此项协议

struct模块怎么用

  1. struct.pack()#将一个数字转换为4个字节的数
  2. struct.unpack()#将一个4个字节的数,转化回原来的数

osi五层协议

  • 应用层
  • 传输层
    • tcp协议:效率低 面向连接、可靠、全双工的通信

      • 三次握手

        • 客户端向服务器端发送syn请求
        • 服务器端向客户端回复ack并发送syn请求
        • 客户端接收到的请求之后再回复ack表示建立连接
        • 由客户端的connect + 服务端的 close
      • 四次挥手
        • 客户端向服务端发送fin请求
        • 服务端回复ack确认
        • 服务端向客户端发送fin请求
        • 客户端回复ack
        • 由客户端的close和服务端的close
    • udp协议:效率高 无连接的、不可靠
    • 四层交换机,四层路由器
  • 网络层
    • IP协议(ipv4,ipv6)
    • 路由器、三层交换
  • 数据链路层
  • arp协议,地址解析协议 通过IP找到mac地址
  • 物理层

TCP中的粘包问题,以及用TCP和UDP实现多次聊天的更多相关文章

  1. python socket的应用 以及tcp中的粘包现象

    1,socket套接字 一个接口模块,在tcp/udp协议之间的传输接口,将其影藏在socket之后,用户看到的是socket让其看到的. 在tcp中当做server和client的主要模块运用 #s ...

  2. 第二十八天- tcp下的粘包和解决方案

    1.什么是粘包 写在前面:只有TCP有粘包现象,UDP永远不会粘包 1.TCP下的粘包 因为TCP协议是面向连接.面向流的,收发两端(客户端和服务器端)都要有成对的socket,因此,发送端为了将多个 ...

  3. Netty 中的粘包和拆包

    Netty 底层是基于 TCP 协议来处理网络数据传输.我们知道 TCP 协议是面向字节流的协议,数据像流水一样在网络中传输那何来 "包" 的概念呢? TCP是四层协议不负责数据逻 ...

  4. python中TCP协议中的粘包问题

    TCP协议中的粘包问题 1.粘包现象 基于TCP实现一个简易远程cmd功能 #服务端 import socket import subprocess sever = socket.socket() s ...

  5. tcp协议传输中的粘包问题

    什么是粘包问题 tcp是流体协议. 其nagle算法会将数据量较小. 并且发送间隔时间较短的多个数据包合并为一个发送. 网络传输的时候是一段一段字节流的发送. 在接收方看来根本不知道字节流从何开始. ...

  6. Linux 网络编程详解五(TCP/IP协议粘包解决方案二)

    ssize_t recv(int s, void *buf, size_t len, int flags); --与read相比,只能用于网络套接字文件描述符 --当flags参数的值设置为MSG_P ...

  7. TCP通讯处理粘包详解

    TCP通讯处理粘包详解 一般所谓的TCP粘包是在一次接收数据不能完全地体现一个完整的消息数据.TCP通讯为何存在粘包呢?主要原因是TCP是以流的方式来处理数据,再加上网络上MTU的往往小于在应用处理的 ...

  8. Netty(三) 什么是 TCP 拆、粘包?如何解决?

    前言 记得前段时间我们生产上的一个网关出现了故障. 这个网关逻辑非常简单,就是接收客户端的请求然后解析报文最后发送短信. 但这个请求并不是常见的 HTTP ,而是利用 Netty 自定义的协议. 有个 ...

  9. 什么是 TCP 拆、粘包?如何解决(Netty)

    前言 记得前段时间我们生产上的一个网关出现了故障. 这个网关逻辑非常简单,就是接收客户端的请求然后解析报文最后发送短信. 但这个请求并不是常见的 HTTP ,而是利用 Netty 自定义的协议. 有个 ...

随机推荐

  1. jquery ready和window onload区别

    window onload是指标签加载完成,并且标签资源加载完成: jquery ready是指标签加载完成,标签资源可能未加载完成 $(document).ready(function(){});= ...

  2. Java Class SecurityManager

    # 前言 简单了解 SecurityManager.具体查阅 API. # What 它是 Java 沙盒模型控制安全的重要一个环节.它是 Java 的一个类.下面一段话源于SecurityManag ...

  3. VMNET 工作站

    nattunnel 快速连接内网电脑 内网穿透.内网映射,支持微信小程序本地开发 支持WEB.远程桌面.多种TCP协议 官方主页:http://www.vmnet.cc 用途 一个可以快速连接局域网中 ...

  4. 深入理解Amazon Alexa Skill(二)

    理解skill调用 本节来更详细的讨论alexa是如何确定调用哪个skill的. 参考:https://developer.amazon.com/zh/docs/custom-skills/under ...

  5. C# Oracle数据库操作类

    using System; using System.Data; using System.Collections.Generic; using System.Configuration; using ...

  6. 零元学Expression Blend 4 - Chapter 3 熟悉操作第一步(制作一个猴子脸)

    原文:零元学Expression Blend 4 - Chapter 3 熟悉操作第一步(制作一个猴子脸) 本篇内容会教你如何使用笔刷.钢笔.渐层以及透明度的调整,还有如何转化图层和路径,最重要的是要 ...

  7. WPF使用Font-Awesome字体

    官方网站:https://fontawesome.com/ 使用教程: 学习WPF——使用Font-Awesome图标字体 - liulun - 博客园https://www.cnblogs.com/ ...

  8. AndroidStudio下的依赖管理

    在开发中用第三方库是很常见的事,如何在AndroidStudio下管理这些依赖呢?这就是这篇文章的目的. 目录 Maven/Ivy仓库依赖 Module依赖 aar文件依赖 jar文件依赖 例子完整代 ...

  9. Python中实现switch分支结构

    Python不像C/C++,Java等有switch-case的语法.不过其这个功能,比如用Dictionary以及lambda匿名函数特性来替代实现. 实现方法分为两步: 首先,定义一个字典: 其次 ...

  10. Redaht7/Oracle Linux7 + ORA11g : ohasd fails to start(Doc ID 1959008.1)

    APPLIES TO: Oracle Database - Standard Edition - Version 11.2.0.4 to 12.1.0.1 [Release 11.2 to 12.1] ...