要了解网络编程,首先你需要了解客户端/服务器架构,用通俗的语言来讲,服务器相当于一个永远不休息的银行出纳员,而客户端就是一个又一个的客户,服务器给客户端提供相应的服务即为该出纳员为客户办理业务。任何服务器给客户端提供服务前都要创建相应的套接字,这相当于出纳员要求客户写相应的表格,套接字就是一个通信端点。
套接字的历史:套接字的起源可以追溯到 20 世纪 70 年代,它是加利福尼亚大学的伯克利版本 UNIX(称 为 BSD UNIX)的一部分。因此,有时你可能会听过将套接字称为伯克利套接字或 BSD 套接 字。套接字最初是为同一主机上的应用程序所创建,使得主机上运行的一个程序(又名一个 进程)与另一个运行的程序进行通信。这就是所谓的进程间通信(Inter Process Communication, IPC)。有两种类型的套接字:基于文件的和面向网络的。对于上述两种套接字,每个又分为两种类型:面向连接的套接字和没有连接套接字。面向连接的套接字又称为流套接字,从字面意思来看,它需要在进行通信前先建立一个连接,实现这种连接类型的主要协议是传输控制协议(简称TCP),为了创建TCP套接字,必须用SOCKET_STREAM作为套接字类型。无连接的套接字意味 着,在通信开始之前并不需要建立连接。此时,在数据传输过程中并无法保证它的顺序性、 可靠性或重复性,然而它的成本较低,这是它的优点。
下面将给出编写TCP客户端和服务端的大体思路以及具体代码。
服务端:
from socket import *
from time import ctime
HOST=''
PORT=21567
BUFSIZ=1024
ADDR=(HOST,PORT)
tcpServerSock=socket(AF_INET,SOCK_STREAM)
tcpServerSock.bind(ADDR)
tcpServerSock.listen(5)
while True:
print 'waiting for connection...'
tcpCliSock,addr=tcpServerSock.accept()
print '...connected from:',addr
while True:
data=tcpCliSock.recv(BUFSIZ)
if not data:
break
tcpCliSock.send('[%s] %s' %(ctime(),data))
tcpCliSock.close()
tcpSerSock.close()
首先导入所需模块,然后设置服务端的主机地址,端口号以及缓冲区的大小,接下来创建一个TCP套接字,然后将套接字绑定到服务器地址以及开启监听,最后进入服务端的无限循环,等待客户端的连接,一旦连接成功服务端接收客户端发送的消息后开始执行相应的功能并返回给客户端,大致思路就是这样。
客户端:
from socket import *
HOST='localhost'
PORT=21567
BUFSIZ=1024
ADDR=(HOST,PORT)
tcpCliSock=socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(ADDR)
while True:
data=raw_input('> ')
if not data:
break
tcpCliSock.send(data)
data=tcpCliSock.recv(BUFSIZ)
if not data:
break
print data
tcpCliSock.close()
客户端的代码相对来说比较简单,前两部分与服务端一样,然后创建一个套接字请求连接,下面的循环向服务端发送信息,等待返回值,最后显示出来。
以上就是简单的TCP服务端和客户端的代码,UDP与TCP类似,可以自己去试一下。
欢迎大神交流!