zoukankan      html  css  js  c++  java
  • socket网络编程

    为什么要学习socket?

    我们学习这个东东就是为了完成C/S架构的开发

    (C:指的是客户端;S:指的是服务端)

    服务端就是提供服务的一端 ,而客户端听名字就知道指的是用户使用的一端

    学习socket一定要先学习互联网协议:

    c/s架构的软甲(应用层)是基于网络通信的====>网络的核心是一堆协议,协议既是标准,如果你想开发基于网络通信的软件就必须遵循这些标准(有点类似于某些软件的安装时出现的霸王条款,必须接受,否则就不让你安装)


    socket()的用法

     1 import socket        #模块必须导入
     2 socket.socket(socket_family,socket_type,protocal=0)
     3 socket_family 可以是 AF_UNIX 或 AF_INET。socket_type 可以是 SOCK_STREAM 或 SOCK_DGRAM。protocol 一般不填,默认值为 0。
     4 
     5 获取tcp/ip套接字
     6 tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     7 
     8 获取udp/ip套接字
     9 udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    10 
    11 由于 socket 模块中有太多的属性。我们在这里破例使用了'from module import *'语句。使用 'from socket import *',我们就把 socket 模块里的所有属性都带到我们的命名空间里了,这样能 大幅减短我们的代码。
    12 例如tcpSock = socket(AF_INET, SOCK_STREAM)
    函数大致用法

    服务端套接字函数:

    s.bind()    绑定(主机,端口号)到套接字
    s.listen() 开始TCP监听
    s.accept() 被动接受TCP客户的连接,否则会一直卡在那了

    客户端套接字函数:

    s.connect()     主动初始化TCP服务器连接
    s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常

    公共用途套接字函数:

    s.recv()            接收TCP数据
    s.send() 发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
    s.sendall() 发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
    s.recvfrom() 接收UDP数据
    s.sendto() 发送UDP数据
    s.getpeername() 连接到当前套接字的远端的地址
    s.getsockname() 当前套接字的地址
    s.getsockopt() 返回指定套接字的参数
    s.setsockopt() 设置指定套接字的参数
    s.close() 关闭套接字

    用打电话模拟socket

     1 from socket import *
     2 phone=socket(AF_INET,SOCK_STREAM)
     3 phone.bind(('127.0.0.1',8081))
     4 phone.listen(5)
     5 
     6 conn,addr=phone.accept()
     7 while True:
     8     data=conn.recv(1024)
     9     print('server===>')      #测试代码
    10     print(data)           #同↑
    11     conn.send(data.upper())
    12 conn.close()
    13 phone.close()
    服务端
     1 from socket import *
     2 
     3 phone=socket(AF_INET,SOCK_STREAM)
     4 phone.connect(('127.0.0.1',8081))
     5 
     6 while True:
     7     msg=input('>>: ').strip()
     8     phone.send(msg.encode('utf-8'))
     9     print('client====>')
    10     data=phone.recv(1024)
    11     print(data)
    客户端

    基于TCP的小例子:

    import socket         #导入socket模块
    import subprocess     #后期处理系统文件用
    phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  #phone:套接字的创建
    # phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR)   #这句代码主要功能是解决地址的冲突
    phone.bind(('127.0.0.1',8080))        #套接字与IP和端口的绑定
    phone.listen(5)        #当与多台客户端通信时挂起的主机数
    
    print('starting running .... #这里是做测试的,可以删掉')
    while True:       #链接循环,否则就会卡主不动
        conn,client_addr = phone.accept()      #等待客户端发起通信
        print('------->',conn,client_addr)     #查看着两者的属性
    
        while True:      #通信循环功能
            try:       #异常处理
                cmd = conn.recv(1024)
                if not cmd:break
                res = subprocess.Popen(cmd.decode('utf-8'),shell=True,
                                       stdout=subprocess.PIPE,
                                       stderr=subprocess.PIPE)
                stdout = res.stdout.read()
                stderr = res.stderr.read()
                conn.send(stdout+stderr)
            except Exception:
                break           #出现异常直接结束
        conn.close()   #挂电话操作
    phone.close()     #关机操作
    

      

    import socket
    phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    phone.connect(('127.0.0.1',8080))
    while True:
        cmd = input('>>>:a').strip()
        if not cmd:continue
        phone.send(cmd.encode('utf-8'))
        cmd_res = phone.recv(1024)
        print(cmd_res.decode('gbk'))
    phone.close()

  • 相关阅读:
    Java 8的新并行API
    java lambda表达式
    用Java反射输出对象的所有属性的值
    整数划分问题
    比较常用的几个正则表达式
    bilibili的下载文件可以有多深
    vim中的宏和normal命令
    vim与正则表达式
    Manjaro软件推荐
    解决无法更新
  • 原文地址:https://www.cnblogs.com/52-qq/p/7405055.html
Copyright © 2011-2022 走看看