本文参考http://yangrong.blog.51cto.com/6945369/1339593的socket函数介绍。
NetServer:
#!/usr/bin/python
import socket
import threading
class NetServer:
host = "127.0.0.1"
port = 2048
ssocket = None
cconns = []
def __init__(self, host, port):
self.host = host
self.port = port
self.InitSocket()
def InitSocket(self):
self.ssocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.ssocket.bind((self.host, self.port))
self.ssocket.listen(5)
self.ssocket.setblocking(0)
timer = threading.Timer(1, self.loop)
timer.start()
def SocketAccept(self):
dirty = []
while True:
words = raw_input()
for co in self.cconns:
try:
co.sendall(words)
except Exception, e:
print("close connet")
dirty.append(co)
for dc in dirty:
self.cconns.remove(dc)
dirty = []
def accept(self):
try:
conn,addr=self.ssocket.accept()
print("Connected:")
print(addr)
self.cconns.append(conn)
except Exception, e:
pass
def recv(self):
for co in self.cconns:
ret = ""
try:
ret = co.recv(1024)
except Exception, e:
pass
if ret != "":
print(co.getpeername()),
print(ret)
def loop(self):
self.accept()
self.recv()
timer = threading.Timer(1, self.loop)
timer.start()
if __name__ == '__main__':
server = NetServer("127.0.0.1", 20480)
server.SocketAccept()
NetClient:
import socket
import threading
class NetClient:
csocket = None
recv_gap = 1
buff_size = 1024
def __init__(self):
pass
def connect(self, host, port):
self.csocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
error_code = self.csocket.connect_ex((host,port))
self.csocket.setblocking(0)
if error_code == 0:
timer = threading.Timer(self.recv_gap, self.recv)
timer.start()
return 0
else:
print("connect error!")
return -1
def send(self, buff):
size = len(buff)
if size <= 0:
print("data is empty!")
return
sbuff = buff
ssize = 0
while ssize < size:
send_size = self.csocket.send(sbuff)
sbuff = sbuff[send_size:len(sbuff)-send_size]
ssize = ssize + send_size
def recv(self):
ret = ""
try:
ret = self.csocket.recv(self.buff_size)
except Exception, e:
pass
if ret != "":
print("recv:")
print(ret)
timer = threading.Timer(self.recv_gap, self.recv)
timer.start()
def disconnect(self):
self.csocket.close()
if __name__ == '__main__':
client = NetClient()
error_code = client.connect("127.0.0.1", 20480)
if error_code == 0:
while True:
key = raw_input()
if key == 'q' or key == '':
break
client.send(key)
client.disconnect()
可多客户端连接。代码仍有很多bug,懒得改了