所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口。

1.套接字的功能

传输层真正连接的是套接字,通过套接字将数据发送给特定的进程。套接字位于传输层及应用层之间,是一个应用编程接口,应用程序通过调用此接口进行传输接收数据。

传输层如何标识套接字:通过ip地址+端口号标识套接字,套接字绑定了主机端口号,ip地址对应相应的主机,进程监控相应端口

注意:一台主机上一个端口号只能对应一个进程,一个进程可以监控多个端口

所以网上给的定义:套接字=ip地址+端口号,ip地址及端口号会封装到传输层的数据(报文)中

2.调用套接字API的过程

基于TCP传输层协议

譬如Python的socket库,服务端

  1. 1 # -*- coding: utf-8 -*-
  2. 2 import socket
  3. 3 import sys
  4. 4 def socket_service_data():
  5. 5 name = socket.gethostname()
  6. 6 HOST = socket.gethostbyname(name) # 获取阿里云服务器私网IP,使用ifconfig可查询
  7. 7 PORT = 60000 #安全组中设置
  8. 8 try:
  9. 9 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  10. 10 s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  11. 11 # s.bind(('127.0.0.1', 6666)) # 在同一台主机的ip下使用测试ip进行通信
  12. 12 s.bind((HOST, PORT)) #在不同主机或者同一主机的不同系统下使用实际ip
  13. 13 s.listen(10)
  14. 14 except socket.error as msg:
  15. 15 print(msg)
  16. 16 sys.exit(1)
  17. 17
  18. 18 print("Wait for Connection..................")
  19. 19
  20. 20 while True:
  21. 21 sock, addr = s.accept()
  22. 22 buf = sock.recv(1024) #接收数据
  23. 23 buf = buf.decode() #解码
  24. 24 print("The data from " + str(addr[0]) + " is " + str(buf))
  25. 25 print("Successfully")
  26. 26 # return buf
  27. 27 sock.close()
  28. 28 if __name__ == '__main__':
  29. 29 socket_service_data()

客户端

  1. 1 import socket
  2. 2 import sys
  3. 3 def sock_client_data():
  4. 4 while True:
  5. 5 try:
  6. 6 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  7. 7 s.connect(('192.168.112.8', 60000)) #服务器和客户端在不同的系统或不同的主机下时使用的ip和端口,首先要查看服务器所在的系统网卡的ip
  8. 8 # s.connect(('127.0.0.1', 6666)) #服务器和客户端都在一个系统下时使用的ip和端口
  9. 9 except socket.error as msg:
  10. 10 print(msg)
  11. 11 print(sys.exit(1))
  12. 12 data = input("input data:") #输入要传输的数据
  13. 13 s.send(data.encode()) #将要传输的数据编码发送,如果是字符数据就必须要编码发送
  14. 14 s.close()
  15. 15 if __name__ == '__main__':
  16. 16 sock_client_data()

基于UDP传输层协议

常用的Socket API函数

  1. scoket():创建并返回套接字
  2. bind():套接字绑定本地端口

3.套接字的分类

主要是根据传输层两个协议划分的:

1.流式套接字。基于TCP,TCP协议是将数据看作无记录无边界的字节流,实现数据无差错、无重复的传输。所以称接受此类数据的套接字为流式套接字,内设流量控制。

2.数据报套接字。基于UDP,数据包以独立的形式发送传输过程数据可能被丢失。所以称接收此类数据的套接字为数据报套接字。

3.原始套接字。该套接字允许对较低层协议(如IP或ICMP)进行直接访问。基本上很少用。

参考:https://blog.csdn.net/shang_0122/article/details/104273944

Python库官方文档

