一、套接字分类

1.基于文件类型的套接字家族:AF_UNIX

2.基于网络类型的套接字家族:AF_INEX

python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我么只使用AF_INET

二、套接字的工作流程



先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束

socket函数模块用法

  1. import socket
  2. socket.socket(socket_family,socket_type,protocal=0)
  3. socket_family 可以是 AF_UNIX AF_INETsocket_type 可以是 SOCK_STREAM SOCK_DGRAMprotocol 一般不填,默认值为 0
  4. 获取tcp/ip套接字
  5. tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  6. 获取udp/ip套接字
  7. udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  8. 由于 socket 模块中有太多的属性。我们在这里破例使用了'from module import *'语句。使用 'from socket import *',我们就把 socket 模块里的所有属性都带到我们的命名空间里了,这样能 大幅减短我们的代码。
  9. 例如tcpSock = socket(AF_INET, SOCK_STREAM)

三、基于tcp协议的套接字

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

客服端

  1. #_*_coding:utf-8_*_
  2. __author__ = 'Linhaifeng'
  3. import socket
  4. ip_port=('127.0.0.1',8081)
  5. BUFSIZE=1024
  6. s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  7. s.connect_ex(ip_port) #拨电话
  8. while True: #新增通信循环,客户端可以不断发收消息
  9. msg=input('>>: ').strip()
  10. if len(msg) == 0:continue
  11. s.send(msg.encode('utf-8')) #发消息,说话(只能发送字节类型)
  12. feedback=s.recv(BUFSIZE) #收消息,听话
  13. print(feedback.decode('utf-8'))
  14. s.close() #挂电话

服务端

  1. #_*_coding:utf-8_*_
  2. __author__ = 'Linhaifeng'
  3. import socket
  4. ip_port=('127.0.0.1',8081)#电话卡
  5. BUFSIZE=1024
  6. s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机
  7. s.bind(ip_port) #手机插卡
  8. s.listen(5) #手机待机
  9. while True: #新增接收链接循环,可以不停的接电话
  10. conn,addr=s.accept() #手机接电话
  11. # print(conn)
  12. # print(addr)
  13. print('接到来自%s的电话' %addr[0])
  14. while True: #新增通信循环,可以不断的通信,收发消息
  15. msg=conn.recv(BUFSIZE) #听消息,听话
  16. # if len(msg) == 0:break #如果不加,那么正在链接的客户端突然断开,recv便不再阻塞,死循环发生
  17. print(msg,type(msg))
  18. conn.send(msg.upper()) #发消息,说话
  19. conn.close() #挂电话
  20. s.close() #手机关机

四、基于udp协议的套接字

udp是无链接的,先启动哪一端都不会报错

udp套接字简单示例

服务端

  1. #_*_coding:utf-8_*_
  2. __author__ = 'Linhaifeng'
  3. import socket
  4. ip_port=('127.0.0.1',9000)
  5. BUFSIZE=1024
  6. udp_server_client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
  7. udp_server_client.bind(ip_port)
  8. while True:
  9. msg,addr=udp_server_client.recvfrom(BUFSIZE)
  10. print(msg,addr)
  11. udp_server_client.sendto(msg.upper(),addr)

客服端

  1. #_*_coding:utf-8_*_
  2. __author__ = 'Linhaifeng'
  3. import socket
  4. ip_port=('127.0.0.1',9000)
  5. BUFSIZE=1024
  6. udp_server_client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
  7. while True:
  8. msg=input('>>: ').strip()
  9. if not msg:continue
  10. udp_server_client.sendto(msg.encode('utf-8'),ip_port)
  11. back_msg,addr=udp_server_client.recvfrom(BUFSIZE)
  12. print(back_msg.decode('utf-8'),addr)

