python socket 编程01-实现基本点对点通信

0x00 导入socket模块(客户端+服务端)

要使用socket模块我们需要先导入socket:import socket

0x01 创建socket实例(客户端+服务端)

方法:socket=socket.socket(familly,type)
解释:familly是指明协议家族常用的有:

  • socket.AF_UNIX (unix系统之间通信)
  • socket.AF_INET(网络通信)
  • socket.AF_INET6(IPv6通信)
    type是指明套接字类型:

  • socket.SOCK_STREAM(TCP类型)

  • socket.SOCK_DGRAM(UDP类型)
  • socket.SOCK_RAW (原始套接字,暂时没有研究)
  • socket.SOCK_RDM (暂时没有研究)

本文使用的是socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

0x02绑定套接字到指定地址(服务端)

方法:socket.bind(address)
解释:address必须为一个包含两个元素的元组格式为(address,port)如:(127.0.0.1,8081)

0x03设置监听(服务端)

方法:socket.listen(num)
解释:num为连接请求队列最大数目,因为是单线程所以会有等待链接的客户端,有等待就必须有等待请求数目,而num就是指明有最大等待请求数目一旦超过就拒绝。

0x04接受连接(服务端)

方法:client,addr=socket.accept()
解释:服务端执行到accept的时候回阻塞进程等待连接,一旦有client连接成功就会返回client和addr,client是指代表客户端的socket,addr是客户端的地址。
到这里的时候服务端就已经开启端口等待连接了。

0x05接受或发送数据常用方法(服务端+客户端)

方法:data=socket.recv(bufsize[,flag])
解释:接受套接字的数据。数据以字符串形式返回,bufsize指定要接受的最大数据量。flag提供有关的消息的其他信息,通常可以忽略。
方法:data,addr=s.recvfrom(bufsize[,flag])
解释:data接收到的数据,addr发送端地址

方法:num=socket.send(string[,flag])
解释: string中的数据是要发送到连接的套接字的数据。返回值是要发送的字节数量,该数值可能小于string的字节大小。
方法:socket.sendall(string[,flag])
解释: string和上面一样,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。
方法:num=socket.sendto(string[,flag],address)
解释: 将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。该函数主要用于UDP协议。

0x06客户端连接(客户端)

方法:socket.connect(addr)
解释:addr为(host,port)元组。

0x07实例

上面解释了socket的一些常用方法接下来用实例演示一下:

client端

import socket

c=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

addr=('127.0.0.1',8081)

c.connect(addr)

while True:
    data = c.recv(1024)
    if data=='close':
        print 'close'
        break
    print "server say:%s"%(data,)
    word=raw_input('say>')
    c.sendall(word)
c.close()

服务器端

import socket

ser = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
addr=('127.0.0.1',8081)
ser.bind(addr)
ser.listen(2)
count=1
while True:
    print 'waiting for connect'
    client,addr=ser.accept()
    count=1
    while True:
        if count==1:
            client.send('welcome to connect to me!-.=!what do you want to say')
            count=2
            continue
        data=client.recv(1024)
        if not data:
            continue
        if data=='quit':
            print 'abort connection....'
            client.send('close')
            client.close()
            break
        print "%s say:%s"%(addr,data)
        word=raw_input("repeat>")
        client.sendall(word)

你可能感兴趣的:(python)