Socket

  1. # 用一个 Socke t表示“打开了一个网络连接”
  2. # 打开一个 Socket 需要知道目标计算机的IP地址和端口号,再指定协议类型即可。
  3. # TCP
  4. # 主动发起连接的是客户端,被动相应的是服务器
  5. # 1. 创建一个基于 TCP 连接的socket
  6. import socket
  7. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  8. # AF_INET 指 IPv4 协议。SOCK_STREAM 指面向流的 TCP 协议。
  9. # 初始化了一个 socket 实例,还没有建立连接
  10. # 2. 连接到服务器
  11. # connect 接受的参数是一个 tuple:(ip, port)。输入域名可以通过DNS自动转换为IP地址。
  12. s.connect(('www.sina.com.cn',80))
  13. # 3. 发送数据 send
  14. # 下列数据的意思是:请求返回首页的内容
  15. # TCP连接创建的是双向通道,双方都可以同时给对方发数据。但是谁先发谁后发,怎么协调,要根据具体的协议来决定。例如,HTTP协议规定客户端必须先发请求给服务器,服务器收到后才发数据给客户端。
  16. s.send(b'GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n')
  17. # 4. 接受服务器发来的数据
  18. # 发送完 HTTP 格式请求后,接下来就可以接收新浪服务器返回的数据了:
  19. buffer = []
  20. while True:
  21. d = s.recv(1024) # 1KB
  22. if d:
  23. buffer.append(d)
  24. else: # 数据读取完毕或者连接中断,返回 empty string
  25. break
  26. data = b''.join(buffer) # 这句语句的意思就是使用空字节把 buffer 这个字节列表连接在一起,成为一个新的字节串
  27. # b''是一个空字节,join是连接列表的函数,buffer是一个不断接受到的串的列表
  28. # 例如把[b'ab',b'cd',b'ef']变成 b'abcdef'
  29. # 5. 接受完数据,关闭 socket
  30. s.close()
  31. # 接收到的数据包括HTTP头和网页本身
  32. # 我们只需要把HTTP头和网页分离一下,把HTTP头打印出来,网页内容保存到文件:
  33. header, html = data.split(b'\r\n\r\n',1)
  34. print(header.decode('utf-8'))
  35. with open('sina.html','wb') as file:
  36. file.write(html)

服务器

  1. # 1. 服务器进程绑定一个端口,监听来自客户端的连接
  2. # 四元组来唯一确定一个 socket
  3. # 因为服务器要同时相应多个客户端的请求,所以,每次连接都需要一个新的进程或者线程来处理。
  4. # 我们来编写一个简单的服务器程序,它接收客户端连接,把客户端发过来的字符串加上Hello再发回去。
  5. import socket
  6. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  7. # 监听端口
  8. # 绑到本地地址,端口号9999
  9. # 127.0.0.1是一个特殊的IP地址,表示本机地址,如果绑定到这个地址,客户端必须同时在本机运行才能连接,也就是说,外部的计算机无法连接进来。
  10. s.bind(('127.0.0.1', 9999))
  11. # 调用listen()方法开始监听端口,传入的参数指定等待连接的最大数量:
  12. s.listen(5)
  13. print('Waiting for connection...')
  14. # 服务器程序通过一个永久循环来接受来自客户端的连接
  15. # accept()会等待并返回一个指示客户端连接的socket 和客户端 ip 地址:
  16. import threading
  17. import time
  18. def tcplink(sock, addr):
  19. print('Accept new connection from %s...' % addr)
  20. sock.send(b'Welcome!')
  21. while True:
  22. data = sock.recv(1024)
  23. time.sleep(1)
  24. if not data or data.decode('utf-8') == 'exit':
  25. break
  26. sock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'))
  27. sock.close()
  28. print('Connection from %s closed.' % addr)
  29. while True:
  30. # 接受一个新连接:
  31. sock, addr = s.accept()
  32. # 创建新线程来处理TCP连接:
  33. t = threading.Thread(target=tcplink, args=(sock, addr))
  34. t.start()

客户端

  1. import socket
  2. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  3. # 建立连接:
  4. s.connect(('127.0.0.1', 9999))
  5. # 接收欢迎消息:
  6. print(s.recv(1024).decode('utf-8'))
  7. for data in [b'Chang', b'KangKang', b'Wangbin']:
  8. # 发送数据:
  9. s.send(data)
  10. print(s.recv(1024).decode('utf-8'))
  11. s.send(b'exit')
  12. s.close()

UDP server

  1. import socket
  2. s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  3. s.bind(('127.0.0.1',9999))
  4. print('Bind UDP on 9999....')
  5. while True:
  6. # UDP: 不需要调用listen()方法,而是直接接收来自任何客户端的数据:
  7. data, addr = s.recvfrom(1024) # recvfrom()方法返回数据和客户端的地址与端口
  8. print('Received from %s:%s' % addr) # 把数据用UDP发给客户端
  9. s.sendto(b'Hello, %s!'% data, addr)

