zoukankan      html  css  js  c++  java
  • socket tcp

    1.socket

       套接字,本质上是一个模块,里面封装了一些网络通讯协议 是处于传输层和应用层之间的一个抽象层,实际在OSI中并不存在 也就是没有socket也能能够通讯 ,但是这样一来 我们必须完全按照OSI规定的各种协议来编码 这是一个重复,复杂的过程,为了提高开发效率,就出现了socket模块,专门帮我们封装了传输层以下的一堆协议 有socket模块之后 当我们需要编写网络通讯的程序时,就不需要在关心具体的协议细节,直接使用socket提供的功能接口即可  

      门面设计模式,隐藏复杂的内部细节,仅提供最简单的使用接口 本质就是封装

    2.TCP通讯 网络通讯一定分为两端,服务器和客户端

     服务器:

      1.创建socket对象 server = socket.socket()

      2.绑定一个固定的ip和端口 server.bind ip必须是本机ip 端口1024-65535 不要使用常见的端口 web:80 / 8080 mysql 3306 ssh:22 ftp:21

      3.开始监听客户端的到来 server.listen

      4.接收客户端的链接请求 server.accept # 阻塞直到客户链接到来 没有新连接则不可能执行该函数

      5.收发数据 需要循环 recv 收 收多少字节数 send 发 只能发二进制数据

    import socket
    
    server = socket.socket()
    server.bind(("127.0.0.1",1688))
    server.listen(1)
    # back
    
    while True:
        # socket,addr一个元组 客户端的ip和port
        client,addr = server.accept()
        print("接到一个客人了!开始服务!")
        # 循环收发数据
        while True:
            try:
                data = client.recv(1024).decode("utf-8")
                if not data:
                    break
                print(data)
                res = data[1:]
                # client.send(res.encode("utf-8"))
            except ConnectionResetError as e:
                print("客户端了挂了!",e)
                break
        client.close()
    
    #server.close()
    客户端:
      1.创建socket对象 client = socket.socket()
      2.链接服务器   client.connect((ip,port))
      3.收发数据   通常需要循环
          send 发   只能发二进制数据
          recv 收   收多少字节数
      4.断开链接   client.close()
    import socket
    
    client = socket.socket()
    try:
        client.connect(("127.0.0.1",1688))
        print("链接成功!")
        while True:
            msg = input(":")
            if msg == "q": break
            if not msg: continue
            client.send(msg.encode("utf-8"))
    
            data = client.recv(1024)
            print(data.decode("utf-8"))
    
        client.close()
    except ConnectionRefusedError as e:
        print("链接服务器失败了!",e)
    except ConnectionResetError as e:
        print("服务器挂了!", e)
        client.close() 

    3.常见的异常

    1.一方异常下线,另一方还要收发数据 :ConnectionResetError 在send recv的地方 加上try 客户端也需要异常处理

    2.端口占用异常 重复运行服务器 之前的进程没有正确关闭 关闭和打开端口 都是操作系统负责 在一些极端情况下 可能应用程序已经正确接收并且通知了操作系统要关闭端口 但是操作系统 没及时处理

      2.1 更换端口

      2.2 查后台进程 杀掉它

      2.3 重启服务器电脑

     

  • 相关阅读:
    web前端学习(四)JavaScript学习笔记部分(8)-- JavaScript瀑布流
    localStorage对象简单应用
    html文档加载顺序简单理解
    回调函数理解(转载)
    web前端学习(四)JavaScript学习笔记部分(8)-- JavaScript 浏览器对象
    web前端学习(四)JavaScript学习笔记部分(7)-- JavaScript DOM对象控制HTML元素详解
    JS random函数深入理解(转载)
    web前端学习(四)JavaScript学习笔记部分(6)-- js内置对象
    下雪了-js下雪效果
    LESS笔记
  • 原文地址:https://www.cnblogs.com/wyf20190411-/p/10944923.html
Copyright © 2011-2022 走看看