3.socket概念

socket层

理解socket

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

站在你的角度上看socket

3.套接字(socket)的发展史

套接字起源于 20 世纪 70 年代加利福尼亚大学伯克利分校版本的 Unix,即人们所说的 BSD Unix。 因此,有时人们也把套接字称为“伯克利套接字”或“BSD 套接字”。一开始,套接字被设计用在同 一台主机上多个应用程序之间的通讯。这也被称进程间通讯,或 IPC。套接字有两种(或者称为有两个种族),分别是基于文件型的和基于网络型的。

基于文件类型的套接字家族

套接字家族的名字:AF_UNIX

unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信

基于网络类型的套接字家族

套接字家族的名字:AF_INET

(还有AF_INET6被用于ipv6,还有一些其他的地址家族,不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是很少被使用,或者是根本没有实现,所有地址家族中,AF_INET是使用最广泛的一个,python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我么只使用AF_INET)

4.tcp协议和udp协议

TCP(Transmission Control Protocol)可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信(发送缓存&接收缓存)、面向字节流。使用TCP的应用:Web浏览器;电子邮件、文件传输程序。

UDP(User Datagram Protocol)不可靠的、无连接的服务,传输效率高(发送前时延小),一对一、一对多、多对一、多对多、面向报文,尽最大努力服务,无拥塞控制。使用UDP的应用:域名系统 (DNS);视频流;IP语音(VoIP)。

我知道说这些你们也不懂,直接上图。

回到顶部

四.套接字(socket)初使用

基于TCP协议的socket

tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端

server端

import socket
sk = socket.socket()
sk.bind(('127.0.0.1',8898))  #把地址绑定到套接字
sk.listen()          #监听链接
conn,addr = sk.accept() #接受客户端链接
ret = conn.recv(1024)  #接收客户端信息
print(ret)       #打印客户端信息
conn.send(b'hi')        #向客户端发送信息
conn.close()       #关闭客户端套接字
sk.close()        #关闭服务器套接字(可选)

client端

import socket
sk = socket.socket()           # 创建客户套接字
sk.connect(('127.0.0.1',8898))    # 尝试连接服务器
sk.send(b'hello!')
ret = sk.recv(1024)         # 对话(发送/接收)
print(ret)
sk.close()            # 关闭客户套接字

问题:有的同学在重启服务端时可能会遇到

解决方法:

#加入一条socket配置,重用ip和端口
import socket
from socket import SOL_SOCKET,SO_REUSEADDR
sk = socket.socket()
sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加
sk.bind(('127.0.0.1',8898))  #把地址绑定到套接字
sk.listen()          #监听链接
conn,addr = sk.accept() #接受客户端链接
ret = conn.recv(1024)   #接收客户端信息
print(ret)              #打印客户端信息
conn.send(b'hi')        #向客户端发送信息
conn.close()       #关闭客户端套接字
sk.close()        #关闭服务器套接字(可选)

基于UDP协议的socket

udp是无链接的,启动服务之后可以直接接受消息,不需要提前建立链接

简单使用

server端

import socket
udp_sk = socket.socket(type=socket.SOCK_DGRAM)   #创建一个服务器的套接字
udp_sk.bind(('127.0.0.1',9000))        #绑定服务器套接字
msg,addr = udp_sk.recvfrom(1024)
print(msg)
udp_sk.sendto(b'hi',addr)                 # 对话(接收与发送)
udp_sk.close()                         # 关闭服务器套接字

client端

import socket
ip_port=('127.0.0.1',9000)
udp_sk=socket.socket(type=socket.SOCK_DGRAM)
udp_sk.sendto(b'hello',ip_port)
back_msg,addr=udp_sk.recvfrom(1024)
print(back_msg.decode('utf-8'),addr)

qq聊天

server
client

时间服务器

server
client

socket参数的详解

socket.socket(family=AF_INET,type=SOCK_STREAM,proto=0,fileno=None)

创建socket对象的参数说明:

地址系列应为AF_INET(默认值),AF_INET6,AF_UNIX,AF_CAN或AF_RDS。
(AF_UNIX 域实际上是使用本地 socket 文件来通信)

type 套接字类型应为SOCK_STREAM(默认值),SOCK_DGRAM,SOCK_RAW或其他SOCK_常量之一。
SOCK_STREAM 是基于TCP的,有保障的(即能保证数据正确传送到对方)面向连接的SOCKET,多用于资料传送。
SOCK_DGRAM 是基于UDP的,无保障的面向消息的socket,多用于在网络上发广播信息。
proto 协议号通常为零,可以省略,或者在地址族为AF_CAN的情况下,协议应为CAN_RAW或CAN_BCM之一。
fileno 如果指定了fileno,则其他参数将被忽略,导致带有指定文件描述符的套接字返回。
与socket.fromfd()不同,fileno将返回相同的套接字,而不是重复的。
这可能有助于使用socket.close()关闭一个独立的插座。

