socket学习

时间:2020-04-22
本文章向大家介绍socket学习,主要包括socket学习使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一、Socket原理

  1. 什么是socket?
  • Socket是TCP/IP协议的一组API,位于应用层与传输层之间;
  • Ip地址与端口的组合称作socket(套接字),例如:127.0.0.1:80就是一个套接字,可以唯一定位计算机上的一个进程;
  • Socket是传输层网络通信连接的端点,一个通信连接由一对套接字组成(可以简单的理解为两点连一线)。
  1. Socket有什么用?
  • 使程序员可以方便的调用TCP/IP协议进行通信;
  • 可以唯一的标识多个应用程序之间的传输层连接。
  1. Socket的输入输出缓冲区

每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区。write()/send() 并不立即向网络中传输数据,而是先将数据写入缓冲区中,再由TCP协议将数据从缓冲区发送到目标机器。一旦将数据写入到缓冲区,函数就可以成功返回,不管它们有没有到达目标机器,也不管它们何时被发送到网络,这些都是TCP协议负责的事情。TCP协议独立于 write()/send() 函数,数据有可能刚被写入缓冲区就发送到网络,也可能在缓冲区中不断积压,多次写入的数据被一次性发送到网络,这取决于当时的网络情况、当前线程是否空闲等诸多因素,不由程序员控制。read()/recv() 函数也是如此,也从输入缓冲区中读取数据,而不是直接从网络中读取。

这些I/O缓冲区特性可整理如下:

  • I/O缓冲区在每个TCP套接字中单独存在;
  • I/O缓冲区在创建套接字时自动生成;
  • 即使关闭套接字也会继续传送输出缓冲区中遗留的数据;
  • 关闭套接字将丢失输入缓冲区中的数据。

参考

二、Socket使用

  1. Python中创建socket服务端:
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((host, port))
sock.listen()
clientsocket, addr = sock.accept()
  • socket.AF_INET表示使用IPv4协议;socket.SOCK_STREAM表示使用TCP协议,此外还有socket.SOCK_DGRAM表示使用UDP协议;
  • sock.bind()绑定socket到某地址,如果为0.0.0.0则表示任意地址可以连接;
  • sock.listen()使socket开始监听连接;
  • sock.accept()等待接受连接,该函数会阻塞程序,如果有连接进入,会返回接入客户端的socket和地址。
  1. Python中连接socket:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
  • 建立一个客户端socket,同样使用socket.AF_INET, socket.SOCK_STREAM参数
  • 上述代码中s.connect((host,port))连接到特定的socket(这里为host:port)。
  1. 对host参数做一点说明:
  • 服务器端bind((host, port))函数中的host指代的应该是客户端的ip地址,因此如果设置为127.0.0.1则只有本机的客户端才能连接到服务端socket(虽然在看到的各种文章中貌似这都是共识,但是我在理解和使用的过程中还是出现过疑惑);
  • 客户端connect((host, port))函数中的host指代的是服务端的ip地址。

三、其他

  • socket在实际应用中一般是与多路复用技术一起使用的,在python中可以使用selectors包。

python3 selectors包学习记录

  • 对于现代的程序员来说,越来越不需要了解这些比较底层的知识了,但是我恰恰觉得这些底层的知识是最应该去好好学习的了。不管任何技术都不可能凭空出现,都是它们是在底层技术的基础上建立起来的,如果我们对底层的原理了解的足够多,那么以后遇到任何新技术,都可以很快掌握它们的实现原理,达到举一反三的效果。
  • 在项目中进行学习才会有学习的动力,在学习的过程中做好总结和输出才能更好的掌握。
  • 最后推荐一篇很好的socket教程点这里

原文地址:https://www.cnblogs.com/sniperd/p/12752423.html