一直不是很清楚服务器的定义,对于什么是服务器/客户端架构也只有一个模糊的感觉。最近开始学习,才明白一些什么服务器和客户端的关系。

所谓的服务器,就是提供服务的东西,它是一个硬件或者软件,可以向一个或者多个客户端提供所需要的服务。它存在的目的就是等待客户的请求,然后给客户服务,再接着等待请求。

而客户端,就来连上一个服务器,提出自己的请求,然后等待获得反馈。

比如说,打印机就是一个服务器的例子,与之相连的计算机就是客户端,通过网络连接打印机后,给它提出服务需求(打印)和传输数据(传输内容),然后打印机开始工作,或者返回造成服务失败的原因(比如缺纸或者没有墨)打印机是服务器端,它是一只等待请求的,它在一直工作,计算机这端是客户端,它不是一只工作的。

打印机是一个硬件服务器,也有一些软件服务器,比如说Web服务器,数据库服务器等等。

-----------------------------------------------------------------------------

那么它们又是怎样通过网络连接的呢?客户端/服务器之间的网络编程是如何做的?

首先,我们要创建一个通讯的断电,让服务器可以“监听”请求,好比公司的电话,客户通过电话设备向公司发行请求。

当然一个服务器在有电话之后还得将自己的电话给潜在的客户,才能得到响应,也就是说,必须得将网址发给客户才能有用。

对于客户端来说,同样也是创建一个通信端点,然后建立到与服务器的连接,客户就可以提出请求了。

-------------------------------------------------------------------------------------

关于通讯端点,就要介绍一个概念,叫套接字。

我们之前谈的“通讯端点”的概念,是一个关于通讯的抽象,而套接字就是一种有这样能力数据结构了。

就好比我们应用整型浮点型布尔型一样,套接字也是一种数据结构,我们通过它来访问网络。

套接字起源于上世纪七十年代,在加州大学伯克利分校版本上的Unix上创立,开始的时候被设计用于在同一台机器上的多个应用程序通讯,也就是进程间通讯,有两种类型,一种基于文件系统,一种基于网络。

基于文件系统被用于不同进程通讯是很有意义的,因为文件系统是不同的进程都可以访问的。而不同电脑间,基于网络的套接字就是必须的了。

我先只考虑基于网络的套接字,有两种地址家族,一种是AF_INET,另一种是AF_NETLINK。在大部分时候,我们讨论的都是有链接的AF_INET套接字。

套接字的地址是有两部分组成的,一个是主机,一个是端口。

类似于电话网络的区号和电话号码的含义。主机确定了你访问的机器,也就是一个IP地址,端口是你所访问的服务器软件所使用的端口号。一台机器上可以有很多个程序都在使用端口,合法的端口号范围是0~65535.小于1024的端口号是系统保留的端口号。

-------------------------------------------------------------------------------------

同时,还有一个基础知识是面向连接和面向无连接。

套接字有两种类型,一种是面向连接的,通信前先建立一条连接,然后顺序的、可靠的、不会重复的数据传输,不会有数据边界。实现这种连接的主要协议是传输控制协议(TCP),创建TCP套接字要指定套接字类型是SOCK_STREAM.

另一种是无连接套接字,也就是说传输数据前先不连接,这样数据传输的顺序、可靠性、不重复性就不可保证。这种传输的主要协议是用户数据报协议(UDP)。

----------------------------------------------------------------------------------------------

至此,网络的基础暂且放下,开始讲Python的网络编程。

Python提供了一个socket模块,来创建和使用套接字。

socket()模块函数

socket(socket_family, socket_type, protocol=0)

这个函数可以用于创建一个套接字对象,分别写入套接字家族名和套接字类型。

创建了这个套接字对象后,所有的交互都可以通过该对象的方法调用来进行。

具体的方法可以直接查Python的文档,我这里举例说明一下创建一个TCP服务器的过程:

