python笔记(网络编程--tcp/udp编程)

一、TCP(只能一对一,长连接):server端

import socket

sk = socket.socket()  #相当于买手机   创建一个socket对象
sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #避免服务重启的时候报address alrealy in use

sk.bind(('127.0.0.1',8890))#相当于绑定手机卡:给server端绑定一个ip和端口
sk.listen(5) #监听 等着有人给我打电话  只允许5个人连我

conn,addr = sk.accept()#接收别人的电话  connection:连接  address 地址 获取到一个客户端的连接,已完成了三次握手建立了一个连接

print(addr)


while True:
    ret = conn.recv(1024).decode('utf-8') #听别人说话   recv(num):num接收的字节长度
    if ret == 'bye':
        break
    print(ret)
    info = input('>>')
    conn.send(bytes(info,encoding='utf-8'))
conn.close()  #挂电话
sk.close()#关手机  关闭socket对象

输出结果:

(‘127.0.0.1’, 56533)
你好
很好

TCP:client端

import socket
sk = socket.socket() #买手机
sk.connect(('127.0.0.1',8890))#拨别人的号

while True:
    info = input('>>')
    sk.send(bytes(info,encoding='utf-8'))
    ret = sk.recv(1024).decode('utf-8')
    print(ret)
    if ret == 'bye':
        sk.send(b'bye')
        break
sk.close()

输出结果:

你好
很好
bye

二、UDP(可以多对一):server端:

import socket
sh = socket.socket(type=socket.SOCK_DGRAM)
sh.bind(('127.0.0.1',8080))
while True:
    msg,addr = sh.recvfrom(1024)
    print(msg.decode('utf-8'))
    info = input('>>').encode('utf-8')
    sh.sendto(info,addr)

sh.close()

输出结果:

来自耿娃的消息:hi
hellow
来自全蛋的消息:你好
你好
来自全蛋的消息:bye
bye
来自耿娃的消息:see you
bye

UDP:client(1)端:

import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
ip_port = ('127.0.0.1',8080)

while True:
    info = input('耿娃:')
    info = ('\033[32m来自耿娃的消息:%s\033[0m'%info).encode('utf-8')
    sk.sendto(info,ip_port)
    ret,addr = sk.recvfrom(1024)
    print(ret.decode('utf-8'))

sk.close()

输出结果:

耿娃:hi
hellow
耿娃:see you
bye
耿娃:

UDP:client(2)端:

import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
ip_port = ('127.0.0.1',8080)

while True:
    info = input('全蛋:')
    info = ('\033[34m来自全蛋的消息:%s\033[0m' % info).encode('utf-8')
    sk.sendto(info,ip_port)
    ret,addr = sk.recvfrom(1024)
    print(ret.decode('utf-8'))

sk.close()

输出结果:

全蛋:你好
你好
全蛋:bye
bye
全蛋:

udp:
1、udp的server不需要进行监听也不需要建立连接
2、在启动服务之后只能被动的等待客户端发送消息过来
3、客户端发送消息的同时还会自带地址信息
4、消息回复的时候不仅需要发送消息,还需要把自己的地址发送过去

三、一个很好的例子(所有的客户端执行server端下发的指令将结果反馈回来,我来接收):
在server端下发命令
在client端接收命令

TCP(server端):

import subprocess
res = subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
print('stdout',res.stdout.read().decode('gbk'))
print('stderr:',res.stderr.read().decode('gbk'))

import socket
sk = socket.socket()
sk.bind(('127.0.0.1',8090))
sk.listen(5)

conn,addr = sk.accept()
while True:
    cmd = input('>>').encode('utf-8')
    conn.send(cmd)
    ret = conn.recv(10240).decode('utf-8')
    print(ret)
conn.close()
sk.close()

输出结果:

stdout 驱动器 D 中的卷是 LENOVO 卷的序列号是 8CB6-F27B D:\Python\python_txt\GUI进度条 的目录2018/11/28 15:36 …
dir
stdout 驱动器 D 中的卷是 LENOVO 卷的序列号是 8CB6-F27B D:\Python\python_txt\GUI进度条 的目录2018/11/28 15:36 …

TCP(client端):

import socket
import subprocess
sk = socket.socket()
sk.connect(('127.0.0.1',8090))

while True:
    cmd = sk.recv(10240).decode('gbk')
    ret = subprocess.Popen(cmd,shell=True,
                           stdout=subprocess.PIPE,
                           stderr=subprocess.PIPE)
    stdout = 'stdout:'+ (ret.stdout.read()).decode('gbk')
    stderr = 'stderr:'+ (ret.stderr.read()).decode('gbk')
    sk.send(stdout.encode('utf-8'))
    sk.send(stderr.encode('utf-8'))
sk.close()

UDP(server端):

import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',8090))
msg,addr = sk.recvfrom(1024)
while True:
    cmd = input('>>:')
    if cmd == 'q':
        break
    sk.sendto(cmd.encode('utf-8'),addr)
    msg,addr = sk.recvfrom(1024)
    print(msg.decode('utf-8'))

sk.close()

输出结果:

:dir
stdout: 驱动器 D 中的卷是 LENOVO
卷的序列号是 8CB6-F27B…

UDP(client端):

   import socket
    import subprocess
    sk = socket.socket(type=socket.SOCK_DGRAM)
    addr = ('127.0.1',8090)
    sk.sendto('hi'.encode('utf-8'),addr)
    while True:
        cmd, addr = sk.recvfrom(1024)
        ret = subprocess.Popen(cmd.decode('gbk'),shell=True,
                               stdout=subprocess.PIPE,
                               stderr=subprocess.PIPE)
        stdout = 'stdout:'+ (ret.stdout.read()).decode('gbk')
        stderr = 'stderr:'+ (ret.stderr.read()).decode('gbk')
        print(stdout)
        print(stderr)
        sk.sendto(stdout.encode('utf-8'),addr)
        sk.sendto(stderr.encode('utf-8'),addr)
    sk.close()

输出结果:

stdout: 驱动器 D 中的卷是 LENOVO
卷的序列号是 8CB6-F27B…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值