python网络编程(Socket、TCP、UDP)
Socket 是网络编程的一个抽象概念,通常我们用一个Socket表示 “打开了一个网络链接”,而打开一个Socket 需要知道目标计算机的IP 地址和端口号,再指定协议类型即可。python 提供了两个级别的网络服务
- 1.低级别的网络服务支持基本的Socket,它提供了标准的BSD Sockets API ,可以访问底层操作系统Socket 接口的全部方法
- 2.高级别的网络服务模块Socket Server ,它提供了服务器中心类,可以简化网络服务器的开发
socket() 函数,python中我们使用socket 函数来创建套接字,语法格式如
-
socket.socket(family[,type[,protocal]])
-
参数
- family 套接字家族可以使用AF_UNIX(单一进程通信) 或者 AF_INET(服务器通信)
- type 套接字类型可以根据是面向连接的还是非连接分为SCOKET_STREAM 或SOCKET_DGRAM
- protocol 一般不填默认为0
TCP编程
- 网络编程包括两部分:服务端和客户端,TCP是一种面向连接的通信方式,主动发动连接的叫客户端,被动响应的叫服务端。
- 创建服务端5步骤:
- 1 创建socket,绑定Socket到本地ip
- 2 开始监听连接
- 3 进入循环,不断接受客户端的连接请求
- 4 接收传来的数据,并发送给对方
- 5传输完毕,关闭Socket
#coding:utf-8
#创建TCP服务端
import socket
import threading
import time
def dealClient(sock, addr):
#第四步:接收传来的数据,并发送给对方数据
print('Accept new connection from %s:%s...' % addr)
sock.send(b'Hello,I am server!')
while True:
data = sock.recv(1024)
time.sleep(1)
if not data or data.decode('utf-8') == 'exit':
break
print '-->>%s!' % data.decode('utf-8')
sock.send(('Loop_Msg: %s!' % data.decode('utf-8')).encode('utf-8'))
#第五步:关闭套接字
sock.close()
print('Connection from %s:%s closed.' % addr)
if __name__=="__main__":
#第一步:创建一个基于IPv4和TCP协议的Socket
# 套接字绑定的IP(127.0.0.1为本机ip)与端口
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 9999))
#第二步:监听连接
s.listen(5)
print('Waiting for connection...')
while True:
# 第三步:接受一个新连接:
sock, addr = s.accept()
# 创建新线程来处理TCP连接:
t = threading.Thread(target=dealClient, args=(sock, addr))
t.start()
socket.SOCK_STREAM用于TCP
- 接着编写客户端,3步骤:
- 1 创建Socket,连接远端地址
- 2 连接后发送数据和接收数据
- 3 传输完毕,关闭Socket
#coding:utf-8
import socket
#初始化Socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#连接目标的ip和端口
s.connect(('127.0.0.1', 9999))
# 接收消息
print('-->>'+s.recv(1024).decode('utf-8'))
# 发送消息
s.send(b'Hello,I am a client')
print('-->>'+s.recv(1024).decode('utf-8'))
s.send(b'exit')
#关闭套接字
s.close()
运行截图:
-
服务端:
-
客户端:
C:\Python27\python.exe F:/python_scrapy/python_study/TCP_client.py
-->>Hello,I am server!
-->>Loop_Msg: Hello,I am a client!
Process finished with exit code 0
UDP编程
-
不需要建立连接
-
速度快
-
不关心是否到达目的地
-
通信双方以流的形式发送数据
- 服务端程序:
#coding:utf-8
import socket
#创建Socket,绑定指定的ip和端口
#SOCK_DGRAM指定了这个Socket的类型是UDP。绑定端口和TCP一样。
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('127.0.0.1', 9999))
print('Bind UDP on 9999...')
while True:
# 直接发送数据和接收数据
data, addr = s.recvfrom(1024)
print('Received from %s:%s.' % addr)
s.sendto(b'Hello, %s!' % data, addr)
- 客户端:
#coding:utf-8
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
for data in [b'Hello', b'World']:
# 发送数据:
s.sendto(data, ('127.0.0.1', 9999))
# 接收数据:
print(s.recv(1024).decode('utf-8'))
s.close()