socket

函数socket()

使用socket.socket()函数来创建套接字,socket的函数如下:

  • socket(socket_family,socket_type, protocol= 0)
  • 其中socket_family 可以是 AF_UNIX 或 AF_INET。socket_type 可以是 SOCK_STREAM 或 SOCK_DGRAM。protocol 一般不填,默认值为 0。

具体解释:

参数一:地址簇

  socket.AF_INET IPv4(默认)
  socket.AF_INET6 IPv6

  socket.AF_UNIX 只能够用于单一的Unix系统进程间通信

参数二:类型

  socket.SOCK_STREAM  流式socket , for TCP (默认)
  socket.SOCK_DGRAM   数据报式socket , for UDP

  socket.SOCK_RAW 原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。
  socket.SOCK_RDM 是一种可靠的UDP形式,即保证交付数据报但不保证顺序。SOCK_RAM用来提供对原始协议的低级访问,在需要执行某些特殊操作时使用,如发送ICMP报文。SOCK_RAM通常仅限于高级用户或管理员运行的程序使用。
  socket.SOCK_SEQPACKET 可靠的连续数据包服务。

参数三:协议

  0  (默认)与特定的地址家族相关的协议,如果是 0 ,则系统就会根据地址格式和套接类别,自动选择一个合适的协议。

 

常用函数:

服务器端套接字函数
s.bind() 绑定地址(主机,端口号对)到套接字
s.listen() 开始 TCP 监听
s.accept() 被动接受 TCP 客户的连接, (阻塞式)等待连接的到来
客户端套接字函数
s.connect() 主动初始化 TCP 服务器连接
s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛异常
公共用途的套接字函数
s.recv() 接收 TCP 数据
s.send() 发送 TCP 数据
s.sendall() 完整发送 TCP 数据
s.recvfrom() 接收 UDP 数据
s.sendto() 发送 UDP 数据
s.getpeername() 连接到当前套接字的远端的地址
s.getsockname() 当前套接字的地址
s.getsockopt() 返回指定套接字的参数
s.setsockopt() 设置指定套接字的参数
s.close() 关闭套接字

s.setblocking()设置套接字的阻塞与非阻塞模式 

s.settimeout()设置阻塞套接字操作的超时时间 (客户端最多等待5秒)

s.gettimeout()得到阻塞套接字操作的超时时间

 

s.fileno() 套接字的文件描述符
s.makefile() 创建一个与该套接字关连的文件

 

 

对话小demo:

服务端:

#!/usr/bin/env python
# -*- coding:utf-8 -*-


import socket

ip_port = ('ip地址', 端口)
sk = socket.socket()
sk.bind(ip_port)
sk.listen(5)

while True:
    conn, address = sk.accept()
    conn.sendall('connect me and send messeage')
    Flag = True
    while Flag:
        data = conn.recv(1024)
        if data == "1":
            conn.sendall("balabala")
        elif data == "exit":
            Flag = False
        elif data == "2":
            conn.sendall("balabala")
        else:
            conn.sendall("balabala")

    conn.close()
View Code

客户端:

import socket


ip_port = ('ip地址', 端口)
sk = socket.socket()
sk.connect(ip_port)
sk.settimeout(5)

while True:
    data = sk.recv(1024)
    print ('receive:', data)
    inp = raw_input('please input:')
    sk.sendall(inp)
    if inp == 'exit':
        break

sk.close()
View Code

注意:传输的内容是以字节的方式进行的,需要用str()和bytes()函数进行两者之间地转换!

posted @ 2017-03-03 16:38  Jhon23  阅读(88)  评论(0编辑  收藏  举报