from socket import *
from time import ctime HOST = '' # 主机
PORT = 8002 # 端口号,可以随意选择
BUFSIZ = 1024
ADDR = (HOST, PORT) #主机端口号组成一个套接字地址 tcpSerSock = socket(AF_INET, SOCK_STREAM) #创建一个套接字对象,是AF_INET族的tcp套接字
tcpSerSock.bind(ADDR) #这个函数用于绑定地址到套接字
tcpSerSock.listen(5) # 服务器开始监听连接,参数表示最多允许同时有几个连接进来 while True:
print 'waiting for connection...'
tcpCliSock, addr = tcpSerSock.accept() #用于等待连接的到来
print '...connected from:',addr while True:
data = tcpCliSock.recv(BUFSIZ) #用于接收从客户端发来的数据 参数代表一次最多接受的数据量,这里为1k
if not data:
break
tcpCliSock.send('[%s] %s' % (
ctime(), data)) # 将时间戳作为内容发送给客户端 tcpCliSock.close() tcpSerSock.close()

运行时,可以看到服务器开始运行,等待一个客户端的连接,所以此刻我们需要用客户端去连接这个服务器。

再写一个简单的客户端的程序:

from socket import *

HOST = 'localhost' #由于服务器开设在自己电脑上,所以主机是本地
PORT = 8002 #同一个连接端口
BUFSIZ = 1024
ADDR = (HOST, PORT) tcpCliSock = socket(AF_INET, SOCK_STREAM) #同样的TCP套接字
tcpCliSock.connect(ADDR) # 连接相应的地址,初始化TCP服务器的连接 while True:
data = raw_input('>')
if not data:
break
tcpCliSock.send(data) # 向服务器传输数据
data = tcpCliSock.recv(BUFSIZ) # 接受服务器端的数据
if not data:
break
print data tcpCliSock.close()

至此,你运行客户端的程序,就可以验证程序了。


当然,为了学习的乐趣,最好不要在本地连接,还是拿两台电脑来连接比较好,主要是客户端要知道服务器端的IP地址。

IP地址在网络属性里可以找,如图:

然后用同样的程序框架就可以实现两机间的通讯了,最后可以做到如下图的一个对讲机程序:

当然,要做到一个双方都可以自由发言的聊天工具,却又不是这么简单了。需要有新的尝试了。