转载于:https://www.cnblogs.com/zsdbk/p/8998464.html

day 33(套接字,TCP 与 UDP)相关推荐

  1. 基本套接字TCP和UDP

    TCP的Java支持 协议相当于相互通信的程序间达成的一种约定,它规定了分组报文的结构.交换方式.包含的意义以及怎样对报文所包含的信息进行解析,TCP/IP协议族有IP协议.TCP协议和UDP协议.现 ...

  2. socket网络编程套接字TCP/UDP两种方式详解

    目录 准备知识 源IP地址和目的IP地址 端口号与进程ID 传输层协议--TCP 传输层协议--UCP 网络字节序 socket套接字介绍 概念 常见的三种socket socket编程常见API s ...

  3. 网络编程(part10)--socket套接字编程之UDP套接字

    鄙人学习笔记 文章目录 UDP套接字编程 服务端流程 举个例子 客户端流程 举个例子 TCP套接字和UDP套接字编程区别 UDP套接字编程 服务端流程 创建数据报套接字 sockfd = socket ...

  4. python--socket套接字/TCP

    socket套接字/TCP 一 客户端/服务器架构 C/S架构,包括 硬件C/S架构(打印机) 软件C/S 架构(web服务) C/S架构的软件(软件属于应用层)是基于网络进行通信的 Server端要 ...

  5. socket套接字TCP API

    socket套接字TCP API socket概念 socket又称"套接字",是计算机网络中进程间通信数据通道的一个端点,或称之为句柄.IP地址+端口号就可以唯一确定一个sock ...

  6. 套接字基础与UDP通信

    套接字基础与UDP通信 套接字和UDP Python实现套接字编程 了解Ping命令 服务器端程序 客户机端程序 运行程序步骤 测试运行结果 问题及解决方法 代码提取 套接字和UDP    套接字是网 ...

  7. 套接字技术java_java网络编程之套接字TCP

    套接字学习 什么是套接字? 计算机网络基础知识 基于套接字的网路编程案例? 什么是套接字? 所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程 ...

  8. 套接字TCP控制台程序客户端代码示范

    套接字TCP控制台程序客户端代码示范 转载于:https://www.cnblogs.com/txwtech/p/11056770.html

  9. Day09: socket网络编程-OSI七层协议,tcp/udp套接字,tcp粘包问题,socketserver

    今日内容:socket网络编程     1.OSI七层协议     2.基于tcp协议的套接字通信     3.模拟ssh远程执行命令     4.tcp的粘包问题及解决方案     5.基于udp协 ...

最新文章

  1. oracle sqlserver 查看指定用户下面的表
  2. 在Anacoda中管理多个版本Python
  3. opencv-视频处理-实时的前景检测-Vibe算法
  4. 小米手环五怎么和微信连接不上服务器,小米手环怎么连接手机微信
  5. 我的博客今天0岁346天了,我领取了…
  6. JDK源码解析之 Java.lang.Enum
  7. matlab同步发电机外特性仿真,基于Matlab-Simulink的虚拟同步发电机控制方法的仿真研究...
  8. Git学习总结(9)——如何构建你自己的 Git 服务器
  9. 软件工程作业团队作业No.5
  10. SOLIDWORDS API修改零部件属性全部保存
  11. python opencv对颗粒的计数与计算空洞率
  12. IO流的知识点总结归纳
  13. css轮播箭头怎么隐藏,css实现带箭头和圆点的轮播
  14. html中盒子透明度代码,用CSS制作一个透明盒子
  15. h5 c3 特效网站
  16. 04_从啤酒与尿布,聊关联规则推荐
  17. 百度AI人脸识别怎么实现,图片识别,文字识别,活体检测
  18. www.crx4chrome.com
  19. linux操作系统上网本下载,veket linux系统下载
  20. ANSYS_APDL——实例006-非线性材料定义_TB命令

热门文章

  1. MariaDB Spider分库分表引擎调研
  2. 学习小米附加和大润发飞牛模式
  3. 《转》每天起床时,优秀创业者都会问自己这3个问题
  4. jota-time 练习
  5. Suse es 11sp2 双网卡冗余
  6. 通过JAVA获取优酷、土豆、酷6、6间房等视频
  7. DbHelperSQL.cs
  8. 4.1.1 网络层功能概述
  9. 如何在Zynq-7000上烧写PL Image
  10. 扫描到U盘但找不到文件