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

    socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。

    socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)

    socket和file的区别:

    • file模块是针对某个指定文件进行【打开】【读写】【关闭】
    • socket模块是针对 服务器端 和 客户端Socket 进行【打开】【读写】【关闭】

    第一阶段:单客户端模式

     1 #-*- coding:utf-8 -*-
     2 import socket,os
     3 sk=socket.socket()
     4 sk.bind(('127.0.0.1',9999))#启动
     5 sk.listen(5)
     6 while True:
     7     conn,address=sk.accept()#等待客户端连接
     8     conn.sendall(bytes('欢迎光临!',encoding='utf-8'))
     9     file_size=str(conn.recv(1024),encoding='utf-8')
    10     file_size=int(file_size)
    11     has_recv=0
    12     conn.sendall(bytes('', encoding='utf-8'))#防止粘包
    13     f=open('1.jpg','wb')
    14     while has_recv!=file_size:
    15         data=conn.recv(1024)
    16         f.write(data)
    17         has_recv+=len(data)#计算已发送字节
    18     f.close()
    发送图片服务端
     1 #-*- coding:utf-8 -*-
     2 import socket
     3 import os
     4 
     5 obj = socket.socket()
     6 obj.connect(('127.0.0.1', 9999))#连接服务端
     7 print(111)
     8 ret_bytes=obj.recv(1024)#接收欢迎消息
     9 ret_str=str(ret_bytes,encoding='utf-8')
    10 print(ret_str)
    11 size=os.stat('f.jpg').st_size
    12 obj.sendall(bytes(str(size),encoding='utf-8'))#发送文件大小
    13 obj.recv(1024)#防止粘包
    14 with open('f.jpg','rb') as f :
    15     for line in f:
    16         obj.sendall(line)
    17     obj.close()
    发送图片客户端

    第二阶段:多客户端模式,利用select伪造并发

     1 #IO多路复用
     2 import socket
     3 import select
     4 sk1=socket.socket()
     5 sk1.bind(('127.0.0.1',8001))
     6 sk1.listen(1)
     7 inputs=[sk1,]
     8 outputs=[]
     9 qlist=[]
    10 while True:
    11     print('正在监听的数据%d'%len(inputs))
    12     rlist,wlist,elist=select.select(inputs,outputs,[],1)
    13 #rlist为发生变化的,wlist传入什么就是什么,elist是错误的
    14     for conn in outputs:
    15         conn.sendall(bytes(qlist[0]+'hao',encoding='utf-8'))
    16         outputs.remove(conn)
    17     qlist.clear()
    18     for sk in rlist:#发消息
    19         if sk == sk1:
    20             conn,address=sk.accept()
    21             conn.sendall(bytes('hello',encoding='utf-8'))
    22             inputs.append(conn)
    23         else:
    24             try:#收消息
    25                 result=str(sk.recv(1024),encoding='utf-8')
    26                 qlist.append(result)
    27                 print(result)
    28                 # sk.sendall(bytes('hao',encoding='utf-8'))
    29             except Exception:
    30                 inputs.remove(sk)
    31             else:outputs.append(sk)
    server端
     1 import socket
     2 import select
     3 sk1=socket.socket()
     4 sk1.connect(('127.0.0.1',8001))
     5 result=str(sk1.recv(1024),encoding='utf-8')
     6 print(result)
     7 while True:
     8     a=input('>>>')
     9     sk1.sendall(bytes(a,encoding='utf-8'))
    10     result=str(sk1.recv(1024),encoding='utf-8')
    11     print(result)
    client端

    第三阶段:IO多路复用加多线程,socketserver模块

    1 #-*- coding:utf-8 -*-
    2 import socketserver
    3 class Myserver(socketserver.BaseRequestHandler):
    4     def handle(self):
    5             #只要有用户连接 就会执行handle方法
    6            # 写要执行的代码
    7 if __name__=='__main__':
    8     Server=socketserver.ThreadingTCPServer(('127.0.0.1',8888),Myserver)
    9     Server.serve_forever()    
    socketserver
  • 相关阅读:
    Bootstrap-select 动态绑定值
    Centos 下载
    设置图片大小和旋转
    aolication全局传递参数
    Activity静态变量传递参数
    Activity传递参数
    Activity横屏后声明周期的变化
    Intent隐式意图
    Intent显示意图的四种跳转
    SharedPreferences简单的应用
  • 原文地址:https://www.cnblogs.com/shenwenlong/p/5573977.html
Copyright © 2011-2022 走看看