Socket

  网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket, 又称为“套接字”。

模块

 import socket

创建套接字

 socket.socket([family[, type[, proto]]])
  • family: 套接字家族可以使AF_UNIX或者AF_INET
  • type: 套接字类型可以根据是面向连接的还是非连接分为SOCK_STREAM(基于TCP)SOCK_DGRAM(基于UDP)
  • protocol: 一般不填默认为0.

常用函数

sk.bind(address)

  s.bind(address) 将套接字绑定到地址。address地址的格式取决于地址族。在AF_INET下,以元组(host,port)的形式表示地址。

sk.listen(backlog)

  开始监听传入连接。backlog指定在拒绝连接之前,可以挂起的最大连接数量。

backlog等于5,表示内核已经接到了连接请求,但服务器还没有调用accept进行处理的连接个数最大为5
      这个值不能无限大,因为要在内核中维护连接队列

sk.accept()

  接受连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。

  接收TCP 客户的连接(阻塞式)等待连接的到来

sk.connect(address)

  连接到address处的套接字。一般,address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。

sk.close()

  关闭套接字

sk.recv(bufsize[,flag])

  接受套接字的数据。数据以字符串形式返回,bufsize指定最多可以接收的数量。flag提供有关消息的其他信息,通常可以忽略。

sk.send(string[,flag])

  将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。即:可能未将指定内容全部发送。

单线程通信

  该实例中,只能 client 发一句, server回一句(先启动server,后启动client)

server

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: jyroy import socket if __name__ == '__main__':
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #ipv4, TCP
sock.bind(('0.0.0.0',5000)) #元组,相当于一个参数
sock.listen(10) #同时保持是十个人的连接
conn, addr = sock.accept()
while True:
data = conn.recv(1024) #最多1K的数据
print(data)
if data == 'bye':
break
else:
msg = raw_input(">>")
conn.send(msg)
sock.close()
print('Bye!!')

client

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: jyroy import socket, time if __name__ == '__main__':
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost',5000))
while True:
msg = raw_input(">>")
if msg == "bye":
sock.send(msg)
sock.close()
break
else:
sock.send(msg)
data = sock.recv(1024)

多线程通信

  在该实例中可以自由发送和接收信息(先启动server,后启动client)

  利用threading,多线程进行接受消息和发送消息

  callback_recv函数负责接受信息的功能
  callback_send函数负责发送信息的功能

server

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: jyroy import socket, threading, sys def callback_send(conn):
''' :param sq:
:return:
'''
while True: #为了维持持续的发送
msg = raw_input(">>")
conn.send(msg) def callback_recv(conn):
''' :param sock:
:return:
'''
while True: #为了维持持续的接收
data = conn.recv(1024)
print(data) if __name__ == '__main__':
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('0.0.0.0',5000)) #元组,相当于一个参数
sock.listen(10) #同时保持是十个人的连接
conn, addr = sock.accept() thread_send = threading.Thread(target=callback_send, args=(conn, ))
thread_recv = threading.Thread(target=callback_recv, args=(conn, )) thread_send.start()
thread_recv.start() sock.close()

client

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: jyroy import socket, time, threading, sys def callback_send(sock):
''' :param sq:
:return:
'''
while True:
msg = raw_input(">>")
sock.send(msg)
# if msg in ['bye', 'quit']:
# sock.close
# break def callback_recv(sock):
''' :param sock:
:return:
'''
while True:
data = sock.recv(1024)
print(data) if __name__ == '__main__':
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost',5000)) thread_send = threading.Thread(target=callback_send, args=(sock, ))
thread_recv = threading.Thread(target=callback_recv, args=(sock, )) thread_send.start()
thread_recv.start() while True:
pass
sock.close()

效果展示

注意

  一定要先server程序启动,只有server在等待client之后,client才能找到server进行通信。

  我这个只是本机的调试,要和别人通信时,把client程序中,把connect的ip地址,从localhost换成要通信的ip地址


关于python网络编程的其他资料

  菜鸟教程--http://www.runoob.com/python/python-socket.html

  python官方--https://docs.python.org/3/library/socket.html

