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

1.套接字的功能

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

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

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

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

2.调用套接字API的过程

基于TCP传输层协议

譬如Python的socket库,服务端

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

客户端

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

    你好,是我琉忆.PHP程序员面试笔试图书系列作者. 今天就跟大家聊聊作为一个PHP程序员,每年的跳槽季都应该怎么准备一番. 其实普遍的跳槽季总的就有2个. 分别是新年后的3-4月,还有9-10月份. ...

  2. Solution -「CF 1370F2」The Hidden Pair (Hard Version)

    \(\mathcal{Description}\)   Link (hard) & Link (easy).   这是一道交互题.   给定一棵 \(n\) 个结点的树,其中有两个是特殊结点. ...

  3. tomcat 配置https证书 ssl

    修改tomcat-conf-server.xml,原配置文件是 <Connector connectionTimeout="20000" port="8080&qu ...

  4. PhpStudy集成环境安装教程

    地址:https://www.xp.cn/ 下载软件,直接安装即可.注意路径不能带有空格.安装完成,启动后如下图: 1.数据库的小白操作:先启动服务器Apache和数据库MySQL,如箭头所示 2.可 ...

  5. 太骚了,用Excel玩机器学习

    最近发现了一个好玩的Python库,它可以将训练好的机器学习模型转换为Java.C.JavaScript.Go.Ruby,VBA 本地代码,可以让连Python和机器学习一无所知的同学也能感受预测的神 ...

  6. 【C# 线程】interLocked锁

    overview 同步基元分为用户模式和内核模式 用户模式:Iterlocked.Exchange(互锁).SpinLocked(自旋锁).易变构造(volatile关键字.volatile类.Thr ...

  7. 【C# 基础概念】静态常量和动态常量的区别

    C# 静态常量和动态常量的区别 C#中有两种常量类型分别为readonly(运行时常量)与const(编译时常量),readonly是变量的常量,const是字面量的常量本文将就这两种类型的不同特性进 ...

  8. android --一个简单的登录界面

    MainActivity.java package com.example.empty_project; import androidx.appcompat.app.AppCompatActivity ...

  9. MySQL:Win10系统中设置默认编码为UTF-8

    Win10 系统下 Mysql 字符集(utf8)的设置 补充: 在[mysqld]下添加语句:init_connect='SET collation_connection = utf8_unicod ...

  10. QT ——TCP接收到的数据出现乱码情况

    这个项目是写一个利用TCP来传输.bin的并文件,接收端是将接收到的.bin并文件直接在串口助手中进行读取. 但是从读取的结果来看发现传输过来得数据是错误的,与原数据不相符,由于服务端是直接对并文件在 ...