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 核心编程》