2015/12/14 Python网络编程,TCP/IP客户端和服务器初探

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

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

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

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

打印机是一个硬件服务器,也有一些软件服务器,比如说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地址在网络属性里可以找,如图:

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

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

时间: 2024-12-07 17:28:08

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

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

Socket网络编程(TCP/IP/端口/类)和实例 原文:C# Socket网络编程精华篇 转自:微冷的雨 我们在讲解Socket编程前,先看几个和Socket编程紧密相关的概念: TCP/IP层次模型 当然这里我们只讨论重要的四层 01,应用层(Application):应用层是个很广泛的概念,有一些基本相同的系统级TCP/IP应用以及应用协议,也有许多的企业应用和互联网应用.http协议在应用层运行. 02,传输层(Tanspot):传输层包括UDP和TCP,UDP几乎不对报文进行检查,而

python网络编程——TCP

<pre name="code" class="python"> 一.网络通信模式 对于网络通信,现在遵循的是TCP/IP协议组. 而现在设计的通信模式中,主要使用的是客户端/服务器编程,所谓的客户端就是我们用户所用的软件,而服务端则是程序开发人员根据客户端的需要设计的服务模式,为了是满足客户端的要求,实现和客户端进行正常通信. 二.套接字:通信的端点 对于tcp/Ip协议来说,它是一个多层协议族,分别是物理层,数据链路层,网络层,传输层,应用层.对于网

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

一.TCP/IP协议 既然是网络编程,涉及几个系统之间的交互,那么首先要考虑的是如何准确的定位到网络上的一台或几台主机,另一个是如何进行可靠高效的数据传输.这里就要使用到TCP/IP协议. TCP/IP协议(传输控制协议)由网络层的IP协议和传输层的TCP协议组成.IP层负责网络主机的定位,数据传输的路由,由IP地址可以唯一的确定Internet上的一台主机.TCP层负责面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象. 二.TCP与UDP TCP是一种面向连接的保证可靠传输的协议

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

一.TCP/IP协议 既然是网络编程,涉及几个系统之间的交互,那么首先要考虑的是如何准确的定位到网络上的一台或几台主机,另一个是如何进行可靠高效的数据传输.这里就要使用到TCP/IP协议. TCP/IP协议(传输控制协议)由网络层的IP协议和传输层的TCP协议组成.IP层负责网络主机的定位,数据传输的路由,由IP地址可以唯一的确定Internet上的一台主机.TCP层负责面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象. 二.TCP与UDP TCP是一种面向连接的保证可靠传输的协议

JAVA基础知识之网络编程——-TCP/IP协议,socket通信,服务器客户端通信demo

OSI模型分层 OSI模型是指国际标准化组织(ISO)提出的开放系统互连参考模型(Open System Interconnection Reference Model,OSI/RM),它将网络分为七层:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层 TCP/IP协议 TCP/IP是一系列网络通信协议的统称,其中最核心的两个协议是TCP和IP.TCP称为传输控制协议,IP称为互联网络协议. 网络分层除了OSI模型分层,还有TCP/IP模型分层,将网络划分为四层,应用层.传输层.网际层

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

TCP Client 客户端编程步骤: 创建socket对象 连接到服务端的ip和port,connect()方法 传输数据 使用send.recv方法发送.接收数据 关闭连接,释放资源 最简单的客户端: #TCP Client客户端 import socket client = socket.socket() client.connect(('127.0.0.1',9999)) client.send("Hi, I'm client1.".encode()) client.close

五十三 网络编程 TCP/IP简介

虽然大家现在对互联网很熟悉,但是计算机网络的出现比互联网要早很多. 计算机为了联网,就必须规定通信协议,早期的计算机网络,都是由各厂商自己规定一套协议,IBM.Apple和Microsoft都有各自的网络协议,互不兼容,这就好比一群人有的说英语,有的说中文,有的说德语,说同一种语言的人可以交流,不同的语言之间就不行了. 为了把全世界的所有不同类型的计算机都连接起来,就必须规定一套全球通用的协议,为了实现互联网这个目标,互联网协议簇(Internet Protocol Suite)就是通用协议标准

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

1.TCP/IP五层协议讲解 物理层--数据链路层--网络层--传输层--应用层 我们将应用层,表示层,会话层并作应用层,从tcp/ip五层协议的角度来阐述每层的由来与功能,搞清楚了每层的主要协议 就理解了整个互联网通信的原理. 首先,用户感知到的只是最上面一层应用层,自上而下每层都依赖于下一层,所以我们从最下一层开始切入,比较好理解 每层都运行特定的协议,越往上越靠近用户,越往下越靠近硬件 2.物理层 物理层由来:上面提到,孤立的计算机之间要想一起玩,就必须接入internet,言外之意就是计

python网络编程 - tcp

网络编程 低级别的网络服务 高级别的网络服务 socket又称“套接字”,应用程序通过“套接字”向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯. python代码实现 服务端 流程 1.socket创建一个套接字 2.bind绑定ip和port 3.listen 使套接字变为可以被动链接(默认创建的套接字是主动去链接别人的) 4.accept 等待客户端的链接(accept和客户端的connect是一对,服务器的accept只响应客户端的connect) 5.send/