码迷,mamicode.com
首页 > 编程语言 > 详细

python IO编程、线程和进程、网络编程

时间:2017-09-27 16:19:39      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:ipa   protoc   操作系统   eal   cti   套接字   时间   大数   loop   

1.Socket类型

       套接字格式为:socket(family,type[,protocal]]),使用给定的地址族,套接字类型、协议编号来创建套接字

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

       socket.AF_INET 服务器之间网络通信

        socket.AF_INNET6   IPv6

         socket.SOCKET_STREAM   流式socket,用于TCP

         socket.SOCK_RAW 原始套接字,普通的套接字无法理解ICMP,IGMP等网络报文,而SOCK_RAW可以,其次,SOCK_RAW也可以理解特殊的

Ipv4报文,利用原始套接字可以通过IP_HDRINCL套接字选项由用户构造IP头

         创建TCP Socket      s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

         创建UDP Socket   s=socket.socket(socket.AF_INET,socket.SOck_DGRAM)

          常用变成函数

     服务端Socket函数                 s.bind(address)    将套接字绑定到地址,在AF_INET下,以元组(host,port)的形式表示地址

          s.listen(backlog) 开始监听TCP传入连接。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设置为5

          s.accept()   接受TCP连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送消息,address是连接客户端的地址

        客户端Socket函数

         s.connect(address) 连接到address处的套接字。一般address的格式为元组(hostname,port) ,如果连接出错,返回socket.error错误

         s.connect_ext(address) 功能与connect(address)相同,但成功返回0,失败返回error的值

       公共Socket函数

        s.recv(buflen,flage) :接受TCP套接字的数据,数据以字符形式返回,buflen指定要接收的最大数据量,flage提供有关消息的其他信息

        s.send(string,flage) 发送TCP数据,将string中的数据发送到连接的套接字,返回值是要发送的字节数,该数量可能小于string的字节大小

        s.sendall(string,flage)    完整发送TCP数据,将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据,成功返回None,失败抛出一哦下行

       s.recvfrom(buflen,flage) 接受UDP套接字的数据,与recv()类似,但返回值是(data,address).其中data 是包含接受数据的字符串,address是发送数据的套接字地址

       s.sendto(string,flage,address) 发送UDP数据。将数据发送到套接字,address是形式为(ipadder,port)的元组,指定远程地址,返回值是发送的字节数

      s.close() 关闭套接字

      s.getpeername() 返回连接套接字的远程地址 。返回值通常是元组(ipadder,port)

      s.getsockname() 返回套接字自己的地址,通常是一个元组(ipadder,port)

      s.setsockopt(level,optname,value) 设置给定套接字选项的值

      s.getsockopt() 返回套接字选项的值

       s.settimeout(timeout) 设置套接字操作的超时时间,timeout是一个浮点数,单位是秒。值为None表示没有超时,一般超时应该在创建链接字

时设置,因为热他们可能会用于连接操作

 s,setblocking(flage) 如果flage值为0,则将套接字设置为非阻塞模式,否则将设置为阻塞模式,默认是阻塞模式,在非阻塞模式下,如果调用方

recv()没有发现任何数据,或send()调用无法立即发送数据,将引起socket.error异常

 

TCP编程:面向连接的编程方式   消息可靠

        服务端程序编写

                     1)创建Socket,绑定Socket到本地IP与端口

                     2)开始监听连接

                      3)进入循环,不断接收客户端的连接请求

                     4)接收传来的数据,并发送给对方数据

                     5)传输完成关闭Socket

           

技术分享
import socket
import threading
import time


# 第四步:接收传来的数据,并发送给对方数据
def dealClient(sock, addr):
    print(Accept new connection from %s:%s..... % addr)
    sock.send(bHello, I am server!)
    while True:
        data = sock.recv(1024)
        time.sleep(1)
        if not data or data.decode(utf-8) == exit:
            break
        print(----->>%s! % data.decode(utf-8))
        sock.send(bLoop Msg: %s! % data.decode(utf-8).encode(utf-8))  # 只能传送bytes
    # 第五部关闭Socket
    sock.close()
    print(Connection from %s:%s closed. % addr)


if __name__ == __main__:
    # 第一步:创建一个基于IPv4和TCP协议的Socket
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((127.0.0.1, 9999))
    # 第二步:监听
    s.listen(5)
    print(Waiting for connection......)
    while True:
        print(-----------------)
        # 第三步:接收一个新连接:
        sock, addr = s.accept()  # 等待一个链接的到来,会一直等待
        # 创建新线程来处理TCP连接
        t = threading.Thread(target=dealClient, args=(sock, addr))
        t.start()
View Code

 

    客户端程序编写

                     1)创建Socket,连接远端地址

                      2)连接后发送数据和接收数据

                      3)传输完毕后,关闭Socket

技术分享
import socket
import  time
import  random
#初始化Socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#连接目标IP和端口
s.connect((127.0.0.1,9999))
time.sleep(random.random())
#接收消息
print(---->>,s.recv(1024).decode(utf-8))#没有消息就会一直等待,或者知道进程结束
#发送消息
s.send(bHello,I am a client1)
print(--->>,s.recv(1024).decode(utf-8))
s.send(bexit)
#关闭Socket
s.close()
View Code

 

      

UDP编程

      服务器端

         1)创建Socket, 绑定指定的IP和端口

          2)直接发送数据和接收数据

         3)关闭Socket

技术分享
import socket

# UDp服务进程

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((127.0.0.1, 9999))
print(Bind UDP om 9999....)
while True:
    data, addr = s.recvfrom(1024)
    print(Message is %s % data.decode(utf-8))
    print( Received from %s:%s % addr)
    s.sendto(bHello,%s! % data, addr)
View Code

 

   客户端

 直接创建Socket 然后与服务器进行数据交换

技术分享
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
for data in [bHello, bWorld]:
    s.sendto(data, (127.0.0.1, 9999))
    print(s.recv(1024).decode(utf-8))
s.close()
View Code

 

         

 

 

                     

           

              

 

    

     

     

    

       

       

         

         

  

 

       

       

    

 

 

 

          

     

python IO编程、线程和进程、网络编程

标签:ipa   protoc   操作系统   eal   cti   套接字   时间   大数   loop   

原文地址:http://www.cnblogs.com/09120912zhang/p/7601928.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!