一、概述

  套接字(socket)是用于网络通信的数据结构。在任何类型的通信开始之前,都必须创建Socket,可以将它们比作电话插孔,没有它们就无法进行通信。  Socket主要分为面向连接的Socket和无连接的Socket。面向连接的Socket使用的主要协议是传输控制协议,也就是我们常说的TCP,TCP的Socket名称是SOCK_STREAM。无连接的Socket的主要协议是用户数据报协议,也就是常说的UDP,UDP的Socket的名字是SOCK_DGRAM。

二、建立TCP服务端

(一)描述    在Python语言中创建Socket服务端程序,需要使用socket模块中的socket类。创建Socket服务端程序的步骤如下:    1、创建Socket对象;(根据给定的IP地址类型,协议类型)    2、绑定端口号;    3、监听端口号;    4、等待客户端Socket的连接;    5、读取从客户端发送过来的数据;    6、向客户端发送数据。    7、关闭客户端Socket连接;    8、关闭服务端Socket连接。    上面的某些步骤可能会执行多次,例如,第4步等待客户端Socket连接,可以放在一个循环中,当处理完一个客户端请求后,再继续等待另一个客户端的请求。    关键字常量表示的意义:AF_INET:IPV4,AF_INET6:IPV6,SOCK_STREAM:TCP,SOCK_DGRAM:UDP(二)实例1:最简单的socket通信实例Socket服务端代码:

 1 import socket
 2
 3 # 学socket的秘籍:一收一发
 4
 5 sk = socket.socket()
 6
 7 # family=AF_INET, type=SOCK_STREAM
 8 # from socket import *
 9 # sk = socket(AF_INET,SOCK_STREAM)
10 host=''  #空表示本机,等效于127.0.0.1和localhost
11 port=8000
12 address = (host,port)
13 sk.bind(address)
14 sk.listen(3)
15 print('waiting......')
16 conn,addr = sk.accept()  #这个conn是客户端的socket对象。非常重要。
17 # inp = input('>>>')
18 # conn.send(bytes(inp,'utf8'))
19 data = str(conn.recv(1024),'utf8')
20 print(data)

View Code

Socket客户端代码:

 1 import socket
 2
 3 sk=socket.socket()
 4 address = ('127.0.0.1',8000)
 5 sk.connect(address)
 6
 7 # data = str(sk.recv(1024),'utf8')  #会在此处阻塞住,等待返回值。
 8 # print(data)
 9
10 inp = input('>>>')
11 sk.send(bytes(inp,'utf8'))

View Code

(三)实例2:完善升级:socket实现单人聊天:可以同时开多个客户端,但是同时只能一个客户端与服务端通信,其他客户端排队中,等前面聊天的客户端退出后,队列中的一个客户端开始可以聊天。
Socket服务端代码:
import socket# 学socket的秘籍:一收一发
sk = socket.socket()
host=''  #空表示本机,等效于127.0.0.1和localhost
port=8000
address = (host,port)
sk.bind(address)
sk.listen(3)
print('waiting......')
# conn,addr = sk.accept()  #这个conn是客户端的socket对象。非常重要。while True:conn, addr = sk.accept()  # 这个conn是客户端的socket对象。非常重要。while True:data = str(conn.recv(1024),'utf8')if data=='':  #客户端退出时,最后还是会给服务端发送一个空串。即data为空。breakprint(data)inp = input('>>>')conn.send(bytes(inp,'utf8'))conn.close()

Socket客户端代码: 
import socketsk=socket.socket()
address = ('127.0.0.1',8000)
sk.connect(address)while True:inp = input('>>>')if inp=='exit':breaksk.send(bytes(inp,'utf8'))data = sk.recv(1024)print(str(data,'utf-8'))sk.close()

(四)实例3:不间断聊天和退出处理

Socket服务端代码:
import socket# 学socket的秘籍:一收一发
sk = socket.socket()
host=''  #空表示本机,等效于127.0.0.1和localhost
port=8000
address = (host,port)
sk.bind(address)
sk.listen(3)
print('waiting......')
# conn,addr = sk.accept()  #这个conn是客户端的socket对象。非常重要。while True:conn, addr = sk.accept()  # 这个conn是客户端的socket对象。非常重要。print(addr)while True:try:data = str(conn.recv(1024),'utf8')except Exception:breakprint(data)if data=='':  #客户端退出时,最后还是会给服务端发送一个空串。即data为空。breakinp = input('>>>')conn.send(bytes(inp,'utf8'))conn.close()

Socket客户端代码:
import socketsk=socket.socket()
address = ('127.0.0.1',8000)
sk.connect(address)while True:inp = input('>>>')if inp=='exit':breaksk.send(bytes(inp,'utf8'))data = sk.recv(1024)print(str(data,'utf-8'))sk.close()

三、总结

在python3,socket传送的内容(发送和接收都是)都是bytes类型。而已一定要遵循:一发一收原则。server下的方法:    bind()    listen()    accept()    recv()    send(string)    sendall()

client下的方法    connect()    recv()    send(string)    sendall()

常用函数如下:
sk.bind(address)#s.bind(address) 将套接字绑定到地址。address地址的格式取决于地址族。在AF_INET下,以元组(host,port)的形式表示地址。

sk.listen(backlog)#开始监听传入连接。backlog指定在拒绝连接之前,可以挂起的最大连接数量。#backlog等于5,表示内核已经接到了连接请求,但服务器还没有调用accept进行处理的连接个数最大为5#这个值不能无限大,因为要在内核中维护连接队列

sk.setblocking(bool)#是否阻塞(默认True),如果设置False,那么accept和recv时一旦无数据,则报错。

sk.accept()#接受连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。#接收TCP 客户的连接(阻塞式)等待连接的到来

