zoukankan      html  css  js  c++  java
  • 网络编程-socket(三)(TCP长连接和UDP短连接、时间服务器)

    详解地址:https://www.cnblogs.com/mys6/p/10587673.html

    TCP

    server端

    import socket
    sk = socket.socket() # 创建了一个socket对象
    sk.bind(('192.168.21.36',8080)) # 绑定一台机器的(ip,端口)
    # 回环地址 - 指向自己这台机器
    sk.listen() # 建立监听等待别人连接
    conn,addr = sk.accept() # 阻塞:在这里等待直到接到一个连接
    # conn是连接
    # addr是对方的地址
    print(conn)
    print(addr)
    conn.send(b'hello') # 和对方打招呼
    msg = conn.recv(1024) # 对方和我说的话
    # 有发必有收 收发必相等
    print(msg)
    conn.close() # 挂电话
    sk.close() # 关机


    client端
    import socket
    sk = socket.socket() # 买个手机
    sk.connect(('127.0.0.1',8080)) # 拨号
    ret = sk.recv(1024)
    print(ret)
    sk.send(b'byebye!')
    sk.close()


    TCP聊天小工具
    server端
    import socket
    sk = socket.socket()
    sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    sk.bind(('192.168.21.36',9000))
    sk.listen()
    while True:
    conn,addr = sk.accept() # 接收连接 三次握手conn
    while True:
    inp = input('>>>')
    if inp == 'q':
    conn.send(inp.encode('utf-8'))
    break
    conn.send(inp.encode('utf-8'))
    msg = conn.recv(1024)
    if msg == b'q':break
    print(msg.decode('utf-8'))
    conn.close() # 四次挥手
    sk.close()


    client端
    import socket
    sk = socket.socket()
    sk.connect(('127.0.0.1',9000))
    while True:
    msg = sk.recv(1024)
    print(msg.decode('utf-8'))
    if msg == b'q':break
    inp = input('>>>')
    if inp == 'q':
    sk.send(inp.encode('utf-8'))
    break
    sk.send(inp.encode('utf-8'))
    sk.close()

    client1

    再加一个client2

    #server client 已建立了长连接通道,client2发送的消息只能等待,直到服务端和client1断开

    server服务端建立一个长连接,作为和client断开后,继续下一个连接通道,调整如下:

    server端

    UDP
    server端
    import socket
    sk = socket.socket(type=socket.SOCK_DGRAM) # 建立一个socket对象,
    # 指定以UDP协议的形式来连接
    sk.bind(('127.0.0.1',8080))
    # 指定服务的地址

    msg,addr = sk.recvfrom(1024) # 接收消息,发送端的地址
    print(msg,addr)
    sk.sendto(b'HELLO',addr) # 给发送端回复消息

    sk.close() # 关闭socket连接


    # UDP的server不需要进行监听也不需要建立建立连接
    # 在启动服务之后只能被动的等待客户端发送消息过来
    # 客户端发送消息的同时还会自带地址信息
    # 消息回复的时候 不仅需要发送消息,还需要把对方的地址填写上
    client端
    import socket

    sk = socket.socket(type=socket.SOCK_DGRAM)

    sk.sendto(b'hello',('127.0.0.1',8080)) # 直接给服务器发送一段消息
    msg,addr = sk.recvfrom(1024) # 接收对面的回信
    print(msg)
    sk.close()

     
     

    udp聊天的小程序 

      server端

    import socket
    sk = socket.socket(type=socket.SOCK_DGRAM)
    sk.bind(('127.0.0.1',9090))
    while True:
    msg,addr = sk.recvfrom(1024)
    print('来自[%s:%s]的消息--%s'%(addr[0],addr[1],msg.decode('utf-8')))

    inp = input('>>>')
    sk.sendto(inp.encode('utf-8'),addr)

    sk.close()


    client端
    import socket
    sk = socket.socket(type=socket.SOCK_DGRAM)
    addr = ('127.0.0.1',9090)
    while True:
    msg = input('>>>')
    sk.sendto(msg.encode('utf-8'),addr)
    msg_recv,addr = sk.recvfrom(1024)
    print(msg_recv.decode('utf-8'))
    sk.close()

    QQ多人聊天(用户带颜色而且显示地址、端口

    时间服务器

           # 需求
    # 写一个时间同步的服务器
    # 服务端接收请求
    # 按照client端发送的时间格式,将服务器时间转换成对应格式
    # 发送给客户端
    server端---------
    import time
    import socket

    sk = socket.socket(type=socket.SOCK_DGRAM)
    sk.bind(('127.0.0.1',9000))
    while True:
    msg,addr = sk.recvfrom(1024)
    # msg 客户端发送给server端的时间格式 "%Y-%m-%d %H:%M-%S"
    time_format = msg.decode('utf-8')
    time_str = time.strftime(time_format)
    sk.sendto(time_str.encode('utf-8'),addr)
    sk.close()


    client端----
    # client端每隔一段时间发送请求到服务端
    # 发送时间的格式
    import time
    import socket
    sk = socket.socket(type = socket.SOCK_DGRAM)
    sk.sendto('%Y-%m-%d %H:%M:%S'.encode('utf-8'),('127.0.0.1',9000))
    msg,addr = sk.recvfrom(1024)
    print(msg.decode('utf-8'))
    sk.close()

    # 方式一
    # 操作系统的定时任务 + python代码的形式
    # 方式二
    # while True + time.sleep的形式
    
    
  • 相关阅读:
    spring
    redis
    CentOS 6 安装教程(转载)
    Ajax&JSON
    课时2:RequestMapping映射及个属性
    课时1:SpringMVC环境搭建及第一个程序
    课时2:Spring整合MyBatis的几种方式 前面一个课时已经讲了一种思路了
    课时1:Spring整合MyBatis思路
    课时14:Bean的生命周期,通过import引入分散的spring文件
    课时13:作用域
  • 原文地址:https://www.cnblogs.com/mys6/p/10778795.html
Copyright © 2011-2022 走看看