zoukankan      html  css  js  c++  java
  • socket

    Socket

    网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket, 又称为套接字

    socket模块是针对 服务器端 和 客户端Socket 进行【打开】【读写】【关闭】

    过程

    1、服务器根据IP地址类型、socket类型、协议来创建socket对象。

    2、为服务器socket对象绑定IP地址和端口号。

    3、服务器socket监听端口号请求,随时准备接收来自客户端的请求,此时,socket并没有打开。

    4、客户端创建socket对象。

    5、客户端打开socket,根据IP地址和端口号试图连接服务器。

    6、服务器监听到客户端的连接请求,被动打开socket

    7、服务器socket通过Accept进入阻塞状态,等待客户端返回连接信息。

    8、客户端连接成功,返回连接信息给服务器。

    9、服务器连接成功。

    10、服务器与客户端之间,根据一收一发原则发送和接收数据。

    11、客户端socket关闭。

    12、服务器socket关闭。

     方法  

     import socket

    1. socket()

    socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)

    family = AF_INET 表示服务器之间的通信。AF_UNIX  表示Unix不同进程间的通信

    type = SOCK_STREAM  表示TCP连接。SOCK_DGRAM  表示UDP连接。

    2. bind()

    sk.bind(address)

    将套接字绑定到地址(将地址与socket绑定)address地址的格式取决于地址族。在AF_INET下,以元组(host,port)的形式表示地址。addresshost IP,端口号)。

    3. listen()

    sk.listen(backlog)

    监听客户端的连接。backlog为可选参数。backlog指定在拒绝连接之前,可以挂起的最大连接数量,表示最大等待连接数量

    backlog等于5,表示内核已经接到了连接请求,但服务器还没有调用

    accept进行处理的连接个数最大为5,这个值不能无限大,因为要在内核中维护连接队列

    4.accept()

    sk.accept()

    接受连接并返回(conn,address,其中conn是新的套接字对象,表示客户端的sk对象,,可以用来接收和发送数据。address是连接客户端的地址。

    5.recv()

    sk.recv(bufsize[,flag])

    接受套接字的数据。数据以字符串形式返回,bufsize指定最多可以接收的数量。flag提供有关消息的其他信息,通常可以忽略。

    6.connect()

    sk.connect(address)

    连接指定地址的socketaddress用元组表示。如果连接出错,返回socket.error错误。

    7.send()

    sk.send(data)data发送给连接的socket

    sk.send(string[,flag])string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。即:可能未将指定内容全部发送。 

    基本Socket实例

    SocketServer.py运行起来后, 接收了一次客户端的data就退出

     1 import socket
     2 
     3 server = socket.socket() #获得socket实例
     4 
     5 server.bind(("localhost",9998)) #绑定ip port
     6 server.listen()  #开始监听
     7 print("等待客户端的连接...")
     8 conn,addr = server.accept() #接受并建立与客户端的连接,程序在此处开始阻塞,只到有客户端连接进来...
     9 print("新连接:",addr )
    10 
    11 data = conn.recv(1024)
    12 print("收到消息:",data)
    13 
    14 
    15 server.close()
    SocketServer.py
    1 import socket
    2 
    3 client = socket.socket()
    4 
    5 client.connect(("localhost",9998))
    6 
    7 client.send(b"hey")
    8 
    9 client.close()
    SocketClient.py

    一个连接建立起来后,多次的数据交互

     1 import socket
     2 
     3 server = socket.socket() #获得socket实例
     4 
     5 server.bind(("localhost",9998)) #绑定ip port
     6 server.listen()  #开始监听
     7 print("等待客户端的连接...")
     8 conn,addr = server.accept() #接受并建立与客户端的连接,程序在此处开始阻塞,只到有客户端连接进来...
     9 print("新连接:",addr )
    10 while True:
    11 
    12     data = conn.recv(1024)
    13 
    14     print("收到消息:",data)
    15     conn.send(data.upper())
    16 
    17 server.close()
    SocketServer.py
     1 import socket
     2 
     3 client = socket.socket()
     4 
     5 client.connect(("localhost",9998))
     6 
     7 while True:
     8     msg = input(">>:").strip()
     9     if len(msg) == 0:continue
    10     client.send( msg.encode("utf-8") )
    11 
    12     data = client.recv(1024)
    13     print("来自服务器:",data)
    14 
    15 client.close()
    SocketClient.py

    客户端一断开,服务器端就收不到数据了,但是不会报错,就进入了死循环模式

     加个判断服务器接到的数据是否为空

     1 import socket
     2 
     3 server = socket.socket() #获得socket实例
     4 
     5 server.bind(("localhost",9998)) #绑定ip port
     6 server.listen()  #开始监听
     7 print("等待客户端的连接...")
     8 conn,addr = server.accept() #接受并建立与客户端的连接,程序在此处开始阻塞,只到有客户端连接进来...
     9 print("新连接:",addr )
    10 while True:
    11 
    12     data = conn.recv(1024)
    13     if not data:
    14         print("客户端断开了...")
    15         break
    16     print("收到消息:",data)
    17     conn.send(data.upper())
    18 
    19 server.close()
    SocketServer.py
  • 相关阅读:
    转载:c++内存泄露机制
    推荐一款不错的dialog小工具:artDialog
    写的一些推广方法 拿出来分享下
    struts2标签具体解释
    父亲节:再见,总有一天
    Hadoop是什么
    熊猫烟花集团完美见证异速联远程接入系统
    OpenStack Networking
    管道(Pipe)/createPipe
    百度2014校园招聘算法——给出一组数据A=[a_0, a_1, a-2, ... a_n](当中n可变),打印出该数值元素的全部组合。
  • 原文地址:https://www.cnblogs.com/hmm1995/p/10012290.html
Copyright © 2011-2022 走看看