首页 > 系统相关 >使用epoll实现单进程、单线程非阻塞Tcp服务端

使用epoll实现单进程、单线程非阻塞Tcp服务端

时间:2022-11-28 21:26:25浏览次数:36  
标签:socket epoll 单线程 Tcp event fd tcp recv response

import re
import socket
import select

def recv_msg(tcp_socket, recv_data):
requests = recv_data.splitlines()
print(requests)
file_name = ""
ret = re.match(r"[/]+(/[ ]*)", requests[0])
if ret:
file_name = ret.group(1)
if file_name == "/":
file_name = "templates/index.html"
try:
f = open('report' + file_name, 'rb')
except:
response = "HTTP/1.1 404 Not FOUND\r\n"
response += "\r\n"
response += "

Not found

"
tcp_socket.send(response.encode('utf-8'))
else:
html_content = f.read()
f.close()
response_body = html_content
response_header = "HTTP/1.1 200 OK\r\n"
response_header += "Content-Length: %d\r\n" % len(response_body)
response_header += "\r\n"
response = response_header.encode('utf-8') + response_body
tcp_socket.send(response)

def main():
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = "127.0.0.1"
port = 8081
tcp_socket.bind((host, port))
tcp_socket.listen(128)
tcp_socket.setblocking(False)
epl = select.epoll()
epl.register(tcp_socket.fileno(), select.EPOLLIN)
fd_event_dict = dict()
while True:
fd_event_list = epl.poll()
for fd, event in fd_event_list:
if fd == tcp_socket.fileno():
new_client_socket, client_addr = tcp_socket.accept()
epl.register(new_client_socket.fileno(), select.EPOLLIN)
fd_event_dict[new_client_socket.fileno()] = new_client_socket
elif event == select.EPOLLIN:
recv_data = fd_event_dict[fd].recv(1024).decode('utf-8')
if recv_data:
recv_msg(fd_event_dict[fd], recv_data)
else:
fd_event_dict[fd].close()
epl.unregister(fd)
del fd_event_dict[fd]

if name == 'main':
main()

标签:socket,epoll,单线程,Tcp,event,fd,tcp,recv,response
From: https://www.cnblogs.com/saiya6/p/16933639.html

相关文章

  • TCPdemo2
    packageday1;importjdk.internal.util.xml.impl.Input;importorg.junit.Test;importjava.io.*;importjava.net.ServerSocket;importjava.net.Socket;publiccl......
  • TCP/IP协议——计算机网络基础
    TCP/IP协议核心主旨计算机之间是如何有效地进行连接和沟通,就是由于网络协议来定义和发送的。网络基本模型A机器协议B机器应用层HTTP/FTP应用层传输层T......
  • tcp连接
    服务器端packagemainimport( "fmt" "net" "strings")funcHandleConnect(connnet.Conn){ deferconn.Close() addr:=conn.RemoteAddr() fmt.Println(a......
  • c#实现本机Tcp通信
    创建服务端privatevoidStartServer(){try{//SettheTcpListeneronport13000.Int32po......
  • tcpdump一个命令的剖析
     简单介绍:用简单的话来定义tcpdump,就是:dumpthetrafficonanetwork,根据使用者的定义对网络上的数据包进行截获的包分析工具。tcpdump可以将网络中传送的数据包的“头”......
  • TCP/UDP的连接与关闭详解
    https://blog.csdn.net/pupoqian3720/article/details/81290011传输层:总体作用:在广域网中建立数据传输通道,进行数据传输,负责端到端的通信那么是什么是端到端呢?A:两个方......
  • #盲盒+码#【FFH】学习设备开发之Hi3861-TCPclient-开关灯
    (目录)【本文正在参加「盲盒」+码有奖征文活动】:https://ost.51cto.com/posts/19288一、前言学习OpenHarmony南向设备开发中的网络通信,它可以将底层开发板获得的数据传......
  • 如何解决调试Modbus TCP用到的路由器总是会自动中断wifi连接?设置优先使用无线网络的
    家里有2个路由器,设置参数完全一样,相互替换就能上网。现在的问题是:wifi在使用过程中,用另个空闲的路由器连接1个Server网关、1个Client网关和笔记本电脑进行调试(注意这3个网......
  • unix网络编程2.4——高并发服务器(四)epoll基础篇
    目录前置文章unix网络编程1.1——TCP协议详解(一)unix网络编程2.1——高并发服务器(一)基础——io与文件描述符、socket编程与单进程服务端客户端实现unix网络编程2.2——高并......
  • TCP三次握手和四次挥手
    TCP在网络模型的第二层传输层保证可靠传输。TCP的三次握手:在最开始的时候客户端的状态是CLOSED服务器也是CLOSED第一次握手:客户端向服务器发送请求:SYN=1;客户端的状......