socket模块

serSocket.setblocking(False) 设置为非阻塞;

#coding=utf-8
from socket import *
import time # 用来存储所有的新链接的socket
g_socketList = [] def main():
serSocket = socket(AF_INET, SOCK_STREAM)
serSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR , 1)
localAddr = ('', 7788)
serSocket.bind(localAddr)
#可以适当修改listen中的值来看看不同的现象
serSocket.listen(1000)
#将套接字设置为非堵塞
#设置为非堵塞后,如果accept时,恰巧没有客户端connect,那么accept会
#产生一个异常,所以需要try来进行处理
serSocket.setblocking(False) while True: #用来测试
#time.sleep(0.5) try:
newClientInfo = serSocket.accept()
except Exception as result:
pass
else:
print("一个新的客户端到来:%s"%str(newClientInfo))
newClientInfo[0].setblocking(False)
g_socketList.append(newClientInfo) # 用来存储需要删除的客户端信息
needDelClientInfoList = [] for clientSocket,clientAddr in g_socketList:
try:
recvData = clientSocket.recv(1024)
if len(recvData)>0:
print('recv[%s]:%s'%(str(clientAddr), recvData))
else:
print('[%s]客户端已经关闭'%str(clientAddr))
clientSocket.close()
g_needDelClientInfoList.append((clientSocket,clientAddr))
except Exception as result:
pass for needDelClientInfo in needDelClientInfoList:
g_socketList.remove(needDelClientInfo) if __name__ == '__main__':
main()

socket.socket().setblocking(False)

#coding=utf-8
from socket import *
import random
import time serverIp = raw_input("请输入服务器的ip:")
connNum = raw_input("请输入要链接服务器的次数(例如1000):")
g_socketList = []
for i in range(int(connNum)):
s = socket(AF_INET, SOCK_STREAM)
s.connect((serverIp, 7788))
g_socketList.append(s)
print(i) while True:
for s in g_socketList:
s.send(str(random.randint(0,100))) # 用来测试用
#time.sleep(1)

非阻塞TCP套接字测试代码对应测试客户端

socket.socket().listen([int<num>])

表示可以同时建立完成的TCP连接数:

服务端代码示例:listen(5) 最多同时建立5个连接,超过5个的部分等待之前建立的断开...

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# @Time: 2020/7/4 12:52
# @Author:zhangmingda
# @File: socket_tcp_study.py
# @Software: PyCharm
# Description:socket 服务端 from socket import *
import time # 创建TCP socket
tcpSocket = socket(AF_INET,SOCK_STREAM) # 绑定本地地址信息
address = ('',7788)
tcpSocket.bind(address) connNum = int(input("请输入listen()的最大连接数:")) # 使用listen监听端口
tcpSocket.listen(connNum) if __name__ == '__main__':
while True:
# 接收新的客户端来连接服务器
newSocket, clientAddr = tcpSocket.accept()
print(clientAddr)
time.sleep(1)

客户端:同时发起30个连接建立请求,同时只能建立5个;代码示例如下

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# @Time: 2020/7/4 12:59
# @Author:zhangmingda
# @File: socket_tcp_study_client.py
# @Software: PyCharm
# Description: from socket import * connNum = int(input("请输入要连接服务器的并发数:")) serverAddr = ('127.0.0.1',7788)
for i in range(connNum):
s = socket(AF_INET,SOCK_STREAM)
s.connect(serverAddr)
print(i)

输出效果如下:左图(客户端)   ;右图(服务端)

socket  UDP 发送广播

发送广播设置:setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# @Time: 2020/7/4 14:42
# @Author:zhangmingda
# @File: socket_udp_广播.py
# @Software: PyCharm
# Description: import socket
import sys dest_addr = ('<broadcast>', 7788) #创建UDP套接字
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 设置套接字可以发送广播数据
s.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1) # 向网络中所有地址发送广播数据
s.sendto("hi".encode('utf-8'),dest_addr) print("等待对方回复(ctrl + C 退出)") while True:
data, address = s.recvfrom(2048)
print("Received from %s: %s" % (address,data))

示例UDP客户端聊天小程序