计算机网络:套接字(Socket)| Python socket实现服务器端与客户端通信,使用TCP socket阿里云ECS服务器与本机通信的更多相关文章

  1. 阿里云ECS服务器socket无法连接的问题

    把自己的项目部署到阿里云ecs服务器之后,只有127.0.0.1才能连接到服务器端,检查了阿里云安全组规则,以及socket绑定的地址无误后,发现没有开启服务器防火墙的对应端口. firewall-c ...

  2. 使用sshtunnel实现python公网连接阿里云mongo服务器

    背景: 公司使用阿里云的云数据库MongoDB.基于安全原因考虑,阿里云MongoDB云数据库目前只支持从阿里云ECS上访问,无法通过公网直接访问,不方便用户在本地开发环境里直接进行测试. 阿里云官方 ...

  3. C#编程 socket编程之udp服务器端和客户端

    基于Udp协议是无连接模式通讯,占用资源少,响应速度快,延时低.至于可靠性,可通过应用层的控制来满足.(不可靠连接) 使用Udp协议通讯需要具备以下几个条件: (1).建立一个套接字(Socket) ...

  4. Python pip 下载速度慢? Windows 设置 国内源,用 阿里云 国内镜像 加速

    pip 提供了对 Python 包的查找.下载.安装.卸载的功能,是非常方便的 Python 包管理工具.但是,令人苦恼的是 pip 在国内的下载速度非常慢,速度常常只有每秒几十 K,甚至才几 K,小 ...

  5. 手把手教你如何在阿里云ECS搭建Python TensorFlow Jupyter

    前段时间在阿里云买了一台服务器,准备部署网站,近期想玩一些深度学习项目,正好拿来用.TensorFlow官网的安装仅提及Ubuntu,但我的ECS操作系统是 CentOS 7.6 64位,搭建Pyth ...

  6. 170925_2 Python socket 创建UDP的服务器端和客户端

    [python版本]3.6 UDP服务器端: from socket import * from time import ctime host = '' port = 21567 buf_size = ...

  7. 阿里云ECS在CentOS 6.9中使用Nginx提示:nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protocol)的解决方法

    说明: 1.[::]:80这个是IPv6的地址. 2.阿里云截至到今天还不支持IPv6. 解决方式: 1.普通解决方式:开启IPv6的支持,不过这个方法在阿里云行不通. vim /etc/nginx/ ...

  8. 阿里云收集服务器性能指标的python脚本

    #!/usr/bin/python ######################################### # Function: sample linux performance ind ...

  9. Python/dotNET Redis服务连接客户端调用SET方法的同时获取Redis服务器返回的内容

    在用Python或dotNET redis客户端连接redis服务器的时候,当你调用客户端的SET方法后同时还想得到其返回的字符串,那么需要处理一下. 1. Redis Python redis客户端 ...

随机推荐

  1. Windows RestartManeger重启管理器

    介绍   重启管理器API可以消除或是减少在完成安装或是更新的过程中系统需要重启的次数.软件安装或是更新过程之所以需要重启系统的原因在于一些需要更新的文件正在被运行中的程序或服务使用.而重启管理器可以 ...

  2. c++ 子类与父类之间的类型转换

    子类与父类之间的类型转换 先给一段代码 class Base { public: int a = 10; }; class pub_Derv : public Base { Base *getBase ...

  3. Anchor-free目标检测综述 -- Keypoint-based篇

      早期目标检测研究以anchor-based为主,设定初始anchor,预测anchor的修正值,分为two-stage目标检测与one-stage目标检测,分别以Faster R-CNN和SSD作 ...

  4. [SuperSocket2.0]SuperSocket 2.0从入门到懵逼

    SuperSocket 2.0从入门到懵逼 SuperSocket 2.0从入门到懵逼 1 使用SuperSocket 2.0在AspNetCore项目中搭建一个Socket服务器 1.1 引入Sup ...

  5. 搭建sock5代理

    安装 下载脚本 wget --no-check-certificate https://raw.github.com/Lozy/danted/master/install.sh -O install. ...

  6. k8s家族Pod辅助小能手Init容器认知答疑?

    k8s家族Pod辅助小能手Init容器认知答疑? k8s集群Init 容器是一种特殊容器,职责是在Pod的生命周期中作为应用容器的前置启动容器. 在很多应用场景中,在 Pod 内的应用容器正式启动之前 ...

  7. TestNG基本使用

    TestNG简介 Testng是一套开源测试框架,是从Junit继承而来,testng意为test next generation 创建maven项目,添加依赖 <dependency> ...

  8. C#源代码的组成

    引用 using  ...表达式  i=5.i>5 语句:int i=5: 快( block ):{ }

  9. C#如何在安全的上下文中使用不安全的代码?

    文章原文:https://www.cnblogs.com/2Yous/p/4887904.html 从通常情况下来看,为了保持类型安全,默认情况C# 不支持指针算法. 不过,当你需要使用指针的时候,请 ...

  10. 文件上传漏洞之MIME类型过滤

    上传的时候修改Content-Type为image/jpeg等程序指定的类型即可. 修改为: 使用蚁剑连接测试