要使用socket模块我们需要先导入socket:import socket
方法:socket=socket.socket(familly,type)
解释:familly是指明协议家族常用的有:
socket.AF_INET6(IPv6通信)
type是指明套接字类型:
socket.SOCK_STREAM(TCP类型)
本文使用的是socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
方法:socket.bind(address)
解释:address必须为一个包含两个元素的元组格式为(address,port)如:(127.0.0.1,8081)
方法:socket.listen(num)
解释:num为连接请求队列最大数目,因为是单线程所以会有等待链接的客户端,有等待就必须有等待请求数目,而num就是指明有最大等待请求数目一旦超过就拒绝。
方法:client,addr=socket.accept()
解释:服务端执行到accept的时候回阻塞进程等待连接,一旦有client连接成功就会返回client和addr,client是指代表客户端的socket,addr是客户端的地址。
到这里的时候服务端就已经开启端口等待连接了。
方法: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协议。
方法:socket.connect(addr)
解释:addr为(host,port)元组。
上面解释了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)