低级网络编程

初级网络编程

Mayuyu学习Python很久了,今天就开始学习Python的网络编程。

 

其实说到网络编程,就必须提到一个关键词---“套接字”,即Socket。网络化的应用程序在开始任何通讯之前都需

要创建套接字,就像电话插口一样,没有它就没有办法进行通讯。对于套接字来说,一般分为两种:基于文件型和基

于网络型。套接字实质上就是一个通信端点。当然,我们可以创建面向连接的套接字或者面向无连接的套接字,分别

对应TCP协议和UDP协议。

 

在网络编程中,都是基于C/S模式的,所以分为客户端和服务端。接下来学习利用Python编写最简单的Socket。

 

先来看基于TCP的Socket:

 

服务端

#Server
from socket import*
from time import ctime

HOST    = '222.27.174.90'
PORT    = 21511
BUFSIZE = 1024
ADDR = (HOST,PORT)

tcpSerSock = socket(AF_INET, SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)

while True:
    tcpCliSock, addr = tcpSerSock.accept()
    while True:
        data = tcpCliSock.recv(BUFSIZE)
        if not data:
            break
        print '%s' %(ctime())
        print data
        tcpCliSock.send('[%s]\n %s' %(ctime(), data))

tcpSerSock.close()

 

客户端

from socket import *

HOST = '222.27.174.90'
PORT = 21511
BUFSIZE = 1024
ADDR = (HOST, PORT)

tcpCliSock = socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(ADDR)

while True:
	data = raw_input('>')
	if not data:
		continue
	tcpCliSock.send(data)
	data = tcpCliSock.recv(BUFSIZE)
	print data

tcpCliSock.close()


 

服务端和客户端的HOST与PORT一定要相同才行。

 

基于UDP的Socket:

 

服务端:

#Server
from socket import*
from time import ctime

HOST    = '222.27.174.90'
PORT    = 21512
BUFSIZE = 1024
ADDR = (HOST,PORT)

udpSerSock = socket(AF_INET, SOCK_DGRAM)
udpSerSock.bind(ADDR)

while True:
    data, addr = udpSerSock.recvfrom(BUFSIZE)
    print '%s' %(ctime())
    print data
    udpSerSock.sendto('[%s]\n %s' %(ctime(), data), addr)

udpSerSock.close()


客户端: 

from socket import *

HOST = '222.27.174.90'
PORT = 21512
BUFSIZE = 1024
ADDR = (HOST, PORT)

udpCliSock = socket(AF_INET,SOCK_DGRAM)

while True:
    data = raw_input('>')
    if not data:
        continue
    udpCliSock.sendto(data, ADDR)
    data, ADDR = udpCliSock.recvfrom(BUFSIZE)
    print data

udpCliSock.close()


 

接下来学习一些套接字对象的常用函数。。。

 

(1)服务端套接字函数

    s.bind()         绑定地址(主机名,端口)到套接字

    s.listen()       开始TCP监听

    s.accept()       被动接受TCP客户端连接,(阻塞式等待连接的到来)

  

(2)客户端套接字函数

    s.connect()      主动初始化TCP服务器连接

    s.connect_ex()   connect)()函数的扩展版本,出错时返回出错码,而不是抛出异常

 

(3)公共用途的套接字函数

    s.recv()         接收TCP数据

    s.send()         发送TCP数据

    s.sendall()      完整发送TCP数据

    s.recvfrom()     接收UDP数据

    s.sendto()       发送UDP数据