UDP client

  1. import socket
  2. s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  3. for data in [b'zhao', b'Chang']:
  4. s.sendto(data, ('127.0.0.1',9999))
  5. print(s.recv(1024).decode('utf-8'))
  6. s.close()

python learning Network Programming.py的更多相关文章

  1. python learning Functional Programming.py

    print(abs(-10)) # 函数可以是变量 f = abs f(-10) def add(x,y,f): return f(x) + f(y) x = -5 y = 6 f = abs # 简 ...

  2. Python socket – network programming tutorial

    原文:https://www.binarytides.com/python-socket-programming-tutorial/ --------------------------------- ...

  3. python learning Exception & Debug.py

    ''' 在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样,就可以知道是否有错,以及出错的原因.在操作系统提供的调用中,返回错误码非常常见.比如打开文件的函数open(),成功时返 ...

  4. python learning Regular Expression.py

    # 正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表达式通常被用来检索.替换那些符合某个模式(规 ...

  5. python network programming tutorial

    关于网络编程以及socket 等一些概念和函数介绍就不再重复了,这里示例性用python 编写客户端和服务器端. 一.最简单的客户端流程: 1. Create a socket 2. Connect ...

  6. Neural Network Programming - Deep Learning with PyTorch with deeplizard.

    PyTorch Prerequisites - Syllabus for Neural Network Programming Series PyTorch先决条件 - 神经网络编程系列教学大纲 每个 ...

  7. [C1W2] Neural Networks and Deep Learning - Basics of Neural Network programming

    第二周:神经网络的编程基础(Basics of Neural Network programming) 二分类(Binary Classification) 这周我们将学习神经网络的基础知识,其中需要 ...

  8. 吴恩达《深度学习》-第一门课 (Neural Networks and Deep Learning)-第二周:(Basics of Neural Network programming)-课程笔记

    第二周:神经网络的编程基础 (Basics of Neural Network programming) 2.1.二分类(Binary Classification) 二分类问题的目标就是习得一个分类 ...

  9. Python Lambda & Functional Programming

    Python Lambda & Functional Programming 函数式编程 匿名函数 纯函数 高阶函数 # higher-order functions def apply_tw ...

随机推荐

  1. 关于mysql-mybatis批量添加

    mybatis怎么实现一次插入多条数据   以后从新浪博客转到博客园这边来记录把.   这篇地址:http://blog.sina.com.cn/s/blog_13e9702640102ysho.ht ...

  2. 2017-2018-2 《网络对抗技术》 20155322 Exp3 免杀原理与实践

    #2017-2018-2 <网络对抗技术> 20155322 Exp3 免杀原理与实践 [-= 博客目录 =-] 1-实践目标 1.1-实践介绍 1.2-实践内容 1.3-实践要求 2-实 ...

  3. python基础学习1-日志信息

      #!/usr/bin/env python # -*- coding:utf-8 -*- 日志 import logging # 5个级别的日志 DEBUG INFO WARNING ERROR ...

  4. 【HNOI2013】数列

    题面 题解 设\(\{a_n\}\)为差分数组,可以得到柿子: \[ \begin{aligned} ans &= \sum_{a_1 = 1} ^ m \sum_{a_2 = 1} ^ m ...

  5. 洛咕 P4304 [TJOI2013]攻击装置

    把坐标按照(x+y)%2染色可以发现这是个二分图 二分图最大独立集=点数-最大匹配 于是就是个算匹配的傻逼题了 // luogu-judger-enable-o2 #include<bits/s ...

  6. idea maven javaweb项目迁移时的maven和版本报错问题解决(可解决同类错误)

    项目中代码红线报版本不支持xx语法,只需要将java版本设置为当前机器使用的java版本即可 这里我使用的是idea自带的maven,如果是自己安装的maven需要在 home directory 处 ...

  7. sqlyog 可视化查看数据库关系并创建外键

    + 一个架构设计器,把表拖进来即可查看数据库关系 如果要建立外键,需要在两个要被建立的外键之间进行操作(经过验证不需要都为主键),然后从用鼠标把子外键拖到父外键中,就可以关联上了. 参考: https ...

  8. css快速入门-引入方式

    一.概述 HTML是骨架.框架CSS是外表.衣服JS是动作.肌肉 css的主要作用是对元素进行渲染.1.找到要操作的标签(选择器)2.对定位的标签进行操作(属性) 二.CSS引入方式 1.行内式 &l ...

  9. python 实现字符串的切片功能

    '''string切片''' def string_split(stringone,split): m = [] if type(split)!=str: return False if split ...

  10. 频繁请求报requests异常的处理

    由于数据量的增大,调用接口的次数会增加. 当连续向目标网站发送多次request后,目标网站可能会认为是,恶意攻击. 于是会抛出requests异常. 测试代码: for i in range(200 ...