2015/12/14 Python网络编程,TCP/IP客户端和服务器初探的更多相关文章

  1. python 网络编程 TCP/IP socket UDP

    TCP/IP简介 虽然大家现在对互联网很熟悉,但是计算机网络的出现比互联网要早很多. 计算机为了联网,就必须规定通信协议,早期的计算机网络,都是由各厂商自己规定一套协议,IBM.Apple和Micro ...

  2. Socket网络编程(TCP/IP/端口/类)和实例

    Socket网络编程(TCP/IP/端口/类)和实例 原文:C# Socket网络编程精华篇 转自:微冷的雨 我们在讲解Socket编程前,先看几个和Socket编程紧密相关的概念: TCP/IP层次 ...

  3. 网络编程TCP/IP详解

    网络编程TCP/IP详解 1. 网络通信 中继器:信号放大器 集线器(hub):是中继器的一种形式,区别在于集线器能够提供多端口服务,多口中继器,每个数据包的发送都是以广播的形式进行的,容易阻塞网络. ...

  4. Python中的socket网络编程(TCP/IP,UDP)讲解

    在网络编程中的一个基本组件就是套接字(socket).套接字基本上是两个端点的程序之间的"信息通道".程序可能分布在不同的计算机上,通过套接字互相发送信息.套接字包括两个:服务器套 ...

  5. 网络编程TCP/IP实现客户端与客户端聊天

    一.TCP/IP协议 既然是网络编程,涉及几个系统之间的交互,那么首先要考虑的是如何准确的定位到网络上的一台或几台主机,另一个是如何进行可靠高效的数据传输.这里就要使用到TCP/IP协议. TCP/I ...

  6. [Python 网络编程] TCP Client (四)

    TCP Client 客户端编程步骤: 创建socket对象 连接到服务端的ip和port,connect()方法 传输数据 使用send.recv方法发送.接收数据 关闭连接,释放资源 最简单的客户 ...

  7. python网络编程 - tcp

    网络编程 低级别的网络服务 高级别的网络服务 socket又称“套接字”,应用程序通过“套接字”向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯. tcp 传输控制协议(Tra ...

  8. 18 网络编程-TCP/IP各层介绍(5层模型讲解)

    1.TCP/IP五层协议讲解 物理层--数据链路层--网络层--传输层--应用层 我们将应用层,表示层,会话层并作应用层,从tcp/ip五层协议的角度来阐述每层的由来与功能,搞清楚了每层的主要协议 就 ...

  9. python 网络编程 -- Tcp协议

    Socket是网络编程的一个抽象概念.通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可. 客户端 大多数连接都是可靠 ...

随机推荐

  1. Answer the questions(回答自己的问题)

    第一章: 问题:我们现在学了这个专业,如果想全面去了解,应该还要学习哪些课程? 回答:其实软件工程只是一个比较大的范畴,以后如果要出去工作,我们还要细分,比如说开发安卓,开发游戏,web架构方面等很多 ...

  2. 【CSAPP笔记】11. 存储器层次结构

    在没有专门研究存储器系统之前,我们依赖的存储器模型是一个很简单的概念,也就是把它看成一个线性数组,CPU 能在一个常数时间内访问任何一个存储器位置.虽然在研究别的问题时,这是一个有效的模型,但是它不能 ...

  3. 个人作业-week2(代码复审)

    一.代码复审check list 概要部分 代码符合需求和规格说明吗? 符合要求和规格说明,-s指令和-c指令都能实现需求.并且能够处理非法输入. 代码设计是否有周全的考虑? 程序的main函数中对各 ...

  4. Delphi函数的out、var等关键字的作用,和使用场景

    问题描述 Delphi函数的out.var等关键字的作用,和使用场景 Delphi函数的out.var等关键字的作用,和使用场景,我知道var是作为传值调用,但是像out这个关键字又是什么作用呢? 解 ...

  5. pygame学习笔记(1)——安装及矩形、圆型画图

    pygame是一个设计用来开发游戏的python模块,其实说白了和time.os.sys都是一样的东东.今天开始正式学习pygame,下载地址:www.pygame.org.下载后安装完成即可,在py ...

  6. Mysql 错误相关

    有几天没启动本地的 MySQL 了,今天打开小海豚,直接给我弹出了连接失败,这是怎么回事,就直接进入命令行,发现也有问题,输入密码后一闪而过,也没有什么提示信息给我,百度了先,都说是修改 MySQL ...

  7. hibernate关联关系

    hibernate是一个强大的ORM框架,为了使用面向对象的方式管理数据库,hibernate提供了4中关系设置: 1.一对一 (one-to-one) 2.一对多 (one-to-many) 3.多 ...

  8. nginx配置虚拟路径下载文件(.apk)

    公司将安卓apk文件放到服务器上,实现用户点击链接并下载 nginx version 1.14.1 nginx配置修改 server { listen 80; server_name localhos ...

  9. PGM学习之一

    一 课程基本信息 本课程是由Prof.Daphne Koller主讲,同时得到了Prof. Kevin Murphy的支持,在coursera上公开传播.在本课程中,你将学习到PGM(Probabil ...

  10. Android Room使用详解

    使用Room将数据保存在本地数据库 Room提供了SQLite之上的一层抽象, 既允许流畅地访问数据库, 也充分利用了SQLite. 处理大量结构化数据的应用, 能从在本地持久化数据中极大受益. 最常 ...