说明:用到了多线程threading.Thread socket

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# @Time: 2020/7/3 18:58
# @Author:zhangmingda
# @File: upd聊天模拟客户端.py
# @Software: PyCharm
# Description:使用UDP协议模拟消息收发 # 功能:
# 1、收数据
# 2、同时可以发数据 import socket
from threading import Thread class ChatClient(object):
"""作为一个对象来实现"""
def __init__(self,loccal_port,server_ip,server_port):
"""初始化一个UDP的socket实例 AF_INET 表示网络用IPV4协议 SOCK_DGRAM 表示传输层使用UDP协议 """
self.udpSocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
self.udpSocket.bind(('',loccal_port))
self.serverIP = server_ip
self.serverPort = server_port
pass
def sendData(self):
"""发数据用方法"""
while True:
send_str = input("<<:")
self.udpSocket.sendto(send_str.encode("gb2312"),(self.serverIP,self.serverPort))
pass
def recvData(self):
"""收数据"""
while True:
recvData,serverAddress = self.udpSocket.recvfrom(1024)
print("\r >>:%s :%s\n<<:" %(str(serverAddress), recvData.decode('gb2312')),end='')
pass def main():
localPort = int(input("输入本地端口号:"))
server_ip = input("服务器IP:")
server_port = int(input("服务器端口:")) # 初始化一个UDPsocket实例
chatclient = ChatClient(localPort,server_ip=server_ip,server_port=server_port) send_thread = Thread(target=chatclient.sendData)
recv_thread = Thread(target=chatclient.recvData) send_thread.start()
recv_thread.start() send_thread.join()
recv_thread.join() if __name__ == '__main__':
main()

效果输出

服务端使用“网络调试助手.exe”在windows下模拟

-----------------------------

socketserver并发处理服务端

http://www.cnblogs.com/alex3714/articles/5830365.html

#!/usr/bin/env python
# Author:Zhangmingda
import socketserver
class Mytcphandler(socketserver.BaseRequestHandler):
'''
定义一个socketserver的handler处理类,必须继承socketserver.BaseRequestHandler
'''
def handle(self):
'''所有的与单个客户端的交互都在此方法'''
print('定义自己的socketserver.子handler类hander方法')
while True:
try:
print('客户端IP:{}端口:{}'.format(self.client_address[0], self.client_address[1]))
print('等待接收数据...')
self.data = self.request.recv(1024)
print('收到数据:',self.data.decode())
self.request.sendall(self.data.decode().upper().encode())
except ConnectionResetError as e:
print('连接出现错误/客户端已断开:%s'% e)
break
if __name__ == "__main__":
HOST,PORT = 'localhost',6969
print('开启服务,监听端口')
server = socketserver.ForkingTCPServer((HOST,PORT),Mytcphandler) #多进程并发
# server = socketserver.ThreadingTCPServer((HOST,PORT),Mytcphandler)#多线程并发
server.serve_forever()

socket客户端

#!/usr/bin/env python
# Author:Zhangmingda #!/usr/bin/env python
# Author:Zhangmingda
import socket
print('创建客户端实例')
client = socket.socket()
print('开始连接服务器')
client.connect(('localhost',6969))
while True:
msg = input('>>>输入要发送的命令:')
print('开始发送数据')
client.send(msg.encode('utf-8')) #发送汉子,必须encode()成bytes类型数据进行传输
if msg == '断开':
print('关闭数据连接')
client.close()
break
print('开始接受数据')
recv_data = client.recv(1024)
print('返回数据:',recv_data.decode())

