TCP和UDP的特点
TCP特点和应用
**特点:**是面向连接的、流式的、可靠的、慢的、全双工通信的
应用: 邮件、文件、http、web
UDP特点和应用
**特点:**是一个面向数据报的、不可靠的、快的,能够完成一对一,一对多、多对一、多堆多
**应用:**即时聊天工具、视频的在线观看
网络编程-UDP
服务器
import socket
#建立套接字对象以及绑定端口和ip
server = socket.socket(type = socket.SOCK_DGRAM)
server.bind(('127.0.0.1',7888))
print('正在连接。。。')
#接收内容是一个元组,第一个是数据,第二个是数据源地址
msg,addr = server.recvfrom(1024)
print('content:%s,addr:%s'%(msg,addr))
server.close()
客户端
import socket
client = socket.socket(type = socket.SOCK_DGRAM)
client.sendto(b'haha',('127.0.0.1',7888))
client.close()
UDP聊天器
服务器
import socket
#创建udp套接字对象
server = socket.socket(type = socket.SOCK_DGRAM)
#创建完对象给服务器套接字绑定ip和端口
server.bind(("127.0.0.1",7888))
#接收信息,包含数据内容和数据源ip地址
while True:
msg = server.recvfrom(1024)
print("msg:%s,addr:%s" % (msg[0],msg[1]))
server.sendto(b'ok',msg[1])
客户端
import socket
client = socket.socket(type = socket.SOCK_DGRAM)
#下面实现函数的封装
def send_msg(client):
'''发送数据函数'''
desk_ip = input('请输入你要发送的ip:')
port = int(input('请输入端口:'))
msg = input('请输入内容:')
client.sendto(msg.encode('utf-8'), (desk_ip, port))
def recv_msg(client):
'''接收数据函数'''
shou_msg = client.recvfrom(1024)
print("shou_msg:%s,addr:%s" % (shou_msg[0], shou_msg[1]))
while True:
your_comond = int(input('请输入你的命令:'))
#如果输入1,则发送数据
if your_comond == 1:
send_msg(client)
#如果输入2,则接收数据
elif your_comond ==2:
recv_msg(client)
elif your_comond ==3:
break
else:
print('你输入的你命令有错,请重新输入~')
continue
网络编程-TCP
三次握手
具体的每一个状态记得不是很清楚,但是我去了解过
四次挥手
服务器
import socket
#建立套接字对象使机器具备网络功能(相当于创建了一个邮箱)
server = socket.socket(type = socket.SOCK_STREAM)
#给邮箱的每个口规定号码,送牛奶就归送牛奶,送信就归送信
server.bind(('127.0.0.1',7888))
#监听有没有人来连接我,5表示除了正在连接的人之外还可以有五个人排队
server.listen(5)
print('有人来连接我啦')
#TCP的连接特点就在这里,需要创建好连接(视频里面递给服务器的伞,服务器需要通过伞来将信息传给客户端),这里会阻塞
conn,addr = server.accept()
#下面就是利用伞来讲数据发给客户端
msg = conn.recv(1024)
#传过去时需要编码(bytes类型)
print(msg.decode('utf-8'))
conn.send('heihei'.encode('utf-8'))
conn.close()
server.close()
客户端
import socket
#建立套接字对象,是机器具备网络通讯能力
client = socket.socket(type = socket.SOCK_STREAM)
#寻找要连接的端口和ip
client.connect(('127.0.0.1',7888))
#发送数据一定要编码
client.send('hehei'.encode('utf-8'))
#开始接受服务器发过来的数据
return_msg = client.recv(1024)
#接受服务器的数据也要通过解码(如果是从windows传过来,使用‘gbk’)
print(return_msg.decode('utf-8'))
client.close()
作业(待优化成函数)
利用tcp协议写一个登录系统,客户端输入用户名和密码,服务端验证,如果用户名和密码都对则登陆成功,如果有一个输入错误那就登录失败,重新输入
客户端
import socket
client = socket.socket()
desk_ip = input('请输入你要连接的ip:')
desk_port = int(input('请输入你要连接的端口:'))
client.connect((desk_ip,desk_port))
return_content = client.recv(1024).decode('utf-8')
print(return_content)
user = input('请输入账号:')
key = input('请输入密码:')
client.send(user.encode('utf-8'))
client.send(key.encode('utf-8'))
msg = client.recv(1024).decode('utf-8')
print(msg)
服务端
import socket
from socket import SOL_SOCKET,SO_REUSEADDR
def jiexi(return_user,return_key):
user_dic = {122828: 'haha', 1212: 'jaja'}
count = 0
for key,value in user_dic.items():
if return_user == key:
if return_key == user_dic[key]:
print('登陆成功~')
break
else:
print('用户名或密码错误,请重新输入')
#重新开始输入
else:
count = count + 1
if count < 3:
continue
else:
print('用户名和密码输入有误~')
break
server = socket.socket()
server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
server.bind(('127.0.0.1',7888))
server.listen(4)
conn,addr = server.accept()
print('有人请求登陆~')
conn.send('连接成功,请输入账号和密码:'.encode('utf-8'))
return_user = conn.recv(1024).decode('utf-8')
return_key = conn.recv(1024).decode('utf-8')
print(return_user,return_key)
user_dic = {'122828': 'haha', '1212': 'jaja'}
count = 0
for key,value in user_dic.items():
if return_user == key:
print('用户名正确~')
if return_key == user_dic[key]:
conn.send('登陆成功~'.encode('utf-8'))
break
else:
conn.send('用户名或密码错误,请重新输入'.encode('utf-8'))
#重新开始输入
else:
count = count + 1
if count < 2:
continue
else:
conn.send('用户名或密码错误,请重新输入'.encode('utf-8'))
break
模拟ssh(利用客户端控制服务器的终端)
subproess模块
import subprocess
#利用python来让终端执行cmd,并获取执行结果
res=subprocess.Popen(cmd.decode('utf-8'),
shell=True,
stderr=subprocess.PIPE,
stdout=subprocess.PIPE)
print(res.stdou.read()decode('utf-8'))
客户端
import socket
#建立tcp协议
client = socket.socket()
client.connect(('127.0.0.1',7888))
while 1:
cmd = input('请输入命令:')
#输入然后发送命令
client.send(cmd.encode('utf-8'))
#接收返回的信息
return_msg = client.recv(1024).decode('utf-8')
print(return_msg)
服务端
import socket
import subprocess
from socket import SOL_SOCKET,SO_REUSEADDR
#建立tcp协议
server = socket.socket()
server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
server.bind(('127.0.0.1',7888))
server.listen(5)
conn,accept = server.accept()
while 1:
cmd = conn.recv(1024).decode('utf-8')
print('收到客户端的命令为:',cmd)
#建立远程执行服务器终端模块
res=subprocess.Popen(cmd,
shell=True,
stderr=subprocess.PIPE,
stdout=subprocess.PIPE)
#if res.stderr.read():#这里一定注意,读过一次了,光标在最后
#conn.send(res.stderr.read().encode('utf-8'))
#print('hah')
# else:
#conn.send(res.stdout.read().encode('utf-8'))
# print('heuhei')
#print('执行结果发送完毕')
#修改版本
content = res.stderr.read()
if content:
print('有错误,错误内容为:')
conn.send(content)
else:
print('执行成功')
conn.send(res.stdout.read())
print('执行结果发送完毕')