网络编程协议

1.osi七层模型

应用层  表示层  会话层  传输层  网络层  数据链路层  物理层

2.套接字 socket

有两类,一种基于文件类型,一种基于网络类型

3.Tcp和udp协议

Tcp协议:面向连接,数据可靠,传输效率低,面向字节流

 建立连接与断开连接的过程(三次握手,四次挥手)

 建立连接(三次握手):

      1.客户端先发出消息到服务端,请求连接

      2.服务端收到信息后,给客户端反馈一个信息,等待客户端回复

      3.客户端收到服务端的反馈信息后,再像服务端发出收到消息,连接建立

 断开连接(四次挥手):

      1.客户端先发出消息到服务端,请求断开连接

      2.服务端先发送一个信息,让客户端进行等待服务端处理通道中的数据

      3.服务端处理完通道中的数据,给客户端发送一个信息,表示已经处理完数据,等待客户端回复

      4.客户端收到消息后,给服务端发送一个回复信息,服务端收到后,断开连接

tcp服务端

import socket

server = socket.socket()
server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
ip_port = ("127.0.0.1",8004)
server.bind(ip_port)
server.listen(3) while 1:
conn,addr = server.accept()
while 1:
from_client_msg = conn.recv(1024)
from_client_str = from_client_msg.decode("utf-8")
print(from_client_str)
to_client_msg = input("服务输入")
conn.send(to_client_msg.encode("utf-8"))

tcp客户端

import socket

client = socket.socket()
ip_port = ("127.0.0.1",8004)
client.connect(ip_port) while 1:
to_server_msg = input("客户输入")
client.send(to_server_msg.encode("utf-8"))
from_server_msg = client.recv(1024)
print(from_server_msg.decode("utf-8"))

Udp协议:面向无连接,数据不可靠,传输效率高,面向报文

upd服务端

import socket

udp_server = socket.socket(type=socket.SOCK_DGRAM)
ip_port = ("127.0.0.1",8007)
udp_server.bind(ip_port) from_client_msg,client_addr = udp_server.recvfrom(1024) udp_server.sendto(b"gun",client_addr)
print(from_client_msg,client_addr)

upd客户端

import socket

udp_client = socket.socket(type=socket.SOCK_DGRAM)
ip_port = ("127.0.0.1",8007) udp_client.sendto(b"hello",ip_port) from_server_msg,server_addr = udp_client.recvfrom(1024)
print(from_server_msg,server_addr)

现在多用Tcp协议,这个更安全,但是Tcp长连接有一些问题, 会出现粘包现象, 这种现象是由缓冲区引起的

缓冲区:  将程序和网络解耦

输入缓冲区

输出缓冲区

Import Subprocess

sub_obj = subprocess.Popen(

‘dir’,

shell=True,

stdout=subprocess.PIPE,  #正确结果的存放位置

stderr=subprocess.PIPE   #错误结果的存放位置

 )

4.粘包

两种粘包现象:

1 连续的小包可能会被优化算法给组合到一起进行发送

2 第一次如果发送的数据大小2000B,接收端一次性接受大小为1024B,这就导致剩下的内容会被下一次recv接收到,导致结果错乱

解决粘包的方法:

方案一:由于双方不知道对方发送数据的长度,导致接收的时候,可能接收不全,或者多接收另外一次发送的信息内容,所以在发送真实数据之前,要先发送数据的长度,接收端根据长度来接收后面的真实数据,但是双方有一个交互确认的过程

方案二:

使用Struct模块,在发送前,把文件的大小打包,做成报头,把报头放在文件真实内容之前;在接收时,对发送过来的文件进行解包,然后打印文件真实内容.

打包:struct.pack(‘i’,长度)

解包:struct.unpack(‘i’,字节)

socketserver模块实现并发

  我们之前写的tcp协议的socket是不是一次只能和一个客户端通信,如果用socketserver可以实现和多个客户端通信。它是在socket的基础上进行了一层封装,也就是说底层

还是调用的socket。后面我们要写的FTP作业,需要用它来实现并发,也就是同时可以和多个客户端进行通信,多个人可以同时进行上传下载等。

服务端代码

import socketserver

class Myserver(socketserver.BaseRequestHandler):
def handle(self):
while 1:
from_client_msg = self.request.recv(1024)
print(from_client_msg.decode("utf-8"))
msg = input("服务")
self.request.send(msg.encode("utf-8")) if __name__ == '__main__':
ip_port = ("127.0.0.1",8001)
server = socketserver.ThreadingTCPServer(ip_port,Myserver)
server.serve_forever()

客户端代码

import socket

client = socket.socket()
client.connect(("127.0.0.1",8001)) while 1:
client_msg = input("客户:")
client.send(client_msg.encode("utf-8")) from_server_msg = client.recv(1024)
print(from_server_msg.decode("utf-8"))

