TCP服务端(以字节串传输信息)

import socket

1、创建套接字

  sockfd = socket.socket(socket_family = AF_INET,socket_type = SOCK_STREAM,proto = 0)

功能:创建一个IPv4的流式套接字,括号中的创建IPv4流式套接字的时候可以不写,有缺省值。

参数:socket_family  地址族类型  AF_INET 表示IPv4网络通信

    socket_type  套接字类型  SOCK_STREAM 流式  SOCK_DGRAM  数据报

    proto     通常为0(选择子协议)

返回值:返回一个套接字对象

2、绑定IP端口

  sockfd.bind(("IP地址",端口号))

  功能:绑定IP地址和端口号

  参数:二元元组

3、将套接字设置为可监听

  sockfd.listen(n)

  功能:将套接字设置为监听套接字,并创建监听队列(只有是监听套接字,才可以连接客户端)

  参数:监听对象的大小  n为大于0的正整数

  一个监听套接字可以连接多个客户端

4、等待客户端的连接

  connfd,addr = sockfd.accept()

  功能:阻塞等待客户端连接,返回客户端的套接字和地址元组

  返回值:connfd  一个新的套接字,用于和客户端通信

      addr  连接的客户端的地址(元组)(ip,port)

  阻塞函数:当程序运行到阻塞函数位置,如果某种预期条件没有达成则暂停继续运行,直到条件达成在继续运行

5、消息接收和发送

  data = connfd.recv(buffersize)

  data为connfd套接字接收到的消息,以字节方式进行传输

  n = connfd.send(b'adsfafef')

  n为发送的字节数

  功能:发送消息

  参数buffersize:每次最多接收的消息大小  bytes

  connfd.sent(b'hello woeld')返回值是发送的字节数

6、关闭套接字

  close()

  功能:关闭套接字,tcp连接断开

  telnet ip port  表示连接tcp服务端

import socket

sockfd = socket.socket(socket.AF_INET, socket.SOCK_STREAM)      # 创建tcp套接字
sockfd.bind(('0.0.0.0', 8888)) # 绑定地址
sockfd.listen(5) # 设置监听 print("Waiting for connect...") # 阻塞等待处理连接
connfd, addr = sockfd.accept() # 等待客户端连接
print("Connect from", addr) # 打印链接的客户端地址 data = connfd.recv(1024) # 接收消息
print("收到:", data)
n = connfd.send(b'over') # 发送字节串
print("发送%d字节" % n) #  关闭套接字
connfd.close()
sockfd.close()

TCP客户端(以字节串传输信息)

1.创建套接字
  socket()
  * 通信的两端套接字类型相同

2. 发起连接
  sockfd.connect(("IP地址",端口号))
  功能 : 发起连接请求
  参数 : 元组,服务器端的地址

3.发收消息
  sockfd.send(字节串内容)

  sockfd.recv()    # 接收到的是字节串内容
  * 两端收发需要配合

4.关闭套接字
  close()

from socket import *

sockfd = socket()                       # 创建套接字,TCP协议不用填写缺省值
sockfd.connect(("176.122.1.61",8888)) # 发起请求连接IP地址176.122.1.61,端口8888的主机
data = input("发送:") # 输入要发送的信息
sockfd.send(data.encode()) # 发送字节串内容
d = sockfd.recv(1024).decode() # 接收到的是字节串内容
print("接收到:", d)
sockfd.close() 

UDP服务器

UDP是无连接的, 不用accetp和listen

1、创建套接字----》数据报套接字

  sockfd = socket(AF_INET,SOCK_DGRAM)

2、绑定服务端地址

  sockfd.bind()

3、消息的收发

  data,addr = sockfd.recvfrom(buffersize)

    功能:接收udp消息

    参数:每次最多接受消息大小

    返回值:data  接收到的消息  addr  消息发送者的地址(IP号和端口号)

  sockfd.sendto(data,addr)

    功能:udp发送消息

    参数:data要发送的消息  bytes

      addr 客户端地址(地址包括IP和端口号)

    返回值:发送的字节

  每次接收一个报文,如果没有接收完全则丢弃没有收到的内容

