socket:是在应用层和传输层之间的一个抽象层,它把TCP/IP层的复杂的操作封装抽象,并提供一些接口供应用层调用

套接字:被设计用于同一台主机上多个应用程序之间的通信,被称为进程之间通信或IPC
  基于文件类型的套接字:AF_UNIX
    UNIX一切皆文件,基于文件的套接字调用的就是底层文件系统来抓取数据,两个套接字进程运行在同一机器
    可以访问同一文件系统间接完成通信
  基于网络类型的套接字:AF_INET

套接字工作流程

套接字工作流程:服务端先初始化socket(),然后与端口进行绑定bind(),对端口监听listen(),调用accept()阻塞,
  直到等到客户端连接,这时如果客户端初始化一个socket(),然后连接服务器connect(),如果连接成功,则客户端和服务端建立连接。
  客户端发送请求,服务端接收请求并处理请求,然后把处理的数据回复给客户端,客户读取数据,最后关闭连接,交互结束

基于tcp协议的套接字:tcp是基于链接的,必须先启动服务端,再启动客户端

#服务端
import socket ip_port = ("127.0.0.1", 8000)
back_log = 5
buffer_size = 1024 phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 参数分别为(基于网络通讯,TCP协议),表示基于TCP协议的网络通讯
phone.bind(ip_port) # 参数为IP地址和端口号,以元组的形式放进参数里,且IP地址是字符串
phone.listen(back_log) # 表示当前可以有几个链接
print("--->")
while True: #设定循环,可以接收多个链接
conn, addr = phone.accept( ) # 等待客户端信息,得到两个数据,一个是(对方的链接,一个是对方的通讯地址),元组形式 while True: #循环,服务端和客户端能循环多次的传输数据
try: #客户端断开链接时,服务端也会断开链接,这时循环时就会出现异常,需要处理异常
data = conn.recv(buffer_size) # 接收客户端信息,参数代表可以接收多少字节,得到的是二进制形式的数据
print("接到客户端信息:", data.decode("utf-8"))
conn.send(data.upper( )) # 向客户端回传信息
except Exception:
break
conn.close() phone.close()
#客户端
import socket
ip_port = ("127.0.0.1",8000)
back_log = 5
buffer_size = 1024 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.connect(ip_port) #链接服务端 while True:
msg = input(">>>")
if not msg:continue #输入为空时,可以send到自己的缓存中,但os不会将空发给硬件,对方便recv不到数据
phone.send(msg.encode("utf-8")) #向服务端传内容,传输的是二进制格式
data = phone.recv(buffer_size) #获取服务端传回的内容
print("收到服务端发来的消息:",data) phone.close()

补充1:

应用程序和os都是先加载到缓存再使用,所有操作都是对缓存读取和传输数据,只有os才可以操作硬件

应用程序将数据send到缓存中,然后由os操作传给硬件,再进行网络传输,对方在recv到(recv也是从缓存中recv数据)

如果send的数据为空,可以send到自己的缓存中,但recv不到空

补充2:

对于服务端来说,客户端断开链接,服务端accept不到链接,就会出现异常,程序就会停止,可以加个异常处理

补充3:

有时重启服务端时会出现异常:address already in use,这是断开链接时进入四次挥手,但time_wait状态在占用地址

可以加一个socket配置,重用IP和端口

在phone.bind()前加一个phone.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)

基于udp协议的套接字:udp是无链接传输,先启动哪边都不会报错,可以实现并发,同时与多个客户端通讯

from socket import *         #将socket下的所有属性都导入过来,这样可以直接使用属性

ip_port = ("127.0.0.1",8080)
buffer_size = 1024 udp_server = socket(AF_INET,SOCK_DGRAM) #DGRAM表示数据报式套接字
udp_server.bind(ip_port) while True:
data,addr = udp_server.recvfrom(buffer_size) #接收到客户端发过来是数据加客户端的IP和端口
print(data,addr)
udp_server.sendto(data.upper(),addr) #无链接需要指定客户端的IP和端口
from socket import *

ip_port = ("127.0.0.1",8080)
buffer_size = 1024 udp_client = socket(AF_INET,SOCK_DGRAM) while True:
msg = input(">>")
udp_client.sendto(msg.encode("utf-8"),ip_port) #sendto需要指定发送到哪个IP和端口
data,addr = udp_client.recvfrom(buffer_size)
print(data.decode("utf-8")) udp_client.close()

补充1:

udp协议send一个空,依然可以fevcfrom到一个空

基于tcp和udp协议的套接字的更多相关文章

  1. 网络编程----socket介绍、基于tcp协议的套接字实现、基于udp协议的套接字实现

    一.客户端/服务器架构(C/S架构)                                                即C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架 ...

  2. 基于tcp/udp协议的套接字通信

    目录 一.套接字分类 二.套接字的工作流程 三.基于tcp协议的套接字 四.基于udp协议的套接字 一.套接字分类 1.基于文件类型的套接字家族:AF_UNIX 2.基于网络类型的套接字家族:AF_I ...

  3. 网络编程(基于udp协议的套接字/socketserver模块/进程简介)

    一.基于UDP协议的套接字 TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据.相对TCP,UDP则是面向无连接的协议. 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就 ...

  4. 基于udp协议的套接字及udp协议粘包问题

    udp协议的套接字 udp协议传输  服务端和客户端没有建立连接一说. import socket # 总结一下基础工作流程:服务端生成套接字并绑定ip_port,进入数据传输循环,服务端接受客户端发 ...

  5. 网络编程基础:粘包现象、基于UDP协议的套接字

    粘包现象: 如上篇博客中最后的示例,客户端有个 phone.recv(2014) , 当服务端发送给客户端的数据大于1024个字节时, 多于1024的数据就会残留在管道中,下次客户端再给服务端发命令时 ...

  6. 网络编程(四)--基于udp协议的套接字、socketserver模块

    一.UDP协议(数据报协议) 1.何为udp协议 不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包. 以太网头 ip头                  ...

  7. 网络编程之基于UDP协议的套接字编程、基于socketserver实现并发的socket

    目录 基于UDP协议的套接字编程 UDP套接字简单示例 服务端 客户端 基于socketserver实现并发的socket 基于TCP协议 server类 request类 继承关系 服务端 客户端1 ...

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

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

  9. 网络编程(四)——基于udp协议的套接字socket、socketserver模块的使用

    基于udp协议的套接字.socketserver模块 一.UDP协议(数据报协议) 1.何为udp协议 不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包. ...

随机推荐

  1. i++ 是线程安全的吗

    相信很多中高级的 Java 面试者都遇到过这个问题,很多对这个不是很清楚的肯定是一脸蒙逼.内心肯定还在质疑,i++ 居然还有线程安全问题?只能说自己了解的不够多,自己的水平有限. 先来看下面的示例来验 ...

  2. 阿里菜鸟知识储备之二——git工具学习

    具体的可以参见这篇博客: http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 1,什么 ...

  3. php中用生成的公钥、私钥进行加密解密

    $private_key = '-----BEGIN RSA PRIVATE KEY-----MIICXQIBAAKBgQDpoODVtnSztGyb//p+g/Ob36jb3jzWzS2qovOjp ...

  4. spring boot + mybatis + layui + shiro后台权限管理系统

    后台管理系统 版本更新 后续版本更新内容 链接入口: springboot + shiro之登录人数限制.登录判断重定向.session时间设置:https://blog.51cto.com/wyai ...

  5. tomcat打开失败原因

    我重装系统以后,tomcat无法打开,原因是有的项目的虚拟路径有误 到server.xml下修改虚拟路径

  6. eclipse导入工程

    一般项目配置信息完全可直接导入,即import 如果缺失.project等文件,eclipse无法识别,则将工程拷贝到工作空间目录下,在eclipse中新建一个同名工程即可

  7. 【奇技淫巧】使用 SSH 转发 Sock5 流量

    标题:使用 SSH 转发 Sock5 流量 日期:2018-06-27 介绍:使用 ssh 来做个 sock5 的代理,穿透到内网中做后渗透 0x01. 基本信息 在 ubuntu(10.211.55 ...

  8. js验证:密码只能为大写字母+小写字母+数字的8至15位字符组合

    var reg = /^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[a-zA-Z0-9]{8,15}$/; // alert(password); if(reg.test(pa ...

  9. 中国MOOC_零基础学Java语言_第3周 循环_2数字特征值

    2 数字特征值(5分) 题目内容: 对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值.对于一个整数,从个位开始对每一位数字编号,个位是1号,十位是2号,以此类推.这个整数在第n位上的数字记作 ...

  10. C# user32.dll找窗口时,使用GetClass方法解决 【带有系统自动编译的窗体类后缀名】 问题

    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] static extern int G ...