sk.connect(address)#连接到address处的套接字。一般,address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。

sk.connect_ex(address)#同上,只不过会有返回值,连接成功时返回 0 ,连接失败时候返回编码,例如:10061

sk.close()#关闭套接字

sk.recv(bufsize[,flag])#接受套接字的数据。数据以字符串形式返回,bufsize指定最多可以接收的数量。flag提供有关消息的其他信息,通常可以忽略。

sk.recvfrom(bufsize[.flag])#与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址。

sk.send(string[,flag])#将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。即:可能未将指定内容全部发送。

sk.sendall(string[,flag])#将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。#内部通过递归调用send,将所有内容发送出去。

sk.sendto(string[,flag],address)#将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。该函数主要用于UDP协议。

sk.settimeout(timeout)#设置套接字操作的超时期,timeout是一个浮点数,单位是秒。值为None表示没有超时期。一般,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如 client 连接最多等待5s )

sk.getpeername()#返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)。

sk.getsockname()#返回套接字自己的地址。通常是一个元组(ipaddr,port)

sk.fileno()#套接字的文件描述符

转载于:https://www.cnblogs.com/chenhaiming/p/9885413.html

PYTHON——TCPUDP:Socket初识相关推荐

  1. socket初识和安装

    socket初识和安装day_22 一.基于VScode,socket库安装 服务器端: npm install --save socket.io javascript客户端: npm install ...

  2. Python局域网socket无法连接的问题解决

    Python局域网socket无法连接的问题解决 服务器端的socket监听的是否是服务器的IP地址(并不是什么'localhost'或者'127.0.0.1'这种).即客户端需要连接的IP地址填入即 ...

  3. python的socket编程_Python Socket编程详细介绍

    在使用Python做socket编程时,由于需要使用阻塞(默认)的方式来读取数据流,此时对于数据的结束每次都需要自己处理,太麻烦.并且网上也没找到太好的封装,所以就自己写了个简单的封装. 封装思路 1 ...

  4. Python 技术篇-socket套接字实现两个窗口间消息传递实例演示,TCP实现

    上一篇:Python 技术篇-socket 套接字实现服务器客户端消息传递,UDP 实现 本篇介绍用 TCP 来实现. socket 实现客户端服务器的消息传递有 TCP 和 UDP 两种方式. TC ...

  5. Python 技术篇-socket套接字实现服务器客户端消息传递实例演示,UDP实现

    上一篇:Python 技术篇-socket 套接字实现两个窗口间消息传递,TCP 实现 本篇介绍用 UDP 来实现. socket 套接字实现服务器客户端消息传递有 UDP 和 TCP 两种形式.他们 ...

  6. 「Python」socket指南

    开始 网络中的 Socket 和 Socket API 是用来跨网络的消息传送的,它提供了 进程间通信(IPC) 的一种形式.网络可以是逻辑的.本地的电脑网络,或者是可以物理连接到外网的网络,并且可以 ...

  7. Python: Socket网络编程,多线程处理小Demo

    一个简单的例子,深入研究一下socket的多线程处理任务 Server端: #!/usr/bin/env python #encoding:utf8 # # 注意:定义encoding时必须在第二行i ...

  8. 用python做双人五子棋_基于python的socket实现单机五子棋到双人对战

    基于python的socket实现单机五子棋到双人对战,供大家参考,具体内容如下 本次实验使用python语言.通过socket进行不同机器见的通信,具体可以分为以下四步:1.创建ServerSock ...

  9. python调用库实现返回ping的时延_python网络作业:使用python的socket库实现ICMP协议的ping...

    ICMP ping是您遇到过的最常见的网络扫描类型. 打开命令行提示符或终端并输入ping www.google.com非常容易. 为什么要在python中实现? 很多名牌大学喜欢考试用python的 ...

  10. python socket编程_最基础的Python的socket编程入门教程

    本文介绍使用Python进行Socket网络编程,假设读者已经具备了基本的网络编程知识和Python的基本语法知识,本文中的代码如果没有说明则都是运行在Python 3.4下. Python的sock ...

最新文章

  1. mysql数据库引擎介绍
  2. 注释工具_干货:PS工具介绍“计算工具+注释工具”
  3. Python之flask结合Bootstrap框架快速搭建Web应用
  4. hive操作create,alter等
  5. JAVA程序设计的一次作业
  6. Maven安装与配置教程
  7. buuctf easyweb
  8. 为什么房价不能跌,房租必须涨
  9. 强强联手|任子行公司董事长景晓军一行到访云畅科技交流
  10. 内功图说--十二段锦
  11. 特征重要性与shap值
  12. Mac创建txt文件的两种方法
  13. 支付宝电脑网页支付接口的调用
  14. idea为web项目添加tomcat并配置Artifacts
  15. 手动Docker部署saber
  16. JAVA时间存储类Period和Duration
  17. 一步步追踪Dialog的创建流程(一)
  18. 缓存算法:LFU和LRU的JAVA实现
  19. 基于Solidworks的三维光路结构示意图绘制实例演示
  20. 区块链系列课第三讲区块链的行业应用

热门文章

  1. webpack打包之clean-webpack-plugin插件 默认下载4.0.0版本的踩坑记录
  2. java实现多级菜单(java递归)方法二
  3. PythonOpencv-分类器—SVM,KNearest,RTrees,Boost,MLP
  4. 【源码分享】POSCMS功能如何实现短信验证码
  5. springmvc配置同时支持html和jspl两种格式的页面
  6. Rational Rose 下载安装
  7. Visual Studio LightSwitch初体验和定位看法
  8. Postfix:Sql_select option missing问题解决及原因
  9. [蛋蛋の插画]小笔“最高”>、<
  10. 大数据组件需要额外添加的依赖包汇总(持续更新中)