专栏首页python3Python网络编程

Python网络编程

网络编程

# notes 要点 网络编程

客户端/服务器架构

客户端/服务器网络编程

套接字是计算机网络数据结构。在任何类型的通信开始之前,网络应用程序必须创建套接字。可以将它们比作电话插孔,没有它将无法进行通信。

进程间通信(Inter Process Communication)

地址家族(address family): UNIX套接字: AF_UNIX (基于文件) INET套接字: AF_INET (基于网络)(因特网) 套接字地址:主机-端口对

面向连接的套接字:通信之前必须先建立一个连接(提供序列化的、可靠的和不重复的数据交付,而没有记录边界) 实现这种连接类型的主要协议是传输控制协议(Transmission Control Protocol)(TCP) 为了创建TCP套接字,必须使用SOCK_STREAM作为套接字类型

无连接的套接字:在通信开始前不需要建立连接(无法保证顺序性、可靠性或重复性) 实现这种连接类型的主要协议是用户数据报协议(User Datagram Protocol)(UDP) 为了创建UDP套接字,必须哈斯用SOCK_DGRAM作为套接字类型

# sock.py python中的网络编程-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套接字
# tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 为了创建UDP/IP套接字
# udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 套接字对象(内置)方法
# 服务器套接字方法
# s.bind()        将地址(主机名,端口号对)绑定到套接字上
# s.listen()    设置并启动TCP监听器
# s.accept()    被动接受TCP客户端链接,一直等待直到连接到达(阻塞)

# 客户端套接字方法
# s.connect()    主动发起TCP服务器连接
# s.connect_ex()扩展版本,以错误码形式返回问题,而不是抛出一个异常

# 普通的套接字方法
# s.recv()        接受TCP信息
# s.recv_into()    接受TCP信息到指定的缓冲区
# s.send()         发送TCP信息
# s.sendall()    完整地发送TCP信息

# 创建TCP服务器
# ss = socket()             创建服务器套接字
# ss.bind()                    套接字与地址绑定
# ss.listen()                监听连接
# inf_loop:                    服务器无限循环
#     cs = ss.accept()        接受客户端连接(返回客户端套接字)
#     comm_loop:                通信循环
#         cs.recv()/cs.send() 对话(接受/发送)
#     cs.close()                关闭客户端套接字
# ss.close()                关闭服务器套接字

# 创建TCP客户端
# cs = socket()                创建客户端套接字
# cs.connect()                尝试连接服务器
# comm_loop:                通信循环
#     cs.send()/cs.recv()        对话(发送/接受)
# cs.close()                关闭客户端套接字

# 创建UDP服务器
# ss = socket()                创建服务器套接字
# ss.bind()                    绑定服务器套接字
# inf_loop():                服务器无线循环
#     cs = ss.recvfrom()/ss.sendto()    # 关闭(接受/发送)
# ss.close()

# 创建UDP客户端
# cs = socket()                创建客户端套接字
# comm_loop:                通信循环
#     cs.sendto()/cs.recvfrom()    对话(发送/接受)
# cs.close()                关闭客户端套接字
# tcpServer.py TCP服务端
#!/usr/bin/env python

from socket import *
from time import ctime

HOST = ''              # 主机名
PORT = 31416        # 端口
BUFSIZ = 1024        # 缓冲大小
ADDR = (HOST, PORT) # 套接字地址(主机名,端口)

tcpSerSock = socket(AF_INET, SOCK_STREAM)  # 创建套接字
tcpSerSock.bind(ADDR)  # 套接字与地址绑定
tcpSerSock.listen(5)  # 监听

try:
    while True:
        print('waiting for connection...')
        tcpCliSock, addr = tcpSerSock.accept()  # 阻塞,等待连接,返回客户端套接字与套接字地址(主机名,端口)
        print('...connected from:', addr)

        while True:
            data = tcpCliSock.recv(BUFSIZ)
            if not data:
                break
            reply = '[%s] %s' % (ctime(), data.decode('utf-8'))
            tcpCliSock.send(bytes(reply, 'utf-8'))
        tcpCliSock.close()
    tcpSerSock.close()
except KeyboardInterrupt:
    print('Bye!')
# tcpClient.py TCP客户端
#!/usr/bin/env python

from socket import *

HOST = 'localhost' # or 'localhost'
PORT = 31416
BUFSIZ = 1024
ADDR = (HOST, PORT)

tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR)

while True:
    data = input('> ')
    if not data:
        break
    tcpCliSock.send(bytes(data, 'utf-8'))
    data = tcpCliSock.recv(BUFSIZ)
    if not data:
        break
    print(data.decode('utf-8'))

