• socket套接字


    socket

    什么是socket?

             socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口,它把复杂的TCP/IP协议族隐藏在socket接口后面,对用户来说,一组简单的接口就是全部。

    为什么使用socket?

             socket帮我们把复杂的TCP/IP协议族封装好了,我们只需要调用socket的接口。

    怎么用?

             基于tcp的套接字(socket):

    服务端:服务端就相当于手机通信过程

    import socket
    #1、买手机
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #tcp称为流式协议,udp称为数据报协议SOCK_DGRAM
    # print(phone)
    
    #2、插入/绑定手机卡
    # phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    phone.bind(('127.0.0.1',8080))
    
    #3、开机
    phone.listen(5) # 半连接池,限制的是请求数
    
    #4、等待电话连接
    print('start....')
    conn,client_addr=phone.accept() #(三次握手建立的双向连接,(客户端的ip,端口))
    # print(conn)
    print(client_addr)
    
    #5、通信:收发消息
    data=conn.recv(1024) #最大接收的字节数
    print('来自客户端的数据',data)
    conn.send(data.upper())
    
    # import time
    # time.sleep(500)
    #6、挂掉电话连接
    conn.close()
    
    #7、关机
    phone.close()

    客户端:客户端相当于找电话亭给他人打电话过程

    import socket
    
    #1、找电话亭
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    print(phone)
    #2、拨电话
    phone.connect(('127.0.0.1',8080)) # 指定服务端ip和端口
    
    #3、通信:发收消息
    phone.send('hello'.encode('utf-8'))
    # phone.send(bytes('hello',encoding='utf-8'))
    data=phone.recv(1024)
    print(data)
    
    # import time
    # time.sleep(500)
    #4、挂机
    phone.close()

    为服务端与客户端加上连接循环与通信循环

    服务端:

    import socket
    
    #1、买手机
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #tcp称为流式协议,udp称为数据报协议SOCK_DGRAM
    
    #2、插入/绑定手机卡
    # phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # 防止地址仍被占用时报错
    phone.bind(('127.0.0.1',8080))
    
    #3、开机
    phone.listen(5) # 半连接池,限制的是请求数
    
    #4、等待电话连接
    print('start....')
    while True: # 连接循环
        conn,client_addr=phone.accept() #(三次握手建立的双向连接,(客户端的ip,端口))
        # print(conn)
        print('已经有一个连接建立成功',client_addr)
    
        #5、通信:收发消息
        while True: # 通信循环
            try:
                print('服务端正在收数据...')
                data=conn.recv(1024) #最大接收的字节数,没有数据会在原地一直等待收,即发送者发送的数据量必须>0bytes
                # print('===>')
                if len(data) == 0:break #在客户端单方面断开连接,服务端才会出现收空数据的情况
                print('来自客户端的数据',data)
                conn.send(data.upper())
            except ConnectionResetError:
                break
        #6、挂掉电话连接
        conn.close()

    客户端

    #1、买手机
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # print(phone)
    #2、拨电话
    phone.connect(('127.0.0.1',8080)) # 指定服务端ip和端口
    
    #3、通信:发收消息
    while True: # 通信循环
        msg=input('>>: ').strip() #msg=''
        if len(msg) == 0:continue
        phone.send(msg.encode('utf-8'))
        # print('has send----->')
        data=phone.recv(1024)
        # print('has recv----->')
        print(data)
  • 相关阅读:
    关于使用css3属性:transform固定菜单位置,在滑动页面时菜单闪现抖动的问题
    使用iscroll.js插件时,遇到在Android端无法点击a超链的解决办法
    window.external的使用
    SpringMVC的拦截器(Interceptor)和过滤器(Filter)的区别与联系
    chain.doFilter(request,response)含义
    巧用Ajax的beforeSend 提高用户体验
    getRequestDispatcher(path).forward(),,执行完,后面的代码居然还会执行!!!记得加return 啊亲
    @JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
    ajax修改表单的值后dom没更新的解决办法
    .net core json序列化首字符小写和日期格式处理
  • 原文地址:https://www.cnblogs.com/luck-L/p/9276471.html
Copyright © 2020-2023  润新知