day3 课堂笔记 网络编程

今日内容大纲

  1. 单次通信
  2. 通信循环
  3. 链接、通信循环
  4. 执行远端命令

1.单次通信

  • listen(n)

    import socket
    
    # 基于网络的TCP协议
    server = socket.socket()
    
    server.bind(('127.0.0.1',8848))# 8848为端口号计算机共有65535个端口号。
    # 127.0.0.1回环地址,只允许本机自己连接
    
    # 待机等待其他人连接
    server.listen(5)
    conn, addr = server.accept() # 阻塞,当有客户端连接,将运行之后代码
    print(111)
    

    listen(n) 是控制客户端链接服务端的具体数量,也就是控制的进入半链接池的客户端的数量。
    具体运行时,连入数量为(n+1)个,一个与服务端正常通信,n和与服务端处于半连接状态,等待第一个与服务端通信完成后,第二个再与服务端通信,排队顺序为客户端的连入顺序。

    • 没有启动服务端,而先启动客户端会报错

    • 先启动服务端,在启动客户端
      在这里插入图片描述

      • 服务端代码

        import socket
        
        
        server = socket.socket()
        
        server.bind(('127.0.0.1',8848))
        
        server.listen(5)
        print(1111)
        ret = server.accept()
        
        conn, addr = ret #分别赋值, conn指代的是管道,addr客户端地址
        
        from_client_data = conn.recv(1024)
        print(f'{addr}客户端的消息:{from_client_data.decode("utf-8")}')
        
        conn.send(from_client_data.upper())
        
        conn.close()
        server.close()客户端
        
      • 客户端代码

        import socket
        
        client = socket.socket()
        
        client.connect(('127.0.0.1',8848))
        
        client.send('hello'.encode('utf-8'))
        from_server_data = client.recv(1024)
        print(from_server_data)
        
        client.close()
        

2. 通信循环

  • 服务端代码

    import socket
    
    server = socket.socket()
    
    server.bind('127.0.0.1',8848)
    
    server.listen(5)
    
    conn, addr = server.accept()
    
    while 1:
    	try:
    		from_client_data = conn.recv(1024)
    		if from_client_data.upper() ==b'Q':
    			break
    		print(f'{addr}客户端的消息:{from_client_data.decode("utf-8")}')
    		to_client_data = input('>>')
    		conn.send(to_client_data.encode('utf-8'))
    	except ConnectionResetError:
    		break
    		
    conn.close()
    server.close()
    
  • 客户端代码

    import socket
    
    client = socket.socket()
    
    client.connect(('127.0.0.1',8848))
    while 1:
    	to_server_data = input('>>')
    	client.send(to_server_data.encode('utf-8'))
    	if to_server_data.upper() == 'Q':
    		break
    	from_server_data = client.recv(1024)
    	print(f"服务端说:{from_server_data.decode('utf-8')}")
    	
    client.close()
    

3. 链接+ 通讯循环

  • 服务端代码

    import socket
    
    server = socket.socket()
    
    server.bind(('127.0.0.1',8848))
    
    server.listen(5)
    while 1:
    	conn, addr = server.accept()
    	while 1:
    		try:
    			from_client_data = conn.recv(1024)
    			if from_client_data.upper() == b'Q':
    				break
    			print(f'{addr[1]}客户端的消息:{from_client_data.decode("utf-8")})
    			to_client_data = input('>>')
    			conn.send(to_client_data.encode('utf-8'))
    		except ConnectionResetError:
    			break
    	conn.close()
    server.close()
    
  • 客户端代码

    import socket
    
    client = socket.socket()
    
    client.connect(('127.0.0.1',8848))
    while 1:
    	to_server_data = input('>>')
    	client.send(to_server_data.encode('utf-8'))
    	if to_server_data.upper() == 'Q':
    		break
    	from_server_data = client.recv(1024)
    	print(f"服务端说:{from_server_data.decode('utf-8')}")
    client.close()
    

4. 执行远端命令

  • subprocess

    执行命令,获取结果

    import subprocess
    obj = subprocess.Popen('ipconfig',
    						shell = True,
    						stdout = subprocess.PIPE,
    						stderr = subprocess.PIPE)
    						
    print(obj.stdout.read().decode('gbk')) # 正确命令
    print(obj.stderr.read().decode('gbk')) # 错误命令
    
  • 服务端代码

    import socket
    import subprocess
    
    server = socket.socket()
    
    server.bind(('127.0.0.1',8848))
    
    server.listen(5)
    while 1:
    	conn, addr = server.accept()
    	while 1:
    		try:
    			from_client_cmd = conn.recv(1024)
    			if from_client_cmd.upper() == b'Q'
    				break
    			obj = subprocess.Popen(from_client_cmd.decode('utf-8'),
    			shell = True,
    			stdout = subprocess.PIPE,
    			stderr = subprocess.PIPE)
    			result = obj.stdout.read().decode('gbk') + obj.stderr.read().decode('gbk')
    			conn.send(result.encode('utf-8'))
    			
    		except ConnectionResetError:
    			break
    	conn.close()
    server.close()
    
  • 客户端代码

    import socket
    
    client = socket.socket()
    
    client.connect(('127.0.0.1',8848))
    
    while 1:
    	to_server_data = input('请输入命令>>')
    	client.send(to_server_data.encode('utf-8'))
    	if to_server_data.upper() == 'Q':
    		break
    	from_server_data = client.recv(1024)
    	print(f'结果:{from_server_data.decode("utf-8")')
    client.close()
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值