Python网络编程之Socket的简单实现

一、引入

  关于Python的网络编程,最基础莫过于socket了。

  socket,又称“套接字”,网络上的两个程序如果想要实现双向的数据通信,需要建立连接,这个连接的一端就称为一个socket。

  python中有一个模块socket,在这个模块中可以找到socket()函数,该函数用于创建套接字对象。根据所用协议的不同(TCP/IP和UDP/IP),可以创建两类socket。下面贴上一个TCP/IP类的socket实例。

二、创建TCP服务器

 1 __author__ = "JentZhang"
 2 
 3 from socket import *
 4 from time import ctime
 5 
 6 HOST = '127.0.0.1'          #服务器地址
 7 PORT = 21136                #服务器端口
 8 BUFIZE = 1024               #接受数据的大小
 9 ADDR = (HOST, PORT)         #创建socket时用到的地址(就是将服务器地址和端口写成一个元组的形式)
10 
11 tcpSerSock = socket(AF_INET, SOCK_STREAM)   #创建socket连接(AF_INET表示IPV4,SOCK_STREMAM表示TCP协议 )
12 tcpSerSock.bind(ADDR)                       #绑定地址
13 tcpSerSock.listen(5)                        #开始监听端口,参数5表示可以接收的连接数量
14 
15 while True:                                             #循环接受多个客户端发来的请求
16     try:
17         print('Watting for connection...')
18         tcpCliSock, addr = tcpSerSock.accept()          #当有客户端发来请求时,通过accept()方法来接受,返回参数有两个,可以自行print出来,看看是什么
19         print('...connected from :', addr)
20 
21         while True:                                     #循环接受客户端发来的消息
22             data = tcpCliSock.recv(BUFIZE)              #接受客户端发来的消息,接收到的是一个byte类型的数据
23             if not data:                                #当用户发送空字符串的是时候,跳出循环,重新接收数据
24                 break
25             print('接收到数据:', data)
26             tcpCliSock.send(b'[%s] % s' % (ctime().encode(), data))     #将接收到的数据加上时间戳返回回去,同样返回的数据需要是byte类型
27     except ConnectionResetError as e:                                   #当客户端关闭连接时,catch这个错误做出相应的提示
28         print(e)
29         print('%s:%s 退出了' % (addr[0], addr[1]))                      #服务端也关闭相关的socket连接
30     finally:
31         tcpCliSock.close()
32 tcpSerSock.close()

三、创建客户端

 1 __author__ = "JentZhang"
 2 
 3 from socket import *
 4 
 5 HOST = '127.0.0.1'
 6 PORT = 21136
 7 BUFSIZE = 1024
 8 ADDR = (HOST, PORT)
 9 
10 tcpCliSock = socket()
11 tcpCliSock.connect(ADDR)        #建立连接
12 
13 while True:
14     msg = input('>>')           #输入要发送的内容
15     if not msg:                 #如果发送内容为空,则重新发送
16         break
17     tcpCliSock.send(msg.encode())       #发送byte类型的数据
18 
19     data = tcpCliSock.recv(BUFSIZE)     #接受服务端的返回
20     if not data:                        #如果服务端返回为空,则重新发送
21         break
22         
23     print(data.decode())
24 tcpCliSock.close()

四、效果预览

  1.分别启动服务端和客户端,注意先启动服务端。

  2.发送数据

  3.断开连接

五、总结概括

  简单的做了一个socket的实例(由于socket的阻塞模式,本实例同一时间只能一个客户端连到服务器,只有当当前连接的客户端断开了连接,其他客户端才能连进来)。

  关于socket编程,还有更丰富的东西在里面。本例仅供参考。

原文地址:https://www.cnblogs.com/JentZhang/p/9372219.html