Python 中的网络编程实现

TCP 服务器端代码:

#!/usr/bin/env
# -*- coding:utf-8 -*-
from socket import *
from time import ctime

HOST = ''              # 服务器中 HOST 变量是空白的(单引号之间没有空格!),这是对bind() 方法的标识,表示它可以使用任何可用的地址
PORT = 21567
BUFSIZE = 1024
ADDR = (HOST,PORT)

tcpSerSock = socket(AF_INET,SOCK_STREAM)
tcpSerSock.bind(ADDR)           # 将套接字绑定到服务器地址
tcpSerSock.listen(5)            # 开启TCP 监听器的作用,参数表示在连接被转接或者拒绝之前,传入连接请求的最大数

while True:
    print"waiting for connection..."
    tcpCliSock,addr = tcpSerSock.accept()               # 等待客户端的链接,客户端信息与客户端的IP地址
    print"...connneted from:",addr
    while True:
        data = tcpCliSock.recv(BUFSIZE)                 # 接受客户端发送来的数据
        print"接受数据是...:",data
        if not data:
            break
        tcpCliSock.send("[%s]%s"%(ctime(),data))     # 注意!!! 这里是tcpCliSock.send()!!!不是tcpSerSock.send()
    tcpCliSock.close()
tcpSerSock.close()

TCP 客户端代码

#!user/bin/env
#-*- coding:utf-8 -*-
from socket import *
from time import ctime

HOST = "localhost"
PORT = 21567
BUFSIZE = 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)                   # 数据发送
    receData = tcpCliSock.recv(BUFSIZE)     # 接受服务器端发送来的数据
    if not receData:
        break
    print"从服务器接受到的数据为:",receData
tcpCliSock.close()

UDP 服务器代码

#!user/bin/env
#-*- coding:utf-8 -*-
from socket import *
from time import ctime

HOST = ""
PORT = 21567
BUFSIZE = 1024
ADDR = (HOST,PORT)

udpSerSock = socket(AF_INET,SOCK_DGRAM)
udpSerSock.bind(ADDR)
while True:
    print"waiting for message..."
    data,addr = udpSerSock.recvfrom(BUFSIZE)
    udpSerSock.sendto("[%s]%s"%(ctime(),data),addr)
    print"从客户端接收到的数据是:",data
    print"...received from and return to: ",addr
udpSerSock.close()

UDP 客户端代码

#!user/bin/env
#-*- coding:utf-8 -*-
from socket import *
from time import ctime

HOST = "localhost"
PORT = 21567
BUFSIZE = 1024
ADDR = (HOST,PORT)

udpCliSock = socket(AF_INET,SOCK_DGRAM)
while True:
    data = raw_input(">")
    if not data:
        break
    udpCliSock.sendto(data,ADDR)
    receData,servADDR = udpCliSock.recvfrom(BUFSIZE)
    if not receData:
        break
    print"从服务器接收到的数据是:",receData
udpCliSock.close()

基本概念

套接字:是指计算机网络数据结构。在任何类型的通信开始之前,网络应用程序必须创建套接字。

套接字包括两种类型:基于文件的(家族名字:AF_UNIX)和面向网络的(家族名字:AF_INET)。

1、面向连接的套接字: 在进行通信之前必须先建立一个连接。这种通信成为虚拟电路或流套接字。这种通信可以提供序列化的、可靠的和不重复的数据交付,而没有记录边界。

传输控制协议(TCP)是面向连接的主要协议,必须使用SOCK_STREAM 作为套接字类型。

2、无连接的套接字: 在通信开始之前不需要建立连接。数据传输过程中无法保证它的顺序性、可靠性和重复性。但是,数据报保存了记录边界,这意味着数据是整体发送的,而非首先分成多个片段。

用户数据协议(UDP)是无连接型的套接字,必须使用 SOCK_DGRAM 作为套接字类型。

套接字地址:主机-端口对

一个网络地址由主机名和端口号对组成,主机名和端口号就像区号和电话号码的组合。有效的端口号范围是0~65535(小于1024的端口号预留给系统)。

socket() 模块函数
要创建套接字,必须使用socket.socket( )函数,一般语法如下:

socket(socket_family,socket_type,protocol=0)

其中,socket_family 是 AF_UNIX 或者 AF_INET; socket_type 是 SOCK_STREAM 或者 SOCK_DGRAM; protocol 通常省略,默认值为 0。

创建 TCP/IP 套接字,调用socket.socket() 的方式为:

tcpSock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

创建UDP/IP 套接字,socket.socket() 的调用方式:

udpSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

若在头文件中加入“from socket import *”,将 socket 的属性引入到命名空间,套接字的创建方式可简化为:

tcpSock = socket(AF_INET,SOCK_STREAM)

TCP/IP 通信伪代码

创建 TCP 服务器

ss = socket()                    # 创建服务器套接字
ss.bind()                        # 套接字与地址绑定
ss.listen()                      # 监听链接
inf_loop:                        # 服务器无限循环
    cs = ss.accept()             # 接受客户端连接
    comm_comm_loop:              # 通信循环
        cs.recv() / cs.send()    # 对话(接受或者发送数据)
    cs.close()                   # 关闭客户端套接字
ss.close()                       # 关闭服务器套接字

创建 TCP 客户端

cs = socket()               # 创建客户端套接字
cs.connect()                # 尝试连接服务器
comm_loop:                  # 通信循环
    cs.send()/cs.recv()     # 对话(发送或者接受数据)
cs.close()                  # 关闭客户端套接字

UDP 通信伪代码

创建 UDP 服务器

ss = socket()                    # 创建服务器套接字
ss.bind()                        # 套接字与地址绑定
inf_loop:
    cs = ss.recvfrom()/ss.sendto()     # 接受或者发送数据
ss.close()                  # 关闭服务器套接字

创建 UDP 客户端

cs = socket()
comm_loop:
     cs.sendto()/cs.recvfrom()    # 对话
cs.close()

摘自《Python 核心编程》

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值