博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
socket 网络编程
阅读量:4465 次
发布时间:2019-06-08

本文共 3650 字,大约阅读时间需要 12 分钟。

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 socketimport subprocessphone_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 socketclient_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 socketip_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)#客户端1import socketudp_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 socketudp_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

 

 

 

转载于:https://www.cnblogs.com/mona524/p/7147530.html

你可能感兴趣的文章
第一堂java web课
查看>>
操作系统简介
查看>>
第1周小组博客作业--1703班06组
查看>>
vue项目中icon图标的完美引入
查看>>
C语言指针
查看>>
Java的安装
查看>>
0920 JSON数据 蓝懿
查看>>
Azure Cosmos DB 使用费用参考
查看>>
【嵌入式开发】写入开发板Linux系统-模型S3C6410
查看>>
C# 子线程与主线程通讯方法一
查看>>
006——修改tomacat的编码
查看>>
《C程序设计语言》笔记 (八) UNIX系统接口
查看>>
git常用命令
查看>>
Android必知必会-获取视频文件的截图、缩略图
查看>>
(转)理解Bitblt、StretchBlt与SetDIBitsToDevice、StretchDibits
查看>>
python之路-基础篇-第七周
查看>>
高性能队列Disruptor系列2--浅析Disruptor
查看>>
ViurtualBox配置虚拟机Linux的网络环境
查看>>
VLC 媒体播放器
查看>>
勿忘国耻2018/09/18
查看>>