qq聊天(由于udp无连接,所以可以同时多个客户端去跟服务端通信)

  1. #_*_coding:utf-8_*_
  2. __author__ = 'Linhaifeng'
  3. import socket
  4. ip_port=('127.0.0.1',8081)
  5. udp_server_sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #买手机
  6. udp_server_sock.bind(ip_port)
  7. while True:
  8. qq_msg,addr=udp_server_sock.recvfrom(1024)
  9. print('来自[%s:%s]的一条消息:\033[1;44m%s\033[0m' %(addr[0],addr[1],qq_msg.decode('utf-8')))
  10. back_msg=input('回复消息: ').strip()
  11. udp_server_sock.sendto(back_msg.encode('utf-8'),addr)
  12. udp服务端
  1. #_*_coding:utf-8_*_
  2. __author__ = 'Linhaifeng'
  3. import socket
  4. BUFSIZE=1024
  5. udp_client_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
  6. qq_name_dic={
  7. '狗哥alex':('127.0.0.1',8081),
  8. '瞎驴':('127.0.0.1',8081),
  9. '一棵树':('127.0.0.1',8081),
  10. '武大郎':('127.0.0.1',8081),
  11. }
  12. while True:
  13. qq_name=input('请选择聊天对象: ').strip()
  14. while True:
  15. msg=input('请输入消息,回车发送: ').strip()
  16. if msg == 'quit':break
  17. if not msg or not qq_name or qq_name not in qq_name_dic:continue
  18. udp_client_socket.sendto(msg.encode('utf-8'),qq_name_dic[qq_name])
  19. back_msg,addr=udp_client_socket.recvfrom(BUFSIZE)
  20. print('来自[%s:%s]的一条消息:\033[1;44m%s\033[0m' %(addr[0],addr[1],back_msg.decode('utf-8')))
  21. udp_client_socket.close()
  22. udp客户端1
  1. #_*_coding:utf-8_*_
  2. __author__ = 'Linhaifeng'
  3. import socket
  4. BUFSIZE=1024
  5. udp_client_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
  6. qq_name_dic={
  7. '狗哥alex':('127.0.0.1',8081),
  8. '瞎驴':('127.0.0.1',8081),
  9. '一棵树':('127.0.0.1',8081),
  10. '武大郎':('127.0.0.1',8081),
  11. }
  12. while True:
  13. qq_name=input('请选择聊天对象: ').strip()
  14. while True:
  15. msg=input('请输入消息,回车发送: ').strip()
  16. if msg == 'quit':break
  17. if not msg or not qq_name or qq_name not in qq_name_dic:continue
  18. udp_client_socket.sendto(msg.encode('utf-8'),qq_name_dic[qq_name])
  19. back_msg,addr=udp_client_socket.recvfrom(BUFSIZE)
  20. print('来自[%s:%s]的一条消息:\033[1;44m%s\033[0m' %(addr[0],addr[1],back_msg.decode('utf-8')))
  21. udp_client_socket.close()
  22. udp客户端2

时间服务器

  1. #_*_coding:utf-8_*_
  2. __author__ = 'Linhaifeng'
  3. from socket import *
  4. from time import strftime
  5. ip_port=('127.0.0.1',9000)
  6. bufsize=1024
  7. tcp_server=socket(AF_INET,SOCK_DGRAM)
  8. tcp_server.bind(ip_port)
  9. while True:
  10. msg,addr=tcp_server.recvfrom(bufsize)
  11. print('===>',msg)
  12. if not msg:
  13. time_fmt='%Y-%m-%d %X'
  14. else:
  15. time_fmt=msg.decode('utf-8')
  16. back_msg=strftime(time_fmt)
  17. tcp_server.sendto(back_msg.encode('utf-8'),addr)
  18. tcp_server.close()
  19. ntp服务端
  1. #_*_coding:utf-8_*_
  2. __author__ = 'Linhaifeng'
  3. from socket import *
  4. ip_port=('127.0.0.1',9000)
  5. bufsize=1024
  6. tcp_client=socket(AF_INET,SOCK_DGRAM)
  7. while True:
  8. msg=input('请输入时间格式(例%Y %m %d)>>: ').strip()
  9. tcp_client.sendto(msg.encode('utf-8'),ip_port)
  10. data=tcp_client.recv(bufsize)
  11. print(data.decode('utf-8'))
  12. tcp_client.close()
  13. ntp客户端

