python网络编程UDP和TCP

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('执行结果发送完毕')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值