python:socket网络编程的更多相关文章

  1. Python Socket 网络编程

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

  2. Python Socket 网络编程 (客户端的编程)

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

  3. Python Socket网络编程详解

    Socket 简介 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. s ...

  4. 25 python socket网络编程

    一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务端为你提供视频 ...

  5. Python - Socket网络编程 - 第二十六天

    网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法. 高 ...

  6. python——socket网络编程

    一.OSI七层模型

  7. python socket网络编程之粘包问题详解

    一,粘包问题详情 1,只有TCP有粘包现象,UDP永远不会粘包 你的程序实际上无权直接操作网卡的,你操作网卡都是通过操作系统给用户程序暴露出来的接口,那每次你的程序要给远程发数据时,其实是先把数据从用 ...

  8. 初学Python——Socket网络编程

    认识socket socket本质上就是在2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实现数据的互相传递.我们知道网络 通信 都 是基于 ip+port(端口) 方能定位到目标的具体机 ...

  9. Python socket网络编程(通信介绍)

      socket通信介绍 通信介绍(一) 1.所有网络协议的基础就是:socket 2.socket对TCP与UDP协议封装,让用户进行简单操作. 3.socket只做两件事:发 send,收 rec ...

  10. Python Socket 网络编程 (服务器端编程)

    服务器端主要做以下工作: 打开 socket 绑定到特定的地址以及端口上 监听连接 建立连接 接收/发送数据 上面已经介绍了如何创建 socket 了,下面一步是绑定. 绑定 socket 函数 bi ...

随机推荐

  1. vs插件-基于TFS的源码记录可视化

    插件地址:https://marketplace.visualstudio.com/items?itemName=AlexandrBiryukov.TFSSourceControlHistoryVis ...

  2. matplotlib解决中文乱码

    调试以前写的matplotlib相关脚本,中文呈方块样:重新解决一遍,感觉比以前的理解更进一步,故而记下一笔: 1. 首先要为matplotlib添加中文字体库: 系统字体库在/usr/share/f ...

  3. 服务网关基于RPC的用法

    企业为了保护内部系统的安全性,内网与外网都是隔离的,企业的服务应用都是运行在内网环境中,为了安全的考量,一般都不允许外部直接访问.API网关部署在防火墙外面,起到一层挡板作用,内部系统只接受API网关 ...

  4. TensorFlow实现分布式计算

    摘要: 1.代码例子 内容: 1.代码例子 <TensorFlow实战>实现CNN处理CIFAR10数据,并模拟单机多个CPU同步数据并行计算 <TensorFlow实战>实现 ...

  5. 理解图像分割中的卷积(Understand Convolution for Semantic Segmentation)

    以最佳的101 layer的ResNet-DUC为基础,添加HDC,实验探究了几种变体: 无扩张卷积(no dilation):对于所有包含扩张卷积,设置r=1r=1 扩张卷积(dilation Co ...

  6. 系统的讲解 - SSO单点登录

    目录 概念 好处 技术实现 小结 扩展 概念 SSO 英文全称 Single Sign On,单点登录. 在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统. 比如:淘宝网(www.t ...

  7. OpenResty 在又拍云容器平台中的应用

    大家好,我是又拍云叶靖,今天主要分享 OpenResty 在又拍云容器平台中的应用.目前又拍云有很多产品,其中很多都使用了 OpenResty 技术,比如又拍云的 CDN .网关都是基于 OpenRe ...

  8. ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法

    一.前言 在非静态页面的项目开发中,必定会涉及到对于数据库的访问,最开始呢,我们使用 Ado.Net,通过编写 SQL 帮助类帮我们实现对于数据库的快速访问,后来,ORM(Object Relatio ...

  9. Python-定时爬取指定城市天气(一)-发送给关心的微信好友

    一.背景 上班的日子总是3点一线,家里,公司和上班的路径,对于一个特别懒得我来说,经常遇到上班路上下雨了,而我却没带伞,多么痛的领悟.最近对python有一种狂热的学习热情,写了4年多的C++代码,对 ...

  10. 设计模式之适配者模式——Java语言描述 | Amos H's blog

    适配器模式是作为两个不兼容的接口之间的桥梁.这种类型的设计模糊属于结构性模式,它结合了两个独立接口的功能 概念阐述 使用适配器模式可以解决在软件系统中,将一些旧的类放入新环境中,但是新环境要求的接口旧 ...