socket模块实现基于UDP聊天模拟程序;socketserver模块实现服务端 socket客户端代码示例的更多相关文章

  1. 基于Select模型的Windows TCP服务端和客户端程序示例

    最近跟着刘远东老师的<C++百万并发网络通信引擎架构与实现(服务端.客户端.跨平台)>,Bilibili视频地址为C++百万并发网络通信引擎架构与实现(服务端.客户端.跨平台),重新复习下 ...

  2. 基于java NIO 的服务端与客户端代码

    在对java NIO  selector 与 Buffer Channel  有一定的了解之后,我们进行编写java nio 实现的 客户端与服务端例子: 服务端: public class NIOC ...

  3. C#基于用户和角色的验证,服务端web 客户端wpf

    应用程序服务 <?xml version="1.0"?> <!--  For more information on how to configure your ...

  4. tcp上传大文件举例、udp实现qq聊天、socketserver模块实现并发

    为什么会出现粘包现象(day31提到过,这里再举个例子) """首先只有在TCP协议中才会出现粘包现象,因为TCP协议是流式协议它的特点是将数据量小并且时间间隔比较短的数 ...

  5. udp协议和socketserver模块

    #基于udp协议通讯的套接字# 数据报协议# 一个recvfrom对应一个sendto 一一对应 无粘包产生 # 服务端:# import socket# server=socket.socket(s ...

  6. 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

    Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...

  7. socket创建UDP服务端和客户端

    UDP服务端代码示例: from socket import * #1.创建数据报套接字 sockfd = socket(AF_INET, SOCK_DGRAM) #2.绑定服务端地 sockfd.b ...

  8. Java多线程技术:实现多用户服务端Socket通信

    目录 前言回顾 一.多用户服务器 二.使用线程池实现服务端多线程 1.单线程版本 2.多线程版本 三.多用户与服务端通信演示 四.多用户服务器完整代码 最后 前言回顾 在上一篇<Java多线程实 ...

  9. 【转】TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端)、UDP客户端

    [转]TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端).UDP客户端 目录 说明 TCP/UDP通信主要结构 管理多个Socket的解决方案 框架中TCP部分的使用 框架中UDP ...

随机推荐

  1. 从零开始学Kotlin第三课

    kotlin函数和函数式表达式的简化写法: fun main(args:Array<String>) { var result=add(2,5) println(result) ///简化 ...

  2. 洛谷 P5643 - [PKUWC2018]随机游走(Min-Max 容斥+FWT+树上高斯消元,hot tea)

    题面传送门 一道挺综合的 hot tea,放到 PKUWC 的 D2T2 还挺喜闻乐见的( 首先我们考虑怎样对一个固定的集合 \(S\) 计算答案,注意到我们要求的是一个形如 \(E(\max(S)) ...

  3. mVISTA 多序列比对叶绿体基因组

    mVISTA可对2个或者多个DNA序列进行比较,可以对比对结果进行可视化. 详情请大力戳这里 0 输入文件说明 mVISTA 需要输入的文件有如下几类 必须文件 邮箱 fasta格式序列文件(或者GE ...

  4. 蛋白质组DIA深度学习之谱图预测

    目录 1. 简介 2. 近几年发表的主要工具 1.DeepRT 2.Prosit 3. DIANN 4.DeepDIA 1. 简介 基于串联质谱的蛋白质组学大部分是依赖于数据库(database se ...

  5. 毕业设计之zabbix之nginx状态监控

    监控脚本: [root@webone.quan.bbs ~]$vim /usr/local/zabbix/script/ngx_status.sh #!/bin/bash##************* ...

  6. 百页 PPT BPF 技术全览 - 深入浅出 BPF 技术

    eBPF 从创建开始,短短数年(7年),至今就已经被认为是过去 50 年来操作系统最大的变更,那么 eBPF 技术到底给我们带来了什么样的超能力,以至于得到如此高的评价? 本文从以下内容入手,对 eB ...

  7. 工作学习1-tcp自连接

    运维同事反馈服务起不来.下面为了方便,写了一个demo来展示. https://gitee.com/northeast_coder/code/tree/master/case/case1_tcp_se ...

  8. 网易云信 集成UI库登录dologin没有回调

    感谢github上的两位大佬指出问题的解决方法. 解决方法: 在进行ui初始化要在主进程中进行,初始化前进行主进程判断. 若还收不到回调,可尝试将uikit中的base包去掉而在build.gradl ...

  9. Flink(八)【Flink的窗口机制】

    目录 Flink的窗口机制 1.窗口概述 2.窗口分类 基于时间的窗口 滚动窗口(Tumbling Windows) 滑动窗口(Sliding Windows) 会话窗口(Session Window ...

  10. 零基础学习java------day17------缓冲字节流,转换字节流,简化流,缓冲字符流,序列化和对象流

    1. 缓冲字节流 缓冲区:缓冲区实质上是一个数组.通常它是一个字节数组,但是也可以使用其他种类的数组.但是一个缓冲区不 仅仅 是一个数组.缓冲区提供了对数据的结构化访问,而且还可以跟踪系统的读/写进程 ...