tcp总结与简单实现
一、TCP简介
1. TCP介绍
1)TCP协议,传输控制协议(Transmission Control Protocol,缩写为 TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议
 2)tcp通信的三个步骤
    创建连接、数据传输、终止连接
2. TCP特点
 
 1)面向连接
 1. 通信双方必须先建立连接才能进行数据的传输
 2. 双方间的数据传输都可以通过这个连接进行,完成数据交换后,双方断开此连接,以释放系统资源
 3. 连接是一对一的,因此TCP不适用于广播的应用程序,基于广播的应用程序请使用UDP协议
2)可靠传输,通过一套机制来实现可靠传输
 1. 发送应答机制
 2. 超时重传
 3. 错误校验
 4. 流量控制-阻塞管理
3)基于字节流的:以字节流的形式传递给目标主机
3. TCP与UDP的不同点
 - 面向连接
 - 有序数据传输
 - 重发丢失的数据包
 - 舍弃重复的数据包
 - 无差错的数据传输
 - 阻塞/流量控制
4.tcp与upd使用场景:
1) udp:  广播数据时, 用udp   当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP ,比如QQ语音,QQ视频
 2) tcp: tcp比udp更安全,稳定,但是速度没有udp那么快,使用场景非常多;
 例如: http传输,文件传输,要求比较高的数据传输都会用tcp,目前大部分的传输都是基于tcp协议传输
5. UDP与TCP的通信模型 
  
 1) udp通信模型
 udp通信模型中,在通信开始之前,不需要建立相关的连接,只需要发送数据即可,类似于生活中,"写信"",没有严格的客户端和服务端之分
        
 2) tcp通信模型
 tcp通信模型中,在通信开始之前,一定要先建立相关的连接,才能发送数据,类似于生活中,"打电话"",tcp有严格的客户端与服务端之分
二、TCP网络程序-客户端
1. TCP客户端实现流程
 tcp流程步骤:
 1)创建tcp socket客户端对象
 2)与服务端建立连接
 3)收发数据(读写数据)
 4)关闭连接
2.示例代码:
  import socket
    # 创建socket
    tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 目的信息
    server_ip = input("请输入服务器ip:")
    server_port = int(input("请输入服务器port:"))
    # 连接服务器
    tcp_client_socket.connect((server_ip, server_port))
    # 提示用户输入数据
    send_data = input("请输入要发送的数据:")
    tcp_client_socket.send(send_data.encode("utf-8"))
    # 接收对方发送过来的数据,最大接收1024个字节
    recv_data = tcp_client_socket.recv(1024)
    print('接收到的数据为:', recvData.decode('gbk'))
    # 关闭套接字
    tcp_client_socket.close()
三、TCP网络程序-服务端
1. TCP服务端创建及实现流程 
 tcp流程步骤:
 1)创建一个server_socket ,用于监听客户端的请求
 2)绑定端口
 3)server_socket开启监听listen,server_socket由主动模拟模式变为被动连接模式
 4)等待接收客户端的连接请求,一有客户端的连接请求,立即接受,并且创建一个与客户端socket对接的socket,新创建的socket用来与客户端的socket进行通信
 5)使用新创建的socket与客户端的socket进行通信(收发数据)
 6)关闭新创建的socket,该socket关闭后, 不再与当前客户端通信,结束与当前客户端的通信
 7)关闭server_socket,该server_socket关闭后,不再接收新的客户端请求
2.示例代码:
  import socket
    # 创建socket
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 本地信息
    address = ('', 8090)    # 元组
    # 绑定端口,tcp服务端必须绑定端口
    tcp_server_socket.bind(address)
    # 使用socket创建的套接字默认的属性是主动的,使用listen将其变为被动的,这样就可以接收别人的连接请求
    tcp_server_socket.listen(5) # backlog=5 表示积压的客户端连接请求最多5个, 超过5个,则拒绝连接
    # 如果有新的客户端来连接服务器,那么就产生一个新的套接字专门为这个客户端服务
    # client_socket用来为这个客户端服务
    # tcp_server_socket就可以省下来专门等待其他新客户端的连接
    client_socket, client_addr = tcp_server_socket.accept()
    # 接收对方发送过来的数据
    recv_data = client_socket.recv(1024)  # 最多接收1024个字节
    print('接收到的数据为:', recv_data.decode('gbk'))
    # 发送一些数据到客户端
    client_socket.send("thank you !".encode('gbk'))
    # 关闭为这个客户端服务的套接字,只要关闭了,就意味着为不能再为这个客户端服务了,如果还需要服务,只能再次重新连接
    client_socket.close()
