Python中的socket如何使用?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python中的socket如何使用?相关的知识,希望对你有一定的参考价值。

本文和大家分享的主要是python 中socket相关内容,一起来看看吧,希望对大家 学习python有所帮助。
 一. socket模块
socket ,俗称套接字,其实就是一个 ip 地址和端口的组合。类似于这样的形式 (ip,  port), 其中 ip 代表的是某个主机, port 代表的是某个应用,我们可以通过 socket 和另外的一台主机进行通信。
关于socket 源码的解析在 tarnado 系列文章中,正在写中。。。。。
 1. 通信的方式
tcp 通信
udp 通信
基于unix 的通信
 2. socket的方法
#  暂时知道的也就这么多,之后要是在用到其他的我会继续进行保存
Methods of  socket objects (keyword arguments  not allowed):
_accept() --  accept connection, returning new  socket fd  and client address
 bind(addr) --  bind the  socket to a  local address  给本地地址绑定一个 socket 套接字
 close() --  close the  socket  关闭一个套接字
 connect(addr) --  connect the  socket to a remote address      连接到远端主机
connect_ex(addr) --  connect,  return an error code instead of an exception
dup() --  return a new  socket fd duplicated from fileno()
fileno() --  return underlying file descriptor
 getpeername() --  return remote address
  •  getsockname() --  return  local address
     getsockopt(level, optname[, buflen]) -- get  socket options
    gettimeout() --  return timeout  or None
     listen([n]) -- start listening  for incoming connections
     recv(buflen[, flags]) -- receive data    接受数据
    recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)     接受数据到缓冲区中,
    recvfrom(buflen[, flags]) -- receive data  and sender’s address
    recvfrom_into(buffer[, nbytes, [, flags])
    -- receive data and sender’ s address (into a buffer)
    sendall(data[, flags]) --  send all data  发送数据给远端主机, 3.x 之后只能发送字节形式,因此在发送的时候一般要进行转换 bytes
     send(data[, flags]) --  send data, may  not  send all of it  也是发送数据,区别在于 send 发送的不完整,随机进行发送的,二sendall 发送的完整
    sendto(data[, flags], addr) --  send data to a  given address  基于 udp 发送数据的
    setblocking(0 | 1) -- set  or clear the blocking I/O flag     是否设置成阻塞模式 0  代表阻塞, 1 代表非阻塞
     setsockopt(level, optname, value) -- set  socket options      设置一些 socket 的桉树
    settimeout(None | float) -- set  or clear the timeout     设置超时市场
     shutdown(how) -- shut down traffic in one  or both directions
    if_nameindex() --  return all network interface indices  and names
    if_nametoindex(name) --  return the corresponding interface  index
    if_indextoname( index) --  return the corresponding interface name
  • not available on all platforms!
  •  二. 简单的聊天机器人
    如果发送一个数据,服务器就会给他回复一个数据 +  你好
    1 # -*- coding:utf-8 -*-
    2 # zhou
    3 # 2017/7/3
    4
    5  import socket
    6 #  创建一个 server 对象
    7 server_obj = socket.socket()
    8 #  绑定一下端口
    9 server_obj.bind(("127.0.0.1", 8888, ))
    10 #  设置监听的等待队列长度为 5, 当大于 5 的时候就拒绝连接
    11 server_obj.listen(5)
    12
    13  while  True:
    14     #  等待接受客户端的连接 , 为阻塞方式
    15     conn, address = server_obj.accept()
    16     #  发送欢迎信息
    17     conn.sendall(bytes(" 欢迎来到简单的聊天室 ..", encoding=’utf-8’))
    18      while  True:
    19         #  接受到对面的消息就会把对面消息后面加上你好重新发送回去
    20         ret = str(conn.recv(1024), encoding=’utf-8’)
    21          if ret == ’q’:
    22             #  如果对面发送的为 q 就退出
    23              break
    24         conn.sendall(bytes(ret + ", 你好 ", encoding=’utf-8’))
    server
    # -*- coding:utf-8 -*-# zhou# 2017/7/3
    import  socket
    client =  socketsocket()
    client.connect(("127.0.0.1", 8888, ))#  接受欢迎信息并打印
    ret = str(client.recv(1024),  encoding=’utf-8’)
    print(ret)
     while True:
    message = input(" 请输入您要发送的内容 :")
    client.sendall(bytes(message,  encoding=’utf-8’))
     if message == ’q’:
     break
    ret = str(client.recv(1024),  encoding=’utf-8’)
    print(ret)
    client
     三. 简单的ftp上传
    实现了将一个图片上传到服务器端
    1 # -*- coding:utf-8 -*-
    2 # zhou
    3 # 2017/7/2
    4
    5  import socket
    6
    7 server = socket.socket()
    8 server.bind(("127.0.0.1", 9998, ))  #  绑定 ip
    9 server.listen(5)
    10
    11  while  True:
    12     conn, address = server.accept()
    13     #  连接之后首先接收文件大小
    14     file_size = int(str(conn.recv(1024), encoding=’utf-8’))
    15     #  用来解决粘包问题的
    16     conn.sendall(bytes("1001", encoding=’utf-8’))
    17     #  已经接受的文件大小
    18     has_size = 0
    19     num = 1
    20     #  连接之后接收文件
    21     f = open("new.jpg", ’wb’)
    22      while  True:
    23         num += 1
    24          if file_size == has_size:
    25              break
    26         data = conn.recv(1024)
    27         f.write(data)
    28         has_size += len(data)
    29     f.close()   #  关闭文件
    ftpserver
    1 # -*- coding:utf-8 -*-
    2 # zhou
    3 # 2017/7/2
    4
    5
    6  import os
    7  import socket
    8
    9 client = socket.socket()
    10
    11 client.connect(("127.0.0.1", 9998), )
    12 #  传送文件大小
    13 file_size = os.stat("1.jpg").st_size
    14 print(file_size)
    15 #  发送文件大小
    16 client.sendall(bytes(str(file_size), encoding=’utf-8’))
    17 client.recv(1024)   #  解决粘包问题
    18 #  发送文件
    19  with open("1.jpg", ’rb’)  as f:
    20      for line  in f:
    21         client.sendall(line)
    22 client.close()
    ftpclient
     四. 粘包问题的解决
    对于上面第三个ftp 上传进行的描述,
    解决粘包的问题,当我们上传一个文件的时候,首先上传他的大小,当我们上传完大小之后要在写一句接受的语句,而服务器端在接受到文件大小之后要给我们立马发送一个数据用来确认,这样我们就可以完美的将数据喝大小分割开了。
    Python的socket详解 
    来源: 博客园

    以上是关于Python中的socket如何使用?的主要内容,如果未能解决你的问题,请参考以下文章

    python - 如何在一个套接字上使用传入数据流来处理Python中的多个并行进程?

    Python 套接字中的发送和接收是如何工作的?

    python中使用socket编程,如何能够通过UDP传递一个列表类型的数据?

    Mininet如何在python中获得Mininet中的主机名称

    python深入2socket编程

    python处理网络数据