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. [USACO07MAR]Face The Right Way G

    发现选定一个长度后,怎么翻转是固定的. 那我们直接选定一个长度去操作就行. 优化操作过程 类似于堆里打持久化标记一样的感觉. [USACO07MAR]Face The Right Way G // P ...

  2. CF1540B Tree Array

    先写一下自己想到的部分: 考虑枚举一个根. 计算一个点对出现的概率. 对于我这种期望概率基本不会的人,差点就把这题切了. 自己想到的部分都没有假. 问题在于: 如何计算一个点对出现的概率. 考虑和这两 ...

  3. Atcoder Regular Contest 058 D - 文字列大好きいろはちゃん / Iroha Loves Strings(单调栈+Z 函数)

    洛谷题面传送门 & Atcoder 题面传送门 神仙题. mol 一发现场(bushi)独立切掉此题的 ycx %%%%%%% 首先咱们可以想到一个非常 naive 的 DP,\(dp_{i, ...

  4. Atcoder M-SOLUTIONS Programming Contest C - Best-of-(2n-1)(无穷级数求和+组合恒等式)

    Atcoder 题面传送门 & 洛谷题面传送门 无穷级数求和的简单题,稍微写写吧,正好也算帮我回忆下组合数这一块的内容. 首先我们不妨假设 A 赢,B 赢的情况就直接镜像一下即可.我们枚举 B ...

  5. R语言与医学统计图形-【20】ggplot2图例

    ggplot2绘图系统--图例:guide函数.标度函数.overrides.aes参数 图例调整函数guide_legend也属于标度函数,但不能单独作为对象使用,即不能如p+guide_legen ...

  6. ubuntu常见错误--Could not get lock /var/lib/dpkg/lock

    ubuntu常见错误--Could not get lock /var/lib/dpkg/lock   通过终端安装程序sudo apt-get install xxx时出错:   E: Could ...

  7. gcc 的编译流程 和gdb的调试方法

    GCC的编译流程分为四个步骤: 预处理(Pre-Processing) 编译(Compiling) 汇编(Assembling) 链接(Linking) 可以看的出来文件大小 gdb 调试 gdb - ...

  8. python函数初体验

    函数 函数参数w 形式参数>>>>(被指定具体的值)默认参数, 实际参数是调用时候的实际指定参数 我们把函数⾥⾯的参数叫形式函数,函数实际调⽤的时候,赋予的参数叫实际函数 定义 ...

  9. typora 图床配置方法

    学习计算机的同学,在日常学习中难免会记笔记,写文档.相信大家记笔记大部分使用的都是 Markdown 吧,如果到现在还没接触,那我强烈建议你去学习一下,大概几分钟就可以搞定它. 注:下文用到的所有软件 ...

  10. 第二个基础框架 — spring — xml版,没用注解 — 更新完毕

    1.什么是spring? 老规矩:百度百科一手 这上面说得太多了,我来提炼一下: spring就是一个轻量级的控制反转( IOC ) 和 面向切面编程( AOP ) 的容量框架.总的来说:本质就是对j ...