python简单程序实例详解-python 网络编程详解及简单实例

python 网络编程详解

网络编程的专利权应该属于Unix,各个平台(如windows、Linux等)、各门语言(C、C++、Python、Java等)所实现的符合自身特性的语法都大同小异。在我看来,懂得了Unix的socket网络编程,其他的形式的网络编程方法也就知道了。这句话说得还不太严谨。准确的应该说成懂得了socket编程的原理,网络编程也就知道了,不同之处就在于每个平台,每个语言都有自己专享的语法,我们直接灵活套用就行了。

下面是用python实现的最基本的网络编程的例子,即依托于客户端-服务器的架构,实现客户端与服务器之间的单向"数据流通”。我们分别用两个方法来实现,一个方法是最原始的socket编程,另一个方法是利用python的面向对象对第一种方法进行封装实现,目的是减少实现透明性,便于快速开发。

要求:客户端输入数据,发送到服务端,服务器端生成(时间戳+数据)的封装数据回应客户端。由于socket编程包括两种:面向连接的和无连接的,这两种分别对应TCP数据流和UDP数据报文。所以,我们两种方法都进行实现。

一、Python socket编程

面向连接的TCP socket编程:

# -*- coding: utf-8 -*-

3 from socket import *

from time import ctime

# Address and Port

HOST = ''

PORT = 21567

ADDR = (HOST, PORT)

# BuffSize

BUFSIZ = 1024

# build socket

tcpSerSock = socket(AF_INET, SOCK_STREAM)

# bind socket

tcpSerSock.bind(ADDR)

# listen 5 client

tcpSerSock.listen(5)

try:

while True:

print 'waiting for connection...'

# build client socket

tcpCliSock, addr = tcpSerSock.accept()

print '...connect from:', addr

# accept data and process

while True:

data = tcpCliSock.recv(BUFSIZ)

if not data:

break

tcpCliSock.send('[%s] %s' % (ctime(), data))

# close client socket

tcpCliSock.close()

except EOFError, KeyboardInterrupt:

tcpSerSock.close()

# -*- coding:utf-8 -*-

from socket import *

# Address and Port

HOST = '127.0.0.1'

PORT = 21567

ADDR = (HOST, PORT)

# BufferSize

BUFSIZ = 1024

#build socket

tcpCliSocket = socket(AF_INET, SOCK_STREAM)

tcpCliSocket.connect(ADDR)

while True:

data = raw_input('> ')

if not data:

break

# send data

tcpCliSocket.send(data)

# recv data

data = tcpCliSocket.recv(BUFSIZ)

if not data:

break

# show data

print data

tcpCliSocket.close()

无连接的UDP socket编程

# -*- coding: utf-8 -*-

from socket import *

from time import ctime

# Address and Port

HOST = ''

PORT = 8000

ADDR = (HOST, PORT)

# BufferSize

BUFFSIZE = 1024

# build socket

udpSerSock = socket(AF_INET, SOCK_DGRAM)

# bind socket

udpSerSock.bind(ADDR)

try:

while True:

print 'waiting the message...'

data, addr = udpSerSock.recvfrom(BUFFSIZE)

print 'received the message: '+data+' from: ', addr

udpSerSock.sendto('[%s] %s' % (ctime(), data), addr)

except EOFError, KeyboardInterrupt:

udpSerSock.close()

# -*- coding: utf-8 -*-

from socket import *

# Address and Port

HOST = 'localhost'

PORT = 8000

ADDR = (HOST, PORT)

# BufferSize

BUFSIZ = 1024

# build socket

udpCliSock = socket(AF_INET, SOCK_DGRAM)

while True:

data = raw_input('> ')

udpCliSock.sendto(data, ADDR)

data = udpCliSock.recvfrom(BUFSIZ)

if not data:

break

print data

udpCliSock.close()

二、基于封装类SocketServer的网络编程

# -*- coding: utf-8 -*-

from SocketServer import TCPServer as TCP, StreamRequestHandler as SRH

from time import ctime

# Address and Port

HOST = ''

PORT = 21567

ADDR = (HOST, PORT)

# BuffSize

BUFSIZ = 1024

# build RequestHandler

class MyRequestHandler(SRH):

def handle(self):

print '...connected from: ', self.client_address

self.wfile.write('[%s] %s' % (ctime(), self.rfile.readline()))

# build TCPServer

TCPServ = TCP(ADDR, MyRequestHandler)

print 'waiting for connection...'

# loop to process

TCPServ.serve_forever()

# -*- coding:utf-8 -*-

from socket import *

# Address and Port

HOST = '127.0.0.1'

PORT = 21567

ADDR = (HOST, PORT)

# BufferSize

BUFSIZ = 1024

while True:

# note: SocketServer 的请求处理器的默认行为是接受连接,

# 得到请求,然后就关闭连接,所以需要多次连接

tcpCliSock = socket(AF_INET, SOCK_STREAM)

tcpCliSock.connect(ADDR)

# process data

data = raw_input('> ')

if not data:

break

tcpCliSock.send('%s ' % data)

data = tcpCliSock.recv(BUFSIZ)

if not data:

break

print data.strip()

tcpCliSock.close()

感谢阅读,希望能帮助大家,谢谢大家对本站的支持!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值