python:socket网络编程
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网络编程的更多相关文章
- Python Socket 网络编程
Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...
- Python Socket 网络编程 (客户端的编程)
Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...
- Python Socket网络编程详解
Socket 简介 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. s ...
- 25 python socket网络编程
一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务端为你提供视频 ...
- Python - Socket网络编程 - 第二十六天
网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法. 高 ...
- python——socket网络编程
一.OSI七层模型
- python socket网络编程之粘包问题详解
一,粘包问题详情 1,只有TCP有粘包现象,UDP永远不会粘包 你的程序实际上无权直接操作网卡的,你操作网卡都是通过操作系统给用户程序暴露出来的接口,那每次你的程序要给远程发数据时,其实是先把数据从用 ...
- 初学Python——Socket网络编程
认识socket socket本质上就是在2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实现数据的互相传递.我们知道网络 通信 都 是基于 ip+port(端口) 方能定位到目标的具体机 ...
- Python socket网络编程(通信介绍)
socket通信介绍 通信介绍(一) 1.所有网络协议的基础就是:socket 2.socket对TCP与UDP协议封装,让用户进行简单操作. 3.socket只做两件事:发 send,收 rec ...
- Python Socket 网络编程 (服务器端编程)
服务器端主要做以下工作: 打开 socket 绑定到特定的地址以及端口上 监听连接 建立连接 接收/发送数据 上面已经介绍了如何创建 socket 了,下面一步是绑定. 绑定 socket 函数 bi ...
随机推荐
- (三)Maven使用入门之Hello World
主要内容 编写POM 编写主代码 编写测试代码 打包和运行 到目前为止,已经大概了解并安装好了Maven,现在开始创建一个最简单的HelloWorld项目. 编写POM 就像Make的Makefile ...
- &,|,^的用法
&,|,~,^的用法 &按位与 |按位或 ~按位非 ^按位异或 举例: int x = 5; int y = 11; System.out.println(x|y); System.o ...
- .net core使用Ocelot+Identity Server统一网关验证
源码下载地址:下载 项目结构如下图: 在Identity Server授权中,实现IResourceOwnerPasswordValidator接口: public class IdentityVal ...
- 1.1 为什么要使用lambda 表达式
第1章 lambda 表达式 1.1 为什么要使用lambda 表达式 1.2 lambda 表达式的语法 1.3 函数式接口 1.4 方法引用 1.5 构造器引用 1.6 变量作用域 1.7 默认方 ...
- B20J_2733_[HNOI2012]永无乡_权值线段树合并
B20J_2733_[HNOI2012]永无乡_权值线段树合并 Description:n座岛,编号从1到n,每座岛都有自己的独一无二的重要度,按照重要度可以将这n座岛排名,名次用1到 n来表示.某些 ...
- Spark学习之Spark调优与调试(一)
一.使用SparkConf配置Spark 对 Spark 进行性能调优,通常就是修改 Spark 应用的运行时配置选项.Spark 中最主要的配置机制是通过 SparkConf 类对 Spark 进行 ...
- 学习攻略丨如何进阶为一名Web安全高手?
学习Web安全的小伙伴很多,但是能成为Web安全高手却很少,很多人都是从入门到放弃,是真的太难还是学习方法不对? 对于基础薄弱的人来说,一般都是从XSS.SQL注入等简单的漏洞研究入门的.除了了解各种 ...
- Akka实践一些总结
最近在一些服务中使用了akka,主要用来做异步解耦和本地消息分发(路由),这里简单总结一下用法. 与spring集成 网上有不少集成的例子,要使用到spring的扩展. 我这边没有这样处理,而是简单把 ...
- 从壹开始 [ Id4 ] 之一║ 授权服务器 IdentityServer4 开篇讲&计划书
前言 哈喽大家周四好!时间过的很快,现在已经是三月份了,我的 IdentityServer4 教程也拖了一定的时间了,正好最近有精力学新东西了,主要中间被小伙伴要求写一个管理后台,目前1.0已经上线( ...
- flutter初体验
flutter初体验 和flutter斗争了两个周末,基本弄清楚了这个玩意的布局和一些常用组件了. 在flutter里面,所有东西都是组件Widget.我们像拼接积木一样拼接Widget,拼接的关键词 ...