网络编程协议(TCP和UDP协议,黏包问题)以及socketserver模块的更多相关文章

  1. 网络编程:tcp、udp、socket、struct、socketserver

    一.TCP.UDP 一.ARP(Address Resolution Protocol)即地址解析协议,用于实现从 IP 地址到 MAC 地址的映射,即询问目标IP对应的MAC地址. 二.在网络通信中 ...

  2. 网络编程协议(TCP和UDP协议,粘包问题)以及socketserver模块

    网络编程协议 1.osi七层模型 应用层  表示层  会话层  传输层  网络层  数据链路层  物理层 2.套接字 socket 有两类,一种基于文件类型,一种基于网络类型 3.Tcp和udp协议 ...

  3. 【网络编程1】网络编程基础-TCP、UDP编程

    网络基础知识 网络模型知识 OSI七层模型:(Open Systems Interconnection Reference Model)开放式通信系统互联参考模型,是国际标准化组织(ISO)提出的一个 ...

  4. 运输层协议--TCP及UDP协议

    TCP及UDP协议 按照网络的五层分级结构来看,TCP及UDP位于运输层,故TCP及UDP是运输层协议.TCP协议--传输控制协议UDP协议--用户数据报协议 多路复用及多路分解 图多路复用及多路分解 ...

  5. 《Python网络编程》学习笔记--UDP协议

    第二章中主要介绍了UDP协议 UDP协议的定义(转自百度百科) UDP是OSI参考模型中一种无连接的传输层协议,它主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成,提供面向事务 ...

  6. 网络编程[第二篇]基于udp协议的套接字编程

    udp协议下的套接字编程 一.udp是无链接的    不可靠的 而上篇的tcp协议是可靠的,会有反馈信息来确认信息交换的完成与否 基于udp协议写成的服务端与客户端,各司其职,不管对方是否接收到信息, ...

  7. 网络编程应用:基于UDP协议【实现文件下载】--练习

    要求: 基于UDP协议实现文件下载 发送方–请求–接收方发送文件–发送方接收文件 代码: 发送方: package Homework1; import java.io.File; import jav ...

  8. 网络编程应用:基于UDP协议【实现聊天程序】--练习

    要求: 使用UDP协议实现一个聊天程序 代码: 发送端: package UDP聊天程序; import java.io.IOException; import java.net.DatagramPa ...

  9. android 网络编程--socket tcp/ip udp http之间的关系

    网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层,一般编程人员接触最多的就是应用层和运输层,再往下的就是所谓的媒体层了,不是我们研究的对象. 下面是应用层.运输层,网络 ...

随机推荐

  1. 设置iptables NAT出外网

    有时候云上部署环境,不能动态自设路由,没有公网ip地址的服务器,只能通过NAT的方式出外网,下面就记录一下设置过程. 当前状态 服务器A只有一个内网IP,不能上外网,内网IP与服务器B内网相通:服务器 ...

  2. 原子操作--sync/atomic的用法

    golang 通过sync/atomic库来支持cpu和操作系统级别的原子操作.但是对要操作类型有如下要求 int32, int64,uint32, uint64,uintptr,unsafe包中的P ...

  3. 远程连接阿里云服务器出现"远程桌面,身份验证错误:要求的函数不受支持"解决办法

    ---恢复内容开始--- 更新:win10专业版用户可以看之前的的直接来,但家庭版用户用下面的好像并不能完美解决,献上在网上找到的一个终极解决办法 windows+R打开运行  输入regedit打开 ...

  4. 10-05 Java 内部类概述和讲解

    内部类的概述 /* 内部类概述: 把类定义在其他类的内部,这个类就被称为内部类. 举例:在类A中定义了一个类B,类B就是内部类. 内部的访问特点: A:内部类可以直接访问外部类的成员,包括私有. B: ...

  5. EFCore.MySql当模型遇到int[]怎么办

    我使用的是Pomole.EntityFrameworkCore.MySql 需要将旧项目中的excels表转成实体,其中有一列是json格式的int[] 当遇到第一张表的时候,我使用了这样的方法来读取 ...

  6. (转)使用 db2pd 命令进行监视和故障诊断

    原文:https://www.ibm.com/support/knowledgecenter/zh/SSEPGG_9.7.0/com.ibm.db2.luw.admin.trb.doc/doc/c00 ...

  7. (转)python通过paramiko实现,ssh功能

    python通过paramiko实现,ssh功能 1 import paramiko 2 3 ssh =paramiko.SSHClient()#创建一个SSH连接对象 4 ssh.set_missi ...

  8. es-06-java创建mapping和setting

    说实话, java的方式太繁琐, 不如直接使用DSL进行创建 1, create package com.wenbronk.elasticsearch.usage.index; import com. ...

  9. 腾讯、百度、网易游戏、华为Offer及笔经面经

    原文出处:http://bbs.yingjiesheng.com/forum.php?mod=viewthread&tid=1011893&fromuid=1745894 应届生上泡了 ...

  10. (转)Java多线程学习(吐血超详细总结)

    本文转自:http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能 ...