首页 > 编程语言 >网络编程-socket

网络编程-socket

时间:2024-10-31 17:10:00浏览次数:4  
标签:文件 socket sock 编程 SOCK 网络 接字 数据

1.什么是socket?

socket的意愿是“插座”,在计算机通信领域,socket被翻译为“套接字”,他是计算机之间进行通信的一种约定或者一种方式,通过socket这种约定,一台计算机可以接受其他计算机的数据,也可以向其他计算机发送数据。

我们把插头插到插座上就能从电网获得电力供应,同样,为了远程计算机进行数据传输,需要连接到因特网,而socket就是用来连接到因特网的工具。

2.Unix/Linux中的socket是什么?

在Unix/Linux系统中,为了统一对各种硬件的操作,简化接口,不同的硬件设备也都被看成一个文件,对这些文件的操作,等同于对磁盘上普通文件的操作。

UNIX/Linux中的一切都是文件

文件描述符(file descriptor)

  • 通常用 0 来表示标准输入文件(stdin),他对应的硬件设备就是键盘。
  • 通常用 1 来表示标准输出文件(stdout),他对应的硬件设备就是显示器。

Unix/Linux程序在执行任何形式的I/O操作时,都是在读取或者写入一个文件描述符,一个文件描述符只是一个和打开的文件相关联的整数,他的背后可能是一个硬盘上的普通文件、FIFO、管道、终端、键盘、显示器,甚至是一个网络连接。

我们可以通过socket()来创建一个网络连接,或者说打开一个网络文件,socket()的返回值就是文件描述符,有了文件描述符,我们就可以使用普通的文件操作函数来传输数据了。

  • 用recv()读取从远端计算机传来的数据;
  • 用write()向远程计算机写入数据;

只要使用socket()创建了连接,剩下的就是文件操作了;网络编程就是如此简单!

3.socket有哪些类型?

根据数据的传输方式,可以将Internet套接字分成两种类型,通过socket()创建连接时,必须告诉它使用哪种数据传输方式。

3.1 流格式套接字(SOCK_STREAM)

流格式套接字(stream sockets)也叫“面向连接的套接字”,在代码中使用SOCK_STREAM表示。
SOCK_STREAM是一种可靠的、双向的通信数据流,数据可以准确无误地到达另一台计算机,如果损坏或者丢失,可以重新发送。
流格式套接字有自己的纠错机制

SOCK_STREAM的特征

  • 数据在传输过程中不会消失;
  • 数据是按照传输顺传输的;
  • 数据的发送和接收不是同步的(不存在数据边界)

可以将SOCK_STREAM比喻成一条传送带,只要传送带本身没有问题(不会断网),就能保证数据不丢失;同时。较晚传送的数据不会优先到达,较早传送的数据不会晚到达,这就保证了数据是按照顺序传递的。

为什么流格式套接字可以达到高质量的数据传输呢?这是因为它使用了 TCP 协议(The Transmission Control Protocol,传输控制协议),TCP 协议会控制你的数据按照顺序到达并且没有错误。

你也许见过 TCP,是因为你经常听说“TCP/IP”。TCP 用来确保数据的正确性,IP(Internet Protocol,网络协议)用来控制数据如何从源头到达目的地,也就是常说的“路由”。

假设传送带传送的是水果,接收者需要凑齐 100 个后才能装袋,但是传送带可能把这 100 个水果分批传送,比如第一批传送 20 个,第二批传送 50 个,第三批传送 30 个。接收者不需要和传送带保持同步,只要根据自己的节奏来装袋即可,不用管传送带传送了几批,也不用每到一批就装袋一次,可以等到凑够了 100 个水果再装袋。

也就是说,不管数据分几次传送过来,接收端只需要根据自己的要求读取,不用非得在数据到达时立即读取。传送端有自己的节奏,接收端也有自己的节奏,它们是不一致的。

3.2、数据报格式套接字(SOCK_DGRAM)

数据报格式套接字(Datagram Sockets)也叫“无连接的套接字”,在代码中使用 SOCK_DGRAM 表示。
计算机只管传输数据,不作数据校验,如果数据在传输中损坏,或者没有到达另一台计算机,是没有办法补救的。也就是说,数据错了就错了,无法重传。

可以将 SOCK_DGRAM 比喻成高速移动的摩托车快递,它有以下特征:

另外,用两辆摩托车分别发送两件包裹,那么接收者也需要分两次接收,所以“数据的发送和接收是同步的”;换句话说,接收次数应该和发送次数相同。

数据报套接字也使用 IP 协议作路由,但是它不使用 TCP 协议,而是使用 UDP 协议(User Datagram Protocol,用户数据报协议)。

注意:SOCK_DGRAM 没有想象中的糟糕,不会频繁的丢失数据,数据错误只是小概率事件。

实现服务端和客户端交流的程序

server端

import socket

# 1.构建套接字对象
sock = socket.socket()

# 2.绑定:度无端的ip和端口
sock.bind(("127.0.0.1",8899))

# 3.确定最大监听数
sock.listen(3)

