python3中socket套接字相关的问题


本文摘自php中文网,作者零下一度,侵删。

本篇文章主要介绍了详解python3中socket套接字的编码问题解决,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

一、TCP

1、tcp服务器创建

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

#创建服务器

from socket import *

from time import ctime #导入ctime

 

HOST = ''    #任意主机

PORT = 21567  #随机提供个端口号

BUFSIZ = 1024  # 缓冲区大小设置为1KB,可以根据网络性能和程序需要改变这个容量

ADDR = (HOST, PORT)

 

tcpSerSock = socket(AF_INET, SOCK_STREAM)  #分配了 TCP 服务器套接字

tcpSerSock.bind(ADDR)  #绑定到服务器地址以及开启 TCP 监听器的调用。

tcpSerSock.listen(5#listen()方法的参数是在连接被转接或拒绝之前,传入连接请求的最大数

 

"""

  一旦进入服务器的无限循环之中,我们就(被动地)等待客户端的连接。当一个连接请求出

现时,我们进入对话循环中,在该循环中我们等待客户端发送的消息。如果消息是空白的,这意

味着客户端已经退出,所以此时我们将跳出对话循环,关闭当前客户端连接,然后等待另一个客

户端连接。如果确实得到了客户端发送的消息,就将其格式化并返回相同的数据,但是会在这些

数据中加上当前时间戳的前缀。最后一行永远不会执行,它只是用来提醒读者,如果写了一个处

理程序来考虑一个更加优雅的退出方式,正如前面讨论的,那么应该调用 close()方法。

"""

while True:

  print("waiting for connection")

  tcpCliSock, addr = tcpSerSock.accept() # 接收客户端连接,返回客户端和地址

  print("...connected from:", addr)

 

  while True:

    data = tcpCliSock.recv(BUFSIZ).decode() #对话(接收 / 发送) 接收客户端的data

    if not data:

      break

    tcpCliSock.send(('service:'+ctime()+'--'+data).encode())  #发送时间戳 和data信息给客户端

 

  tcpCliSock.close()

tcpSerSock.close()

2、tcp客户端创建


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

from socket import *

 

HOST = 'localhost'

PORT = 21567      #端口号 PORT 应该与你为服务器设置的完全相同(否则,将无法进行通信)

BUFSIZ = 1024

ADDR = (HOST, PORT)

 

tcpCliSock = socket(AF_INET, SOCK_STREAM)  #分配 TCP 客户端套接字

tcpCliSock.connect(ADDR)  #主动连接

 

"""

  我们必须解码来自服务器端的字符串(借助于distutils.log.warn()

 

"""

while True:

  data = input("> ")

  if not data:   #用户如果没有输入,则终止

    break

  tcpCliSock.send(data.encode())   #发送客户端的data给服务器

  data = tcpCliSock.recv(BUFSIZ).decode() #接收服务器的data

  if not data:  #或者服务器终止且对 recv()方法的调用失败

    break

  print('返回:%s'%data)

tcpCliSock.close()

二、UDP

1、UDP服务器创建

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

"""

  这个脚本创建一个 UDP 服务器,它接受客户端发来的消息,并将加了时间戳前缀的该消息返回给客户端。

"""

from socket import *

 

from time import ctime

HOST = ""

 

PORT = 21567

 

BUFSIZ = 1024

 

ADDR = (HOST, PORT)

udpServer = socket(AF_INET, SOCK_DGRAM)

 

udpServer.bind(ADDR)

while True:

  print("waiting for masssage")

  data,addr = udpServer.recvfrom(BUFSIZ) #接收

 

  data = data.decode()

 

  udpServer.sendto((ctime()+"--"+ data).encode(),addr)

 

  print("received from and returned to ",addr)

udpServer.close()

2、UDP客户端创建 


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#这个脚本创建一个 UDP 客户端,它提示用户输入发送给服务器的消息,并接收服务器加了时间戳前缀的消息,然后将它们显示给用户。

from socket import *

HOST = 'localhost'

PORT = 21567      #端口号 PORT 应该与你为服务器设置的完全相同(否则,将无法进行通信)

BUFSIZ = 1024

ADDR = (HOST, PORT)

 

udpCS = socket(AF_INET, SOCK_DGRAM)

 

while True:

  data = input("> ")

  if not data:

    break

  udpCS.sendto(data.encode(),ADDR)

  data,ADDR = udpCS.recvfrom(BUFSIZ)

  if not data:

    break

  print(data)

 

udpCS.close()

其实道理都差不多,在python3中,利用套接字传输的内容都以byte形式传输,这时候传送时(send/sendto)需要encode,接收(recv)时需要decode。只要掌握这个重点,处理这个问题就很简单了。

以上就是python3中socket套接字相关的问题的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

Python的内置函数有哪些

对比分析Python下识别二维码用法和识别率

Python数据分析用什么工具

网络编程详细介绍

Python中post与get方式提交数据的代码实例分享

Python用pip安装numpy

Python第三方库怎么用

Python如何终止线程

Python中eval是什么意思?

有关Python的md5加密用法详解

更多相关阅读请进入《Python》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...