网络编程实验报告
实验题目:底层网络接口编程实验
一、TCP编程
1、需求分析
tcp是面向连接的可靠的协议,适用于传输大批量的文件,检查是否正常传输。tcp需要先建立连接才能通话 。
tcp可以形象比喻为打电话的过程,udp可以比喻为发短信的过程
tcp不能发送广播和组播,只能单播
2、概要设计
3、详细设计
(1)、伪代码:
TCP服务器端:
ss=socket() #创建服务器套接字
ss.bind() #把本地地址绑到套接字上
ss.listen() #监听连接
inf_loop: #服务器无限循环
cs=ss.accept() #接受客户端的连接
comm._loop: #通信循环
cs.recv()/cs.send() #对话
cs.close() #关闭客户套接字
ss.close() #关闭服务器套接字
TCP客户端:
cs=socket() #创建客户套接字
cs.connect() #尝试连接服务器
comm._loop: #通信循环
cs.send()/cs.recv() #对话
cs.close() #关闭套接字
(2)、TCP服务器脚本如下:
from socket import * 导入socket所有内建方法from time import ctime 导入时间类
#主机
HOST = '' #''代表服务器为localhost #端口号
PORT = 12345
#缓存大小
BUFSIZE = 1024
#完整地址
ADDR = (HOST, PORT)
#参数SOCK_STREAM表示建立一个TCP服务器tcpSerSock = socket(AF_INET, SOCK_STREAM)
#绑定到指定端口
tcpSerSock.bind(ADDR)
#最多连接5个客户端
tcpSerSock.listen(5)
while True:
print 'Waiting for connection...'
tcpCliSock, addr = tcpSerSock.accept()
print '...connected from: ', addr
while True:
#接收客户端数据
data = tcpCliSock.recv(BUFSIZE)
if not data:
break
print 'Received from client:', data
#向客户端发送数据
tcpCliSock.send('[%s] %s' % (ctime(), data))
#关闭连接
tcpCliSock.close()
tcpSerSock.close()
注:一种友好的退出方法是把服务器的无限循环放在一个try-except语句的try子句当中,并捕获EOFError和KeyboardInterrupt异常,在异常处理子句中,调用close()函数关闭服务器的套接字。
(3)、TCP客户端脚本如下:
from socket import *
#设置连接参数
#主机(本机)
HOST = 'localhost'
#端口号
PORT = 12345
#缓存大小
BUFSIZE = 1024
#完整地址
ADDR = (HOST, PORT)
#SOCK_STREAM参数表示建立TCP连接
tcpCliSock = socket(AF_INET, SOCK_STREAM)
#使用socket的connect方法连接服务器
tcpCliSock.connect(ADDR)
while True:
data = raw_input('>')
if not data:
break
#向服务器发送数据
tcpCliSock.send(data)
#接收服务器返回的数据
data = tcpCliSock.recv(BUFSIZE)
if not data:
break
print data
#关闭连接
tcpCliSock.close()
4、程序设计及运行结果
(1)、服务器程序:
(2)、客户端程序:
(3)、程序结果在两个shell中演示:
二、UDP编程
1、需求分析
udp是面向非连接的不可靠的协议,适用于传输一次性小批量的文件,不对传输数据报进行检查
udp不需要,实时性要高点
udp可以广播和组播
2、概要设计
3、详细设计
(1)、伪代码:
UDP服务器端:
Ss=socket() #创建套接字
ss.bind() #绑定
inf_loop: #无限循环
ss.recvfrom()/sendto() #对话
ss.close() #关闭套接字
UDP客户端:
Cs=socket() #创建
Comm_loop: #循环接收发送
Cs.sendto()/recvfrom() #对话
Cs.close() #关闭
(2)、UDP服务器脚本如下:
from socket import *
from time import ctime
HOST = '' #''代表服务器为localhost PORT = 12345
BUFSIZE = 1024
ADDR = (HOST, PORT)
#SOCK_DGRAM参数表示建立UDP连接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 '...received from and returned to:', addr udpSerSock.close()
(3)、UDP客户端脚本如下:
from socket import *
HOST = 'localhost'
PORT = 12345
BUFSIZE = 1024
ADDR = (HOST, PORT)
#SOCK_DGRAM参数表示建立UDP连接udpCliSock = socket(AF_INET, SOCK_DGRAM)
while True:
data = raw_input('>')
if not data:
break
udpCliSock.sendto(data, ADDR)
data, addr = udpCliSock.recvfrom(BUFSIZE)
if not data:
break
print data, 'from', addr
udpCliSock.close()
4、程序设计及运行结果
(1)、服务器程序:
(2)、客户端程序:
(3)、程序结果在两个shell中演示:
总结:UDP和TCP区别:
UDP和TCP服务器的一个重要区别是,由于数据报套接字(UDP)是无连接的,所以无法把客户的连接交给另外的套接字进行后续的通讯。这些服务器只是接受消息,需要的话,给客户返回一个结果就可以了。
三、UDP广播
1、UDP广播工作原理:
广播UDP与单播UDP的区别就是IP地址不同,广播使用广播地址255.255.255.255,将消息发送到在同一广播网络上的每个主机。值得强调的是:本地广播信息是不会被路由器转发。当然这是十分容易理解的,因为如果路由器转发了广播信息,那么势必会引起网络瘫痪。这也是为什么IP协议的设计者故意没有定义互联网范围的广播机制。
广播地址通常用于在网络游戏中处于同一本地网络的玩家之间交流状态信息等。
2、UDP广播拓扑结构:
3、UDP程序设计和运行结果:
(1)、UDP广播发送程序:
(2)、UDP广播接收程序:
(3)在两个shell中运行显示结果
广播本地测试,接收自IP地址为:192.169.56.1的发送端的消息。发送端可以陆续广播,组内成员及时接收消息。