tcp总结与简单实现的更多相关文章
- PHP Swoole-Demo TCP服务端简单实现
		tcp 服务端简单demo与client . <?php /** * author : rookiejin <mrjnamei@gmail.com> * createTime : 2 ... 
- JAVA基础知识之网络编程——-基于TCP通信的简单聊天室
		下面将基于TCP协议用JAVA写一个非常简单的聊天室程序, 聊天室具有以下功能, 在服务器端,可以接受客户端注册(用户名),可以显示注册成功的账户 在客户端,可以注册一个账号,并用这个账号发送信息 发 ... 
- TCP/IP协议简单介绍
		TCP/IP协议族总共分为四层,分别为: 应用层:应用层协议有Telnet(远程登入协议).FTP(文件传输协议).SMTP(简单邮件传送协议).SNMP(简单网络管理协议).HTT ... 
- java 网络编程之TCP通信和简单的文件上传功能
		*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ... 
- python使用tcp实现一个简单的下载器
		上一篇中介绍了tcp的流程,本篇通过写一个简单的文件下载器程序来巩固之前学的知识. 文件下载器的流程如下: 客户端: 输入目标服务器的ip和port 输入要下载文件的名称 从服务器下载文件保存到本地 ... 
- 基于Tcp协议的简单Socket通信实例(JAVA)
		好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~ 今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些网络编程的基础,这里就不提了,只记录最简单易懂实用的东西. ... 
- TCP通讯模型简单示例
		1. TCP通讯模型 2. 服务器端 ① 创建socket,用函数socket() ② 绑定IP地址.端口号等信息到socket上,用函数bind() ③ 设置允许的最大连接数,用函数listen() ... 
- 使用网络TCP搭建一个简单文件下载器
		说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 目录 一丶项目介绍 二丶服务器Server 三丶测试TCP server服务器 四丶客户端Client 五丶测试客户端向服务器下载 ... 
- http协议跟tcp协议的简单理解
		在说明这两个协议之前,我们先简单说一下网络的分层. 1)应用层 支持网络应用,应用协议仅仅是网络应用的一个组成部分,运行在不同主机上的进程则使用应用层协议进行通信.主要的协议有:http.ftp.te ... 
- python3实现TCP协议的简单服务器和客户端
		利用python3来实现TCP协议,和UDP类似.UDP应用于及时通信,而TCP协议用来传送文件.命令等操作,因为这些数据不允许丢失,否则会造成文件错误或命令混乱.下面代码就是模拟客户端通过命令行操作 ... 
随机推荐
- 微信小程序开发踩坑记
			前言 微信小程序自去年公测以来,我司也申请了一个帐号开发,春节前后开始开发,现在终于告一个段落了.谨以此文记录下踩过的坑. 坑1:scroll-view与onPullDownRefresh冲突 由于有 ... 
- Linux->Mysql安装调试
			环境准备 mysql下载地址:https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.19-linux-glibc2.12-x86_64.tar ... 
- 【Leetcode】【Medium】Linked List Cycle II
			Given a linked list, return the node where the cycle begins. If there is no cycle, return null. 解题: ... 
- AD诊断命令
			dcdiag repadmin /showrepl "启动从dc02到dc01的复制"cmd /c "repadmin /replicate dc02 dc01 dc=u ... 
- Linux入门-1 常用命令
			写在前面 当年初学Linux的时候,在网上找到nash_su大神的一套视频,讲的特别好,基础部分看了好几遍,很多知识点让我受益至今. 十分庆幸当年的选择,也十分感谢nash_su大神,祝你事事顺心,每 ... 
- python 匿名函数&装饰器
			匿名函数 关键字lambda表示匿名函数,冒号前面的x表示函数参数匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果. >>> list(map(l ... 
- 如何使git忽略某些文件或文件夹
			为什么要忽略某些文件或文件夹的变化? git作为一款项目文件变更版本管理软件,其主要功能之一就是追踪项目文件夹内各种文件及文件夹的变更情况.但是,在日常使用中,并非项目文件夹下的所有文件及文件夹变更都 ... 
- good pics
- angularJS报错$apply already in progress的原因和解决方法
			如果我们使用了AngularJS中的$scope.$apply()或者$scope.$digest(),我们很可能会遇到类似下面的错误,虽然这个错误没有太大影响,但是在日志中看起来还是很不爽的,日志中 ... 
- pypy入门:pypy的安装及使用介绍
			在做python开发的人,应该或多或少的听说过一点pypy吧.我猜.所以就不做背景介绍了,有不懂的同学可以看看这里: 1.什么是pypy: http://www.360doc.com/content/ ... 