4、关闭套接字

  sockfd.close()

""" UDP 套接字服务端"""
from socket import * sockfd = socket(AF_INET, SOCK_DGRAM) # 创建套接字
sockfd.bind(('127.0.0.1', 8888)) # 绑定地址 # 收发消息
while True:
data, addr = sockfd.recvfrom(1024)
print("收到的消息:", data.decode())
sockfd.sendto(b'Receive', addr) sockfd.close() # 关闭套接字

UDP客户端

1、创建套接字

  sockfd = socket(AF_INET,SOCK_DGRAN)

2、消息收发

  收:data,addr = sockfd.recvfrom(buffersize)

  发:sockfd.sendto(data,addr)

    data,addr = sockfd.recvfrom(1024)

    sockfd.sendto(data.encode(), ("192.168.191.3",8888))

3、关闭套接字

  sockfd.close()

from  socket import *
import sys # 命令行输入服务器地址
if len(sys.argv) < 3:
print('''
argv is error !!
请在终端输入
python3 udp_client.py 127.0.0.1 8888
''')
raise HOST = sys.argv[1]
PORT = int(sys.argv[2])
ADDR = (HOST,PORT) sockfd = socket(AF_INET,SOCK_DGRAM) # 创建套接字 while True:
data = input("消息:")
if not data: # 如果收到空消息则退出
break
sockfd.sendto(data.encode(),ADDR)
data,addr = sockfd.recvfrom(1024)
print("从服务端收到:",data.decode()) sockfd.close()

补充:  sys.argv

  功能:获取来自命令行的参数,形成一个列表

  以空格作为每一项分隔,如果一项中有空格则用引号表示一个整体

  命令行内容作为字符串传入

TCP流式套接字和UDP数据报套接字区别

  1、流式套接字采用字节流的方式传输数据,而数据报套接字以数据报形式传输

  2、TCP会产生粘包现象,UDP消息是有边界的不会粘包

  3、TCP传输是建立在连接的基础上,保证传输的可靠性,而UDP一次接收一个数据报保证完整

  4、TCP需要依赖listen、accept建立连接,UDP不用

  5、TCP收发消息使用recv、send、sendall。UDP使用recvfrom、sendto

UDP应用之广播

一点发送多点接收

目标地址:广播地址,每个网段类最大的地址

    172.60.50.255 ----》<broadcast>

广播接收

from socket import *
s = socket(AF_INET,SOCK_DGRAM) # 创建一个数据报套接字
s.setsockopt(SOL_SOCKET,SO_BROADCAST,1) # 设置为可以接收广播
s.bind(('0.0.0.0',9999)) # 绑定IP地址
while True:
try:
msg,addr = s.recvfrom(1024)
print("从{}获取信息:{}".format(addr,msg.decode()))
except KeyboardInterrupt:
print("接收消息结束")
break
except Exception as e:
print(e)
s.close()

广播发送

from socket import *
from time import sleep
dest = ('192.168.191.3',9999)# 设置广播地址
s = socket(AF_INET,SOCK_DGRAM) # 创建一个数据报套接字
s.setsockopt(SOL_SOCKET,SO_BROADCAST,1) #设置套接字可以发送接受广播
while True:
sleep(1)
s.sendto("我叫凌逆战!".encode(),dest)
s.close()