基于tcp/udp协议的套接字通信的更多相关文章

  1. python 之 网络编程(基于UDP协议的套接字通信)

    8.5 基于UDP协议的套接字通信 UDP协议:数据报协议 特点:无连接,一发对应一收,先启动哪一端都不会报错 优点:发送效率高,但有效传输的数据量最多为500bytes 缺点:不可靠:发送数据,无需 ...

  2. (网络编程)基于tcp(粘包问题) udp协议的套接字通信

    import   socket 1.通信套接字(1人1句)服务端和1个客户端 2.通信循环(1人多句)服务端和1个客户端 3.通信循环(多人(串行)多句)多个客户端(服务端服务死:1个客户端---&g ...

  3. 基于udp协议的套接字通信

    服务端: import socket server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) server.bind(('127.0.0.1',8 ...

  4. 网络编程----socket介绍、基于tcp协议的套接字实现、基于udp协议的套接字实现

    一.客户端/服务器架构(C/S架构)                                                即C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架 ...

  5. 基于tcp和udp协议的套接字

    socket:是在应用层和传输层之间的一个抽象层,它把TCP/IP层的复杂的操作封装抽象,并提供一些接口供应用层调用 套接字:被设计用于同一台主机上多个应用程序之间的通信,被称为进程之间通信或IPC ...

  6. 网络编程(基于udp协议的套接字/socketserver模块/进程简介)

    一.基于UDP协议的套接字 TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据.相对TCP,UDP则是面向无连接的协议. 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就 ...

  7. 基于udp协议的套接字及udp协议粘包问题

    udp协议的套接字 udp协议传输  服务端和客户端没有建立连接一说. import socket # 总结一下基础工作流程:服务端生成套接字并绑定ip_port,进入数据传输循环,服务端接受客户端发 ...

  8. 网络编程基础:粘包现象、基于UDP协议的套接字

    粘包现象: 如上篇博客中最后的示例,客户端有个 phone.recv(2014) , 当服务端发送给客户端的数据大于1024个字节时, 多于1024的数据就会残留在管道中,下次客户端再给服务端发命令时 ...

  9. 网络编程(四)--基于udp协议的套接字、socketserver模块

    一.UDP协议(数据报协议) 1.何为udp协议 不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包. 以太网头 ip头                  ...

随机推荐

  1. 通过SecureCRT向远程Linux主机上传和下载文件

    有时候直接在Linux服务器上通过 wget 或 curl 工具下截比较大的网络文件时会比较慢,这时我们通常会改用在Windows平台通过迅雷等更加现代化的下载功具下好目标文件(迅雷开会员才能更高速的 ...

  2. iOS -iOS9中提示框(UIAlertController)的常见使用

    iOS 8 之前提示框主要使用 UIAlertView和UIActionSheet:iOS 9 将UIAlertView和UIActionSheet合二为一为:UIAlertController . ...

  3. 没了IDE,你的Java项目还能Run起来吗~

    计算机只能识别机器码0101...编程语言->能执行的机器码 需要经过 预处理->编译->汇编->链接->机器码过程.一个语言处理系统的示意图如下: 编译器 是将源语言程 ...

  4. [转] Git caret(^) and tilde(~)

    点击阅读原文 I spent a little bit of time playing with Git today, specifically the way that the ^ (caret) ...

  5. @uoj - 310@ 【UNR #2】黎明前的巧克力

    目录 @description@ @solution@ @accepted code@ @details@ @description@ Evan 和 Lyra 都是聪明可爱的孩子,两年前,Evan 开 ...

  6. Python变量和注释

    1.变量与变量的作用: (1)什么是变量:变量源于数学,是计算机语言中能存储计算结果或能表示值抽象概念.变量可以通过变量名访问.在指令式语言中,变量通常是可变的:在Python中变量名必须是大小写英文 ...

  7. (十一)Maven之profile实现多环境配置动态切换

    原文链接:https://www.cnblogs.com/zeng1994/p/a442108012ffd6a97b22c63055b48fe9.html 一.多环境配置文件的放置  将不同环境下的配 ...

  8. android中的逐帧动画

    在android中实现动画最简单的一种方式就是使用逐帧动画(AnimationDrawable).逐帧动画的原理同最古老的动画机制是一样的,通过快速的播放一组变化微小的图片,在人眼的视差时间下,达到一 ...

  9. 总结下c/c++的一些调试经验

    工作2年,干了一年ARM平台嵌入式,一年后台,总结下这两年开发中调试的经验.我把调试手段分成2种:打印日志和用工具分析.因为平时主要开发在Linux平台,就以GDB为例 一.打印日志 1. 合理设置日 ...

  10. WeChair项目Alpha冲刺(10/10)

    团队项目进行情况 1.昨日进展    Alpha冲刺第十天 昨日进展: 前端:安排页面美化,设计实名认证 后端:更新dao层代码 数据库:修改数据表属性,与后端部署数据库交互 2.今日安排 前端:继续 ...