由于本人初入python高级编程,在技术方面能力还有所欠缺,目前只完成部分习题。以下代码均为本人原创,如有错误,欢迎指出,感激不尽!
#2-1
**面向连接的套接字:**在客户端向服务器发出请求之前,必须先得建立一条客户端到服务器的连接,数据传输过程中可保证数据传输大的可靠性和顺序性
**无连接的套接字:**在客户端向服务器发出请求之前,不需要建立一条从客户端到服务器的连接,但是不能保证数据传输的可靠性和顺序性
#2-2
**客户端服务器架构:**客户端有请求的时候,向服务器发出请求;服务器接收到客户端的请求后,处理请求并将结果返回给客户端
1、银行柜台:去银行办理业务的客户相当于客户端,银行柜台工作人员相当于服务器。客户提出办理业务请求,工作人员处理请求并在处理之后返回给客户相关信息
2、食堂打饭:学生相当于客户端,打饭人员相当于服务器;学生向打饭人员提出想吃什么菜,打饭人员接收到消息之后,打包好相应的饭菜递交给学生
#2-3
TCP
#2-4
#tsTclnt.py TCP时间戳客户端
'''
这个脚本创建一个TCP客户端,它提示用户输入发送到服务器端的消息,并接受从服务器端返回的
添加了时间戳前缀的相同消息,然后将结果展示给用户
'''
from socket import *
'''HOST = 'localhost'#or '127.0.0.1'如果服务器运行在另一台主机上,那么需要进行相应的修改
PORT = 21567#应该和服务器设置的完全相同'''
def getADDR():
HOST = input('Please input the host name...')
PORT = input('Please input the port...')
if HOST == '' or PORT == '':
HOST = 'localhost'
PORT = 21567
ADDR = (HOST, int(PORT))
return ADDR
BUFSIZ = 1024
ADDR = getADDR()
tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR)
while True:
data = input('> ')
if not data:
break
tcpCliSock.send(bytes(data, 'utf-8'))
data = tcpCliSock.recv(BUFSIZ)
if not data:
break
print(data.decode('utf-8'))
tcpCliSock.close()
#2-5
**#服务器**
import socket
HOST = ''
PORT = 50007
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen(1)
while True:
conn, addr = s.accept()
with conn:
print('Connected by', addr)
while True:
data = conn.recv(1024)
if not data:
break
conn.sendall(data)
conn.close()
s.close()
**#客户端**
import socket
HOST = 'localhost'
PORT = 50007
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
s.sendall(b'Hello world')
data = s.recv(1024)
print('Received ', repr(data))
#2-5 扩展 实现了 ls dir 命令
**#服务器**
import socket
import os
from time import ctime
import re
HOST = ''
PORT = 50007
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen(1)
while True:
conn, addr = s.accept()
with conn:
print('Connected by', addr)
while True:
data = conn.recv(1024).decode('utf-8')
patt = r'^ls\s?(.*)'
m = re.match(patt, data)
if not data:
break
if m:
if m.group(1):
path = str(m.group(1))
else:
path = os.curdir
recon = str(os.listdir(path))
else:
if data == 'date':
recon = ctime()
elif data == 'os':
recon = os.name
conn.sendall(bytes(recon, 'utf-8'))
conn.close()
s.close()
**#客户端**
import socket
HOST = 'localhost'
PORT = 50007
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
while True:
data = input('>')
if not data:
break
s.sendall(bytes(data, 'utf-8'))
data = s.recv(1024)
print('Received ', data.decode('utf-8'))
#2-6
#获取UDP协议daytime服务的端口号
‘’’
getservbyname函数传入两个参数,第一个参数位服务名,第二个参数位协议名称
‘’’
import socket
socket.getservbyname(‘daytime’,‘UDP’)
#2-7
半双工聊天
**#服务器**
from socket import *
#先确定好主机和端口号
HOST = ''
PORT = 21567
ADDR = (HOST, PORT)
#建立tcp套接字
tcpSerSock = socket(AF_INET, SOCK_STREAM)
tcpSerSock.bind(ADDR)#套接字绑定地址
tcpSerSock.listen(5)#开始监听是否有请求
while True:
print('...waiting connection...')
cliSerSock, addr = tcpSerSock.accept()#接受来自客户端的请求,并返回一个新的套接字和客户端的地址
print('connect from: ', addr)
while True:
rec = cliSerSock.recv(1024).decode('utf-8')#接受来自客户端的消息
if rec == 'quit':
print('This chat ends...')
break
else:
print('>', rec)
rep = input('>')
cliSerSock.send(bytes(rep, 'utf-8'))
cliSerSock.close()
tcpSerSock.close()
**#客户端**
from socket import *
HOST = 'localhost'#or '127.0.0.1'如果服务器运行在另一台主机上,那么需要进行相应的修改
PORT = 21567#应该和服务器设置的完全相同
ADDR = (HOST, PORT)
tcpClntSock = socket(AF_INET, SOCK_STREAM)
tcpClntSock.connect(ADDR)
flag = 0
while True:
if flag == 0:
print('Now let\'s begin chatting!')
send = input('>')
tcpClntSock.send(bytes(send, 'utf-8'))
flag = 1
if send == 'quit':
print('This chat ends...')
break
else:
rec = tcpClntSock.recv(1024).decode('utf-8')
print('>', rec)
send = input('>')
tcpClntSock.send(bytes(send, 'utf-8'))
tcpClntSock.close()
#2-8、2-9、2-10由于目前别人还没有学多线程实现,因此暂时搁置
#2-11
from socket import *
HOST = 'www.sina.com'
PORT = 80
BUFSIZ = 1024
ADDR = (HOST, PORT)
tcpCliSock = socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(ADDR)
tcpCliSock.send(bytes('GET/ \n', 'utf-8'))
data = tcpCliSock.recv(BUFSIZ).decode('utf-8')
with open(r"D:\webpage.txt",'w') as f:
f.write(data)
print('operating successfully!')
未完待续~