ptthon 网络编程的更多相关文章

  1. 猫哥网络编程系列:HTTP PEM 万能调试法

    注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...

  2. python select网络编程详细介绍

    刚看了反应堆模式的原理,特意复习了socket编程,本文主要介绍python的基本socket使用和select使用,主要用于了解socket通信过程 一.socket模块 socket - Low- ...

  3. Linux Socket 网络编程

    Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...

  4. 猫哥网络编程系列:详解 BAT 面试题

    从产品上线前的接口开发和调试,到上线后的 bug 定位.性能优化,网络编程知识贯穿着一个互联网产品的整个生命周期.不论你是前后端的开发岗位,还是 SQA.运维等其他技术岗位,掌握网络编程知识均是岗位的 ...

  5. 浅谈C#网络编程(一)

    阅读目录: 基础 Socket编程 多线程并发 阻塞式同步IO 基础 在现今软件开发中,网络编程是非常重要的一部分,本文简要介绍下网络编程的概念和实践. Socket是一种网络编程接口,它是对传输层T ...

  6. C++11网络编程

    Handy是一个简洁优雅的C++11网络库,适用于linux与Mac平台.十行代码即可完成一个完整的网络服务器. 下面是echo服务器的代码: #include <handy/handy.h&g ...

  7. Java - 网络编程

    Java的网络编程学习,关于计算机基础的学习参考:计算机网络基础学习 - sqh.     参考:  

  8. Linux网络编程-IO复用技术

    IO复用是Linux中的IO模型之一,IO复用就是进程预先告诉内核需要监视的IO条件,使得内核一旦发现进程指定的一个或多个IO条件就绪,就通过进程进程处理,从而不会在单个IO上阻塞了.Linux中,提 ...

  9. Python Socket 网络编程

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...

随机推荐

  1. shell脚本监控Linux系统性能指标

    2016-11-04 22:41 原作者不详 分类: Linux(7) 在服务器运维过程中,经常需要对服务器的各种资源进行监控, 例如:CPU的负载监控,磁盘的使用率监控,进程数目监控等等,以在系统出 ...

  2. 【Nature 子刊】I型HLA基因中和癌症相关的体细胞突变--转载

    肿瘤的发生与免疫系统的功能密切相关.在免疫系统中,MHC(主要组织相容性复体,majorhistocompatibilitycomplex)是所有生物相容复合体抗原的一种统称.HLA(humanleu ...

  3. c++ 反转容器的元素顺序(reverse)

    #include <vector> #include <iostream> #include <iterator> #include <algorithm&g ...

  4. Qt5发布错误01

    1.Qt5+VS2013兼容XP方法 (http://www.qtcn.org/bbs/apps.php?q=diary&a=detail&did=2047&uid=15538 ...

  5. [原][osgearth]earth文件加载道路一初步看见模型道路

    时间是2017年2月5日17:16:32 由于OE2.9还没有发布,但是我又急于使用OE的道路. 所以,我先编译了正在github上调试中的OE2.9 github网址是:https://github ...

  6. flutter 安装详细教程

    Flutter 是 Google 用以帮助开发者在 iOS 和 Android 两个平台开发高质量原生 UI 的移动 SDK.Flutter 兼容现有的代码,免费且开源,在全球开发者中广泛被使用. 安 ...

  7. 何时使用MQ ?

    何时使用MQmq作为一种基础中间件在互联网项目中有着大量的使用. 一种技术的产生自然是为了解决某种需求,通常来说是以下场景: 需要跨进程通信:B系统需要A系统的输出作为输入参数.当A系统的输出能力远远 ...

  8. org.springframework.transaction 包改成 spring-tx

    org.springframework.transaction 包改成 spring-tx org.springframework.transaction  3.2.2以后的版本,全改到 spring ...

  9. 第10章 Pry, 强大的pry-rails和相关的几个好用gem

    https://asciinema.org/a/0KtCL9HB1bP08wNHLfIeOMa8K 本章讲了如何定位❌,和排除bug. Pry  (5000

  10. UVA-140 Bandwidth (回溯+剪枝)

    题目大意:求一个使带宽最小的排列和最小带宽.带宽是指一个字母到其相邻字母的距离最大值. 题目分析:在递归生成全排列的过程中剪枝,剪枝方案还是两个.一.当前解不如最优解优时,减去:二.预测的理想解不必最 ...