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

    socket 网络编程即c/s架构
    1:硬件c/s架构(打印机)
    2:软件c/s架构——b/s架构(web服务)

    Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,让Socket去组织数据,以符合指定的协议。

    基于文件类型的套接字家族

    套接字家族的名字:AF_UNIX----基于文件

    unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信

    基于网络类型的套接字家族

    套接字家族的名字:AF_INET----基于网络

    (还有AF_INET6被用于ipv6,还有一些其他的地址家族,不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是很少被使用,或者是根本没有实现,所有地址家族中,AF_INET是使用最广泛的一个,python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我么只使用AF_INET)

    面向连接的套接字:通信前需要先建立一个连接。----虚拟电路/流套接字

    面向连接的通信提供序列化的,可靠的喝不重复的数据交付,而没有记录边界。实现面向连接类型的主要协议是传输控制协议TCP,socket使用socket.SOCK.STREAM作为套接字类型。

    无连接的套接字:  通信前不需要建立连接。

    在数据传输过程中并无法保证它的顺序性,可靠性和重复性。数据报保存了记录边界。实现无连接类型的主要是用户数据报协议UDP,socket使用SOCK.DGRAM作为套接字类型。

    面向连接套接字---模仿ssh 命令

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # Created by Mona on 2017/7/10
    #服务端:
    
    import socket
    import subprocess
    phone_server=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机
    phone_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #就是它,在bind前加,防止服务器断开后端口未清除
    phone_server.bind(('127.0.0.1',8080)) #绑手机卡
    
    phone_server.listen(5) #开机
    
    print('server run...')
    while True:
        conn,client_addr=phone_server.accept() #等电话
        print('客户端: ',client_addr)
    
        while True: #通讯循环
            try:
                cmd=conn.recv(1024) #收消息
                res=subprocess.Popen(cmd.decode('utf-8'),
                                 shell=True,
                                 stdout=subprocess.PIPE,
                                 stderr=subprocess.PIPE)
    
                stdout=res.stdout.read()
                stderr=res.stderr.read()
                conn.sendall(stdout+stderr)
            except Exception:
                break
    
        conn.close() #挂电话
    
    phone_server.close() #关机
    
    #客户端:
    import socket
    client_phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    client_phone.connect(('127.0.0.1',8080))
    
    while True:
        cmd = input('>>>>:').strip()
        if not cmd:continue
        client_phone.send(cmd.encode('utf-8'))
    
        sever_msg = client_phone.recv(1024)
        print(sever_msg.decode('utf-8'))
    
    client_phone.close()

    无线连接套接字-------模仿多人聊天

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # Created by Mona on 2017/7/10
    
    #服务端
    import socket
    ip_port = ('127.0.0.1',8081)
    udp_server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    udp_server.bind(ip_port)
    
    while True:
        qq_msg,addr = udp_server.recvfrom(1024)
        print('来自[%s:%s]的一条消息:33[1;44m%s33[0m'%(addr[0],addr[1],qq_msg.decode('utf-8')))
        back_msg = input('回复消息:').strip()
        udp_server.sendto(back_msg.encode('utf-8'),addr)
    
    #客户端1
    import socket
    udp_server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    qq_name = {'mona':('127.0.0.1',8081),'egon':('127.0.0.1',8081),'alex':('127.0.0.1',8081)}
    
    while True:
        qq_name_client = input('请选择聊天对象:').strip()
        while True:
            msg = input('请输入消息,回车发送').strip()
            if msg == 'quit': break
            if not msg or not qq_name_client or qq_name_client not in qq_name:continue
            udp_server.sendto(msg.encode('utf-8'),qq_name[qq_name_client])
            back_msg,addr  = udp_server.recvfrom(1024)
            print('来自[%s:%s]的一条消息:33[1;44m%s33[0m' % (addr[0], addr[1], back_msg.decode('utf-8')))
    
    #客户端2:
    import socket
    
    udp_server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    qq_name = {'mona': ('127.0.0.1', 8081), 'egon': ('127.0.0.1', 8081), 'alex': ('127.0.0.1', 8081)}
    
    while True:
        qq_name_client = input('请选择聊天对象:').strip()
        while True:
            msg = input('请输入消息,回车发送').strip()
            if msg == 'quit': break
            if not msg or not qq_name_client or qq_name_client not in qq_name: continue
            udp_server.sendto(msg.encode('utf-8'), qq_name[qq_name_client])
            back_msg, addr = udp_server.recvfrom(1024)
            print('来自[%s:%s]的一条消息:33[1;44

     

  • 相关阅读:
    java集合总结
    css基础:块级元素与行内元素
    第九周web作业:history of grammar
    正则表达式(regular expression rules)
    用indexOf查找字符出现次数
    DOM与BOM的概念
    css的单位以及调色法
    获取登录cookieColletion在cef里面打开网页
    引用CefSharp编译支持AnyCpu的办法
    解决H5移动端history.back无效
  • 原文地址:https://www.cnblogs.com/mona524/p/7147530.html
Copyright © 2011-2022 走看看