python之socket、socketserver

1、首先了解两个协议TCP和UDP

1、TCP:(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。

之所以可靠:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。当TCP收到发自TCP连接另一端的数据,它将发送一个确认。

2、UDP: (User Datagram Protocol 数据报协议),是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。


2、socket

  • socket: 是一种数据链接的端口,简称为:套接字
  • 主要有两种套接字类型
    面向文件的
    面向网络的

面向文件的,为了区分不同平台和不同体系的套接字类型,出现了地址家族:Address Family 简称AF
Unix 系统中的套接字就是第一种家族套接字,称为 AF_UNIX,或者 AF_LOCAL,这是 POSIX1标准中规范的

面向网络的有AF_INET和AF_INET6
面向连接的SCOK_STREAM –>TCP协议
面向无连接的SOCK_DGRAM –>UDP协议

  • python中socket
    为网络编程提供了友好的支持

面向连接的服务端

##开发流程:伪代码
#引入需要的模块socket
#配置连接信息HOST、PORT
#生成套接字对象
#绑定主机端口号
#监听端口号
#收发消息
##############################################
#引入需要的模块
inport socket

#配置连接信息
HOST = '' #空字符串,默认本地
PORT = 8080 #端口号
ADDRESS = (HOST,PORT)
BUFFER = 1024 #每次传输的数据大小

#创建面向连接的套接字
tcp_socket_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#SOCK_STREAM: 提供面向连接的稳定数据传输,即TCP协议。

#绑定主机
tcp_socket_server.bind(ADDRESS)

#监听端口号
tcp_socket_server.listen()

while True:
    #发送消息
    tcp_socket_server.send("my name is server".encode('utf-8'))
    #"my name is server".encode('utf-8'):将字符编码转化为utf-8字节编码
    #接受消息
    msg = tcp_socket_server.recv(BUFFER)
    #打印接受消息
    print("消息:" + msg.decode('utf-8'))

#关闭套接字,释放资源
tcp_socket_server.close()

面向连接的客户端

##伪代码
#引入需要的模块socket
#定义链接消息
#创建套接字对象
#确定链接主机ip和端口
#收发消息
#################################

#引入需要的模块
import socket

#配置连接信息
HOST = '192.168.13.28' #这里是我的ip的地址,需要修改成自己的,
#命令行控制窗口中,ipconfig命令,可以查看
PORT = 8080 #随意填,建议填8千以上的,上到6万多
ADDRESS = (HOST,PORT)

#创建套接字对象
tcp_socket_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

#确定链接主机和端口号
tcp_socket_client.connect(ADDRESS)


while True:
#上面服务器先发送的消息,所以我们在客户端先接受消息
    #接受消息
    msg = tcp_socket_client.recv(BUFFER)
    print(msg.decode('utf-8'))

    #发送消息
    info = input("要发送的消息:")
    tcp_socket_client.send(info.encode('utf-8'))
    if info == "BYE":
        #退出
        tcp_socket_client.close()
        break

面向无连接的服务端

##伪代码
#引入需要的模块
#配置连接信息
#创建无连接的套接字
#绑定主机ip和端口
#收发消息
##################################
#引入需要的模块
import socket

#配置连接信息
HOST = ''
PORT = 8080
ADDRESS = (HOST,PORT)
BUFFER = 1024

#创建面向无连接的套接字
udp_socket_server = socket.socket(socket.AF_INET,socket.DGRAM)
#SOCK_DGRAM: 使用不连续不可靠的数据包连接。

#绑定主机和端口
udp_socket_server.bind(ADDRESS)

whlie True:
    #接受消息
    msg,addr = udp_socket_server.recvfrom(BUFFER)
    #addr:IP地址和端口号
    print(addr,"消息:" + msg.decode('utf-8'))

    #发送消息
    info = input("发送的消息:")
    udp_socket_server.sendto(info.endode('utf-8'))
    if info == "BYE":
        #关闭套接字
        udp_socket_server.close()
        break

面向无连接的客户端

import socket

HOST = '192.168.13.28'
PORT = 8080
ADDRESS = (HOST,PORT) #需要发送的地址
BUFFER = 1024

#创建套接字类型
udp_socket_client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

while True:
    server_info = input("输入消息:")
    udp_socket_client.sendto(server_info.encode("utf-8"), ADDRESS)
    if server_info == "BYE":
        udp_socket_client.close()
        break

    client_msg,client_addr = udp_socket_client.recvfrom(BUFFER)
    print(client_addr,client_msg.decode("utf-8"))

3、socketserver

socketserver 是标准库中一个高级别的模块,用于简化网络客户与服务器的实现。

面向对象的面向连接的网络编程

#引进需要的模块
from socketserver import (TCPServer as TCP, StreamRequestHandler as SRH)

#自定义请求处理类型
class MyRequestHandler(SRH):

    # 重写请求处理方法
    def handle(self):
        # 父类中:请求对象:self.request
        print("一个客户端连接上来了", self.client_address)

        # 发送消息
        self.request.send("我是服务器".encode("utf-8"))

        # 接受消息
        info = self.request.recv(1024)
        print(info.decode('utf-8'))

if __name__ == '__main__':
    ADDRESS = ('',12345)
    #创建一个TCP服务器
    tcp_server = TCP(ADDRESS,MyRequestHandler)
    print("等待连接...")
    tcp_server.serve_forever()
    #tcp_server.serve_forever()服务器永远服务

客户端和面向连接的客户端一样

猜你喜欢

转载自blog.csdn.net/qq_41963640/article/details/81712457
今日推荐