tcpCliSock.close()
# udpServer.py UDP服务端
#!/usr/bin/env python

from socket import *
from time import ctime

HOST = ''
PORT = 31416
BUFSIZ = 1024
ADDR = (HOST, PORT)

udpSerSock = socket(AF_INET, SOCK_DGRAM)
udpSerSock.bind(ADDR)

try:
    while True:
        print('waiting for massage...')
        data, addr = udpSerSock.recvfrom(BUFSIZ)
        reply = '[%s]: %s' % (ctime(), data.decode('utf-8'))
        udpSerSock.sendto(bytes(reply, 'utf-8'), addr)
        print('...received from and returned to:', addr)
except KeyboardInterrupt:
    print('Bye!')

udpSerSock.close()
# udpClient.py UDP客户端
#!/usr/bin/env python

from socket import *

HOST = 'localhost'
PORT = 31416
BUFSIZ = 1024
ADDR = (HOST, PORT)

udpCliSock = socket(AF_INET, SOCK_DGRAM)

while True:
    data = input('> ')
    if not data:
        break
    udpCliSock.sendto(bytes(data, 'utf-8'), ADDR)
    data, ADDR = udpCliSock.recvfrom(BUFSIZ)
    if not data:
        break
    print(data.decode('utf-8'))

udpCliSock.close()
# tcpSocketServer.py SocketServerTCP服务器
#!/usr/bin/env python

from socketserver import (TCPServer as TCP, StreamRequestHandler as SRH)
from time import ctime

HOST = ''
PORT = 31416
ADDR = (HOST, PORT)

class MyRequestHandler(SRH):
    def handle(self):
        print('...connected from:', self.client_address)
        reply = '[%s] %s' % (ctime(), self.rfile.readline().decode('utf-8'))
        self.wfile.write(bytes(reply, 'utf-8'))

tcpServ = TCP(ADDR, MyRequestHandler)
print('waiting for connection...')
tcpServ.serve_forever()
# tcpSocketClient.py SocketServerTCP客户端
#!/usr/bin/env python

from socket import *

HOST = 'localhost'
PORT = 31416
BUFSIZ = 1024
ADDR = (HOST, PORT)

while True:
    # socketserver处理程序的默认行为是接受连接、获取请求,然后关闭连接,所以,每次都要新建一个套接字    tcpCliSock = socket(AF_INET, SOCK_STREAM)
    tcpCliSock.connect(ADDR)
    data = input('> ')
    if not data:
        break
    reply = '%s\r\n' % data
    tcpCliSock.send(bytes(reply, 'utf-8'))  # 因为这里使用的处理程序类对待套接字通信就像文件一样,所以必须发送终止符(回车和换行符)
    data = tcpCliSock.recv(BUFSIZ)
    if not data:
        break
    print(data.decode('utf-8').strip())
    tcpCliSock.close()

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python基础:网络编程socket基

    因为socket是一个类,所以只导入模块需要使用socket.socket()创建一个socket对象。

    py3study
  • python socket编程详细介绍

       第二个是 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发。

    py3study
  • Python-socket总结

    什么是socket所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。

    py3study
  • JavaWeb(七)之详解JavaWeb路径

    前言   在我们的实际开发中,经常要写路径,不管是链接,重定向还是转发,这都是需要路径的。那这一篇我给大家详细的分享一下Web中的各种路径问题。   世界上一切...

    用户1195962
  • 有趣的linux命令总结(78天)

    linux命令可以简化我们工作中的许多任务。关于Linux这个主题已经考虑很久了,也还是在不断的完善中,在自己的实验和各种资料的整理中,认为还是一些不错的命令。...

    jeanron100
  • TCP端口复用引发的异常,用setsockopt来解决

    OSError: [WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。假如端口被socket使用过,并且利用socket...

    小小咸鱼YwY
  • TCP端口复用引发的异常,用setsockopt来解决

    OSError: [WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。

    小小咸鱼YwY
  • 有趣的linux命令总结(78天)

    linux命令可以简化我们工作中的许多任务。关于Linux这个主题已经考虑很久了,也还是在不断的完善中,在自己的实验和各种资料的整理中,认为还是一些不错的命令。...

    jeanron100
  • es6 --- var const let

    今天第一次遇到const定义的变量,查阅了相关资料整理了这篇文章。主要内容是:js中三种定义变量的方式const, var, let的区别。

    小蔚
  • JS中const、var 和let的区别

    今天第一次遇到const定义的变量,查阅了相关资料整理了这篇文章。主要内容是:js中三种定义变量的方式const, var, let的区别。 1.const定义...

    李文杨

扫码关注云+社区

领取腾讯云代金券