这篇文章主要介绍了 Python socket 网络编程 TCP/IP 服务器与客户端通信的相关资料, 这里对 Scoket 进行详解并创建 TCP 服务器及 TCP 客户端实例代码,需要的朋友可以参考下
Python 是一种面向对象、解释型计算机程序设计语言,由 Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年。Python 语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够把用其他语言制作的各种模块(尤其是 C/C++)很轻松地联结在一起。
Python socket 网络编程
初学 python,前段时间买了两本书《python 编程从入门到实践》《Python 核心编程第三版》,第一本书主要讲的是一些基本语法和一些基本的使用方法,而第二本则深入很多,自己看来也是一知半解,刚好看到了这部分网络编程,依然有好多不太理解的地方,不过想来通过自己不断的摸索,不断地搜寻资料学习,早晚应该会变得通透吧.......
这部分主要使用的模块就是 socket 模块,在这个模块中可以找到 socket() 函数,该函数用于创建套接字对象,套接字也有自己的方法集,这些方法可以实现基于套接字的网络通信。
socket() 模块函数
要创建套接字,必须使用 socket.socket() 函数,他一般的语法如下
- socket(socket_family, socket_type, protocol=0)
其中 socket_family 是 AF_UNIX 或 AF_INET,socket_type 是 SOCK_STREAM 或 SOCK_DGRAM,protocol 通常省略,默认 = 0.
所以创建 TCP/IP 套接字,可以使用下面的方式调用 socket.socket().
- tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
同样创建 UDP/IP 套接字,使用下面的方法调用
- udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
创建 TCP 服务器
创建 TCP 服务器的流程基本如下,并非正真正的代码
- ss = socket() #创建服务器套接字
- ss.bind() #套接字与地址绑定
- ss.listen() #监听连接
- inf_loop: #服务器无限循环
- cs = ss.accepr() #接受客户端连接
- comm_loop: #通信循环
- cs.recv()/cs.send() #对话(接收/发送)
- cs.close() #关闭客户端套接字
- ss.close() #关闭服务器套接字(可选)
实际中创建 TCP 服务器基本流程就如上边所说,可能稍有不同但基本思路应该是相通的,下边是真正穿件服务器的代码:
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- from socket import * #将 socket 属性引入到命名空间
- HOST = '' #这是对 bind()方法的标识表示可以使用任何可用的地址
- PORT = 21571 #端口号
- BUFSIZ = 1024 #缓冲区大小,1kb
- ADDR = (HOST,PORT) #地址????
- tcpSerSocket = socket(AF_INET,SOCK_STREAM) #创建 tcp 套接字
- tcpSerSocket.bind(ADDR) #将地址绑定到套接字上
- tcpSerSocket.listen(5) #设置并启动套接字监听
- while True: #无限循环,等待客户端连接
- print('waiting for connection...')
- tcpCliSocket,addr = tcpSerSocket.accept() #被动接受客户端连接
- print('...connected from:',addr)
- while True: #对话循环,等待客户端发送消息
- data = tcpCliSocket.recv(BUFSIZ) #接收客户端消息
- if not data: #如果消息是空白,跳出对话循环,关闭当前连接
- break
- tcpCliSocket.send(data) #如果收到消息,将消息原封不动返回客户端
- tcpCliSocket.close()
- tcpSerSocket.close()
创建 TCP 客户端
同上边一样,一个简单的非代码流程
- cs = socket() #创建客户端套接字
- cs.connect() #尝试连接服务器
- comm_loop: #通信循环
- cs.send()/cs.recv() #对话(发送/接收)
- cs.close() #关闭客户端套接字
实际中创建客户端也是翻译上边的步骤
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- from socket import *
- HOST = 'localhost' #服务器的主机名
- PORT = 21571 #端口号
- BUFSIZ = 1024 #缓冲区
- ADDR = (HOST,PORT) #地址
- tcpCliSocket = socket(AF_INET,SOCK_STREAM) #创建客户端套接字
- tcpCliSocket.connect(ADDR) #连接服务器
- while True: #通信循环
- data = input('> ') #客户端输入信息
- if not data: #如果输入信息为空,则跳出循环,关闭通信
- break
- data = str.encode(data)
- tcpCliSocket.send(data) #发送客户端信息
- data = tcpCliSocket.recv(BUFSIZ) #接受服务器返回信息
- if not data: #如果服务器未返回信息,关闭通信循环
- break
- print('get:',data.decode('utf-8'))
- tcpCliSocket.close()
当然,这只是最基础的通信,而且关于主机名,端口号之类的东西暂时还不是很懂,目前所做的只是在同一台电脑上通信,端口号也需要一致,如果不同的电脑进行通信该怎么做?我还只是个小白.....
来源: