首页 > 代码库 > week7_day1(socket编程)

week7_day1(socket编程)

 一、网络通信要素   

  A:IP地址 

    (1) 用来标识网络上一台独立的主机     

    (2) IP地址 = 网络地址 + 主机地址(网络号:用于识别主机所在的网络/网段。主机号:用于识别该网络中的主机)
      (3) 特殊的IP地址:127.0.0.1(本地回环地址、保留地址,点分十进制)可用于简单的测试网卡是否故障。表示本机。
  B:端口号
     (1) 用于标识进程的逻辑地址。不同的进程都有不同的端口标识。
         (2) 端口:要将数据发送到对方指定的应用程序上,为了标识这些应用程序,所以给这些网络应用程序都用数字进行标识。为了方便称呼这些数字,则将这些数字                        称为端口。(此端口是一个逻辑端口)
  C: 传输协议:通讯的规则
         例如:TCP、UDP协议(好比两个人得用同一种语言进行交流)

二、传输协议 

  1、UDP:User Datagram Protocol用户数据报协议
      特点:
        a、面向无连接:传输数据之前源端和目的端不需要建立连接;
        b、每个数据报的大小都限制在64K(8个字节)以内;
        c、面向报文的不可靠协议;(即:发送出去的数据不一定会接收得到)
        d、传输速率快,效率高。
      现实生活实例:
             邮局寄件、实时在线聊天、视频会议…
 
  2、TCP:Transmission Control Protocol传输控制协议
       特点:
         a、面向连接:传输数据之前需要建立连接;
         b、在连接过程中进行大量数据传输;
         c、通过“三次握手”的方式完成连接,是安全可靠协议;
         d、传输速度慢,效率低。

三、socket通信流程

  技术分享

四、socket实现通信

  server端

#!/usr/bin/env python# -*- coding:utf-8 -*-# author by lhimport socketsk=socket.socket()address=(‘127.0.0.1‘,8000)sk.bind(address)      # 绑定IP地址和端口sk.listen(3)          # 确定客户端能连几个人while True:    conn,add=sk.accept()     # 阻塞,直到客户端有连接(如果收到的数据为空,则一直阻塞)    while True:        try:             # 如果在客户端直接退出的情况下,保证下一个可以连接            da=conn.recv(1024)          # 接收信息(必须是字符串类型)            da=str(da,‘utf8‘)            print(da)            if not da:           # 判断是否收到的数据为空,为空则退出                break            data=http://www.mamicode.com/input(‘请输入聊天信息:‘)>

  client端

#!/usr/bin/env python# -*- coding:utf-8 -*-# author by lhimport socketsk=socket.socket()address=(‘127.0.0.1‘,8000)sk.connect(address)         # 创建连接while True:    data=http://www.mamicode.com/input(‘请输入聊天信息:‘)>

  运行结果

                        server端                                              client端

                   技术分享                  技术分享

五、socket实例

  功能:实现命令在client端输入,传到server端,并且在server端执行并将运行结果(大文件)返回到客户端,防止粘包现象。        

  server端

#!/usr/bin/env python# -*- coding:utf-8 -*-# author by lhimport subprocessimport socketsk=socket.socket()address=(‘127.0.0.1‘,8000)sk.bind(address)      # 绑定IP地址和端口sk.listen(3)          # 确定客户端能连几个人while True:    conn,add=sk.accept()     # 阻塞,直到客户端有连接(如果收到的数据为空,则一直阻塞)    while True:        try:             # 如果在客户端直接退出的情况下,保证下一个可以连接            da=conn.recv(1024)          # 接收信息(必须是字符串类型)        except Exception:            break        if not da:           # 判断是否收到的数据为空,为空则退出            break        print(‘命令为:‘,str(da,‘utf8‘))        obj=subprocess.Popen(str(da,‘utf8‘),shell=True,stdout=subprocess.PIPE)        cmd_result=obj.stdout.read()        # 执行命令        result_len=bytes(str(len(cmd_result)),‘utf8‘)     # 计算执行结果的大小(将int类型转化为bytes类型)        print(‘大小为:‘,result_len)        conn.sendall(result_len)       # 发送信息(必须是bytes类型)        conn.sendall(cmd_result)         # 发送执行结果sk.close()

  client端

#!/usr/bin/env python# -*- coding:utf-8 -*-# author by lhimport socketsk=socket.socket()address=(‘127.0.0.1‘,8000)sk.connect(address)         # 创建连接while True:    data=http://www.mamicode.com/input(‘请输入命令:‘)>

 

week7_day1(socket编程)