Python开发网络应用整理代码一

1.介绍Python中的一个内置模块struct吧!
将C中的structs结构与Python中的值进行互换的。
在Python中没有结构这种新的数据类型说法,所以在Python中引入了所谓的字符串。
相关的内置方法如下:
calcsize(fmt)
返回了通过字符串表示的C结构体的大小的。
pack(fmt,*args)
通过fmt格式进行打包的,
pack_into(fmt,buf,offset,*args)
将V1,V2的值通过fmt格式进行打包。
unpack(fmt,s)
依据fmt的格式进行解包输出字符串出来的!
应用举例如下:
1.客户端的打包代码如下:
s.send(struct.pack("!hhl",250,3754,6188))
2.服务器端的解包代码如下:
data = struct.unpack("!hhl",buf)
2.介绍另一款处理网络方面的模块包吧!HTMLParser
解析HTML页面用到的。
3.发送二进制数据的方法:
base64 模块:
b64encode(s,altchars=None)
Encode a string using base64.其中的s是要encode的字符串的。
编码, 将二进制数据解码成可打印输出的字符串的方法哦!
b64decode
将字符串数据编码成二进制数据了!
1.通过一个C程序可以生成一个二进制数据文件包了。
#include
typedef struct _CToStruct
{
    char    c;
    short    h;
    int        i;
}CToSturct;
#define TS_SIZE (5)
//½«½á¹¹ÌåÊý¾ÝдÈëÎļþ
int writeToFile(void* pData,unsigned int size)
{
    FILE* fp = fopen("c:\\tostruct.dat","wb");
    if(fp == NULL)
        return 0;
    fwrite(pData,1,size,fp);
    fclose(fp);
    return 1;
}
int main(int argc, char* argv[])
{
    int i = 0;
    CToSturct ts[TS_SIZE] = {0};
    for(;i < TS_SIZE;i++)
    {
        ts.c = (char)i;
        ts.h = (short)i * i;
        ts.i = i* i * i;
    }
   
    writeToFile(ts,sizeof(ts));
    return 0;
}
客户端读取二进制数据流成字符串并将其传送到服务器端。
# -*- coding: cp936 -*-
"""
发送二进制数据
先从二进制文件中读取二进制数据,再对其进行编码,编码后的字符串为可打印字符,使用一般的字符串发送就可以了
"""
import socket
import base64
host = "localhost"
port = 50000
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((host,port))
f = file("c:\\tostruct.dat","rb")
data = f.read()
f.close()
data = base64.b64encode(data)
s.send(data + "\r\n")
s.close()
服务器端进行解码处理并写入到文件中去
# -*- coding: cp936 -*-
"""
接收二进制数据
先将经过b64encode的数据进行b64decode,再将解码后的数据以二进制的方式写入文件即可.
这样就实现了二进制数据传输问题
"""
import socket
import sys
import base64
host = ""
port = 50000
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((host,port))
s.listen(5)
while 1:
    clientsock,clientaddr = s.accept()
    while 1:
        buf = clientsock.recv(8196)
        if len(buf) != 0:
            buf = base64.b64decode(buf)
            f = file("c:\\fromclient.dat","wb")
            f.write(buf)
            f.close()
            break
    clientsock.close()
   
"""
输出结果:
将生成的fromclient.dat文件与tostruct.dat文件进行二进制比较,二者完全相同
"""