1.0 重要概念:
客户/服务器构架:服务器是一个软件或硬件,提供客户需要的服务。服务器存在的唯一目的就是等待客户请求,给客户服务。服务完成后等待其它请求。硬件服务器,如打印机,它不断等待打印的请求。软件服务器,例如Web服务器,提供数据和网页。
套接字 = 通讯端点:所谓套接字就是指“通讯端点”概念的计算机网络数据结构。在进行通讯前必须创建套接字,就像电话的插口一样。
Internet网络地址:网络地址由主机和端口组成。主机为用户名,例如在WIN系统下为Administrator,Linux下为sophie。端口的合法范围为0至65535。小于1024为系统保留端口。
2.0 总体思路:
服务器
- 创建通讯端点
- 进入监听的无限循环
- (通知潜在客户,服务器已经运行了)
- 建立与客户的连接
- 与客户进行数据交互
- 通讯结束
- 进入监听的无限循环
客户:
- 创建通讯端点
- 建立链接
- 进行数据交换
- 切断链接
3.0 Python实现(通过 socket 模块):
服务器端口
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Fri Mar 10 18:43:58 2017
@author: angelfish
"""
import socket as sk # 加载套接字模块
from time import ctime
HOST = '' #允许任何客户进来,所以这个为空
PORT = 21567 #设置通信端口为21567
BUFSIZ = 1024 #设置通信缓存为1kB
ADDR = (HOST,PORT) #设置通信地址
tcpSerSock = sk.socket(sk.AF_INET, sk.SOCK_STREAM) #创建一个通信端口的类实例
tcpSerSock.bind(ADDR) #在通讯端口绑定地址
tcpSerSock.listen(5) #指定内核应该为相应套接字排队的最大连接数
while 1: #进入监听循环
print 'waiting for connection...'
tcpCliSock, addr = tcpSerSock.accept()
print 'conneted from:',addr
while 1: #连接上之后进入交互数据循环
data = tcpCliSock.recv(BUFSIZ)
if not data:
break
tcpCliSock.send('[%s] %s' %(ctime(),data)) #返回带有时间戳的数据
tcpCliSock.close()
tcpSerSock.close()
客户端口
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Fri Mar 10 18:55:43 2017
@author: angelfish
"""
import socket as sk
HOST = 'angelfish' #我用的Linux下的用户名为angelfish
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT)
tcpCliSock = sk.socket(sk.AF_INET, sk.SOCK_STREAM)
tcpCliSock.connect(ADDR)
while 1:
data = raw_input('>>')
if not data:
break
tcpCliSock.send(data)
data = tcpCliSock.recv(BUFSIZ)
if not data:
break
print data
tcpCliSock.close()