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. SQL2008全部数据导出导入两种方法

    方法一:生成脚本导出导入sql2008全部数据第一步,右键要导出的数据库,任务--生成脚本 第二步,在设置脚本编写选项处,点击--高级(A),选择要编写脚本的数据的类型为:架构和数据 如果找不到 要编 ...

  2. lookup.go

    {             continue         }         addr := net.JoinHostPort(lp.Info.BroadcastAddress, strconv. ...

  3. BZOJ_1705_[Usaco2007 Nov]Telephone Wire 架设电话线_DP

    BZOJ_1705_[Usaco2007 Nov]Telephone Wire 架设电话线_DP Description 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务 于是 ...

  4. maven+springmvc的配置

    1. 首先创建1个mavenweb项目  如果没有的话最好是去官网下载一个最新版本的eclipse  里面什么都有 maven/gradle 啥的 2. 选择路径   没啥影响 就是一个路径 默认就行 ...

  5. 使用ASIFormDataRequest完成用户的登录操作

    ASIFormDataRequest是用于向表单post数据或get数据,可以用于用户向服务器端发送请求完成登录注册,上传下载数据的操作. 之前写过一篇文章是介绍使用ios内置的功能完成登录操作(NS ...

  6. SSH通过SSH代理连接到内网机器

    要解决的问题? 需要解决的问题:https://q.cnblogs.com/q/105319/ 简单来说就是本地机器通过一台公网机器SSH到公网机器后面的私网机器. 网络环境如下图:本地机器可访问代理 ...

  7. 深入浅出Git教程(转载)

    目录 一.版本控制概要 1.1.什么是版本控制 1.2.常用术语 1.3.常见的版本控制器 1.4.版本控制分类 1.4.1.本地版本控制 1.4.2.集中版本控制 1.4.3.分布式版本控制 1.5 ...

  8. 链表底层实现Java的Map(上)

    链表实现Map public class LinkListMap<K,V> implements Map<K,V> { private class Node { public ...

  9. Access2007数据库下载地址与AccessHelper

    链接:https://pan.baidu.com/s/1pLzOlTv0nqSbhzujHZht1w 提取码:1m9l AccessHelper: using System; using System ...

  10. “崩溃了?不可能,我全 Catch 住了” | Java 异常处理

    前言 今天我们来讨论一下,程序中的错误处理. 在任何一个稳定的程序中,都会有大量的代码在处理错误,有一些业务错误,我们可以通过主动检查判断来规避,可对于一些不能主动判断的错误,例如 RuntimeEx ...