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]的一条消息:\033[1;44m%s\033[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]的一条消息:\033[1;44m%s\033[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]的一条消息:\033[1;44

 

 

 

posted @ 2017-07-10 20:27  皖心  阅读(167)  评论(0编辑  收藏  举报