# 4.等待连接
while 1:
    print("等待服务器连接。。。")
    #获取客户端的套接字对象和地址
    conn,addr = sock.accept()
    print(conn,addr)

    #conn:发送消息  send 方法   接收数据 recv方法
    while 1:
        msg = conn.recv(1024)
        print(msg.decode())
        if msg.decode() == "quit":
            break
        res = input("响应>>>")
        conn.send(res.encode())

client端

import socket

# 创建客户端的套接字对象
sock = socket.socket()

# 连接服务器
sock.connect(("127.0.0.1",8899))

while 1:
    data = input(">>>")
    sock.send(data.encode())
    if data == "quit":
        break
    res = sock.recv(1024)
    print("服务器响应",res.decode())

交互
服务端

客户端

超出监听数

监听数:只包括等待连接的客户端,连接成功的客户端不算数

标签:文件,socket,sock,编程,SOCK,网络,接字,数据
From: https://www.cnblogs.com/megshuai/p/18518388

相关文章

  • socket在python下的使用
    socket在python下的使用-创建套接字对象-套接字对象方法-socket缓冲区与阻塞-粘包(数据的无边界性)-案例之模拟ssh命令-案例之文件上传1.1创建套接字对象Linux中的一切都是文件,每个文件都有一个整数类型的文件描述符;socket也可以视为一个文件对象,也有文件描述符。im......
  • Python GUI编程 tkinter编程
    tkinter编程思路比喻对于tkinter编程,主要用两个比喻来描述,重点理解容器、组件和布局管理器。 第一个,作画。我们都见过美术生写生的情景,先支一个画架,放上画板,蒙上画布,构思内容,用铅笔画草图,组织结构和比例,调色板调色,最后画笔勾勒。相应的,对应到tkinter编程,那么我们的显示屏就是支......
  • 记一次“网络安全扫描工具联动”自动化扫描漏洞流程,网络渗透必看基础教程!
    大家好,我是向阳假如你在一次攻防演练或者渗透测试中有多个攻击测试目标,一个一个去手动测试是肯定不现实的,可以先借助安全扫描工具去“自动扫描测试目标站点”的薄弱漏洞的位置,为你后续的深入测试提供事半功倍的效果。前言:随着当前网络安全威胁的不断扩展与升级,开展渗透测......
  • 【网络安全零基础入门】Linux安全加固(非常详细)零基础入门到精通,收藏这一篇就够了
    大家好,我是向阳。今天将继续带大家入门网络安全linux系统篇安全加固教程,全程干货,建议收藏哈安全加固方案原则1.版本升级对于系统和应用在使用过程中暴露的安全缺陷,系统或应用厂商会及时发布解决问题的升级补丁包。升级系统或应用版本,可有效解决旧版本存在的安全风险。......
  • Python数据类型之自定义类型——Class与面向对象编程详解
    目录引言一、面向对象编程基础二、类的定义与对象的创建三、封装性四、继承性五、多态性六、特殊方法与数据类七、使用dataclass装饰器八、面向对象编程的优势结论引言Python是一门功能强大的编程语言,其面向对象编程(OOP)的特性更是为开发者提供了极大的灵活性和......
  • 网络工程师VS其他IT职业,五大理由告诉做网工高薪稳定还过瘾!
    当你站在IT职业的分岔路口时,选择方向可能让人头疼。毕竟,IT世界里可选的角色实在太多了!软件开发、数据分析、网络工程……每条路看起来都通向一个神奇的未来。那么,为什么要选择网络工程师这条路?作为一名从业十年的“老司机”,今天就带你一探网络工程师的魅力。1.硬核却接地气:你看得见......
  • 网络流
    网络流网络流又名网络瘤。流网络流网络是一个有向图,可以表示为\(G=(V,E)\)。点集包含源点,汇点和中间点。边集当中的每条边都有一个值,称为容量。对于任意一个流网络是不考虑反向边的。可行流定义任意一个可行流都用\(f\)表示。如果给定一个流网络每条边的流量,并且满......
  • 网络安全学习路线+自学笔记(超详细)_网络安全设计权威指南 学习笔记
    01什么是网络安全网络安全可以基于攻击和防御视角来分类,我们经常听到的“红队”、“渗透测试”等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面性,例如Web安全技术,既有Web渗透,也......
  • 指尖上的编程挑战:打造技术交流新桥梁——我的微信博客小程序
    在一个风和日丽的下午,我坐在窗边,看着电脑屏幕上闪烁的光标,心中涌动着一股强烈的创作欲望。作为一名热衷于技术分享的技术博主,我发现越来越多的读者希望能够随时随地阅读我的博客文章。但是,传统的博客形式似乎有些过于单一,在手机端的体验并不理想,尤其是在碎片化的时间里浏览长篇文章......
  • 面向对象编程
    面向对象编程OOP(objectorientedprogramming)面向对象编程面向过程(按照指定函数进行调用)面向对象包括:类和对象类:类是比函数更高级的一种代码组织形式,类是一个抽象的概念,是虚拟化出来的概念。什么是类:具有相同或相似性质的对象的抽象就是类。类具有属性,它是对象的状态......