zoukankan      html  css  js  c++  java
  • 32.网络编程TCP/UDP服务

    网络编程TCP:


    服务器端口了解:

    • port:0~65535
    1. web服务:80
    2. 邮箱服务:556
    3. 0~1024:为服务默认的公认端口,一般我们不能用

    套接字:socket

    • socket作用
    1. ip:port,有协议加持绑定了IP属性,协议属性变量
    • 一般步骤模型如下:

    import socket
    服务端:
    s = socket.socket(IP类型是啥,协议类型是啥)
      # ip类型:
      # socket.AF_INET ipv4的
      # socket.AF_INET6 ipv6的
      # 协议:
      # socket.SOCK_STREAM TCP协议的
      # socket.SOCK_DGRAM UDP协议的 
    s.bind( (ip,port) ) #绑定可用IP和端口
      # ip可以是一个空字符串,代表所有可用IP
      # 公网IP 47.98.190.149
      # 私网IP 172.16.253.97
      # 本地回环 127.0.0.1
    s.listen(5) # 服务器开启监听
      #参数:连接等待个数
    c,addr = s.accept() # 阻塞 等待别人连接,阻塞会有两个返回值, 第一个是套接字 第二个是来访者的ip和端口的元组
      # c:套接字
      # addr:来访者IP和端口的元组
    c.recv(1024)
      # 参数:你一次性拿取对方传递来的多少数据,字节单位
    c.send(data.encode())
      # data: 编码过后的字符串对象 (二进制)
    s.close() #关闭套接字
    c.close() #关闭套接字

    客户端:
    s = socket.socket(IP类型是啥,协议类型是啥)
      #初始化定义ip协议类型
    s.connect( (ip,port) )
      #客户端通过IP和端口的元组连接服务器
    s.recv(1024)
      # 参数:你一次性拿取对方传递来的多少数据,字节单位
    s.send(data.encode())
      # data: 编码过后的字符串对象 (二进制)
    s.close() #关闭套接字

     下面是根据上面的socket编写以tcp协议简单的单线程聊天代码:(单线程只能1对1)


    server端:
    import socket
    ip = ''     #这里可以为空代表所有ip都可以用
    port = 8082
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #绑定属性ipv4,tcp协议
    s.bind((ip,port)) #绑定可用ip和端口
    s.listen(5)     #允许5台客户端连接
    while True:
        try:
            c,addr = s.accept() #阻塞 等待别人连接,没有人连我就不执行下面的代码,一般生产环境用的都是非阻塞的
            print(c)
            print(addr)
            while True:
                #阻塞会有两个返回值,下面服务阻塞返回的c
                date = c.recv(1024) #接收客户端的数据,1024字节单位
                if date:
                    print('[%s]发来的消息:%s' % (addr,date.decode('utf-8')))
                    while True:  #这里循环的是输入空数据是无限循环
                        msg = input('>>>')  #输入你要发送的数据          
                        if msg:
                            c.send(msg.encode('utf-8')) #向客户端发送数据
                            break
                        else:
                            print('不能输入空数据,请从新发送')
                else:
                    print('客户端已经关闭')
                    c.close()
                    break
        except KeyboardInterrupt:#ctrl + c 终结程序
            s.close()
            break
    print('服务已关闭') 

    clitent端:

    import socket
    ip = '192.168.137.128'
    port = 8082
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #绑定属性ipv4,tcp协议 
    s.connect( (ip,port)) #客户端通过IP和端口的元组连接服务器
    while True:
        try:
            msg = input('>>>')
            if msg:
                s.send(msg.encode('utf-8'))  #向服务端发送数据
            else:
                print('不能发送空数据,请从新输入')
                continue
            date = s.recv(1024)
            if date:
                print('服务器返回的数据:',date.decode('utf-8'))
            else:
                print('服务端已经关闭')
                s.close()
                break
        except KeyboardInterrupt: #ctrl + c
            s.close()
            break
    print('客户端已关闭')

    运行结果:

     

       

    网络编程UCP:


    套接字:socket

    • 一般步骤模型如下:

    import socket
    服务端:
    s = socket.socket(IP类型是啥,协议类型是啥)
      # ip类型:
      # socket.AF_INET ipv4的
      # socket.AF_INET6 ipv6的
      # 协议类型:
      # socket.SOCK_STREAM TCP协议的
      # socket.SOCK_DGRAM UDP协议的 
    s.bind( (ip,port) ) #UDP服务器只需要绑定自身可用IP和端口即可
      # ip可以是一个空字符串,代表所有可用IP
      # 公网IP 47.98.190.149
      # 私网IP 172.16.253.97
      # 本地回环 127.0.0.1
    data,c_addr = s.recvfrom() #获取这个套接字接受到的数据
         #data:发来的数据
         #c_addr:谁发来的
     
    s.sendto(msg,c_addr) #回复消息

    udp客户端:
    socket(AF_INET,SOCK_DGRAM) #(IP类型是啥,协议类型是啥)

    c.sendto(msg,s_addr) #发消息给服务端

    data,s_addr = c.recvfrom() #服务端返回的数据

    下面是根据上面的socket编写以udp协议简单的多线程聊天代码:(1对多个客户端)


    server:

    import socket
    ip = ''                         #默认允许所有的ip
    port = 8083                 #服务器开通的端口
    s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)    #初始化ip协议类型
    s.bind((ip,port))                   #绑定服务ip端口
    while True:
        try:
            while True:
                date,c_addr = s.recvfrom(1024)         #接受客户端发来的消息
                print('%s:%s' % (c_addr,date.decode('utf-8')))
                while True:
                    msg = input('>>>> ')
                    if msg == 'quit' or msg == 'q':
                        s.close()
                        print('服务端已关闭')
                        exit()
                    if msg:
                        s.sendto(msg.encode('utf-8'),c_addr)          #向客户端返回消息
                        break
                    else:
                        print('不能回复为空,请从新回复消息')
        except KeyboardInterrupt:
                break
    s.close()
    print('服务端已关闭')

    client:

    import socket
    ip = '192.168.137.128'          #服务器ip
    port = 8083                   #服务器端口
    s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #绑定属性ipv4,udp协议 
    while True:
        try:
            msg = input('>>> ')               #输入要发送的消息
            if msg == 'quit' or msg == 'q':
                break
            if msg:
                s.sendto(msg.encode('utf-8'),(ip,port))   #想服务器发送消息
            else:
                print('消息不能为空,请从新回复')
            date,c_addr = s.recvfrom(1024)            #接受服务器返回的消息
            print('%s:%s' % (c_addr,date.decode('utf-8')))
        except KeyboardInterrupt:
            break
    s.close()
    print('客户端已经关闭')

    运行结果:

    server端:

     

    client1:

    client2:

     

     

  • 相关阅读:
    论工作动力的来源是什么?答案是来自于实现自己的梦想
    向梦想者致敬
    内置函数,递归函数,模块与包,开发目录规范
    迭代器,生成器
    闭包函数,装饰器,语法糖
    函数对象,名称空间及查找,作用域
    函数调用与参数
    字符编码
    文件处理
    python 11.5数据类型及常用方法
  • 原文地址:https://www.cnblogs.com/zhangan/p/10108837.html
Copyright © 2011-2022 走看看