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()

socket.SOCK_DGRAM用于UDP

posted @ 2018-08-01 12:05  大大的大笨熊  阅读(261)  评论(0编辑  收藏  举报