python socket编程

本文参考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,懒得改了



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值