linux网络编程入门三步走
发表于:2025-01-28 作者:千家信息网编辑
千家信息网最后更新 2025年01月28日,背景:每一个语言都会有入门的helloworld内容:看完网络编程的基础知识,知道原来网络编程也有小练习概述:Echo,Chat,Proxy网上有专门的练习。不管是UNIX网络编程还是其他的书籍都会有
千家信息网最后更新 2025年01月28日linux网络编程入门三步走
背景:每一个语言都会有入门的helloworld
内容:看完网络编程的基础知识,知道原来网络编程也有小练习
概述:Echo,Chat,Proxy
网上有专门的练习。不管是UNIX网络编程还是其他的书籍都会有相关的举例
Echo,chat,Proxy在这里统一再现Python的实现,主要是Python的比较简单,稍后也会补充一下PHP的swoole
Echo:
import os,sys,platformimport BaseHTTPServerfrom SocketServer import ThreadingMixInimport urllib,urllib2import shutilimport reimport timetry: from cStringIO import StringIOexcept ImportError: from StringIO import StringIOclass SimpleHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): def do_GET(self): f = StringIO() f.write(self.path) length = f.tell() f.seek(0) self.response(length) if f: shutil.copyfileobj(f,self.wfile) f.close() def response(self,length): self.send_response(200) self.send_header("Content-type","text/html") self.send_header("Content-Length",str(length)) self.end_headers()class ThreadingServer(ThreadingMixIn,BaseHTTPServer.HTTPServer): passif __name__ =="__main__": serveraddr = ("",int(sys.argv[1])) print "LISTEN Port(%s)" % (int(sys.argv[1])) srvr = ThreadingServer(serveraddr,SimpleHTTPRequestHandler) srvr.serve_forever()
Chat:
import socket,selectdef broadcast_data(sock,message): for socket in CONNECTION_LIST: if socket != server_socket and socket !=sock: try: socket.send(message) except: socket.close() CONNECTION_LIST.remove(socket)if __name__ =='__main__': CONNECTION_LIST = [] RECV_BUFFER = 4096 HOST = '0.0.0.0' PORT = 3446 server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) server_socket.bind((HOST,PORT)) server_socket.listen(10) CONNECTION_LIST.append(server_socket) print "Chat server started on port {}"+str(PORT) while True: read_sockets,write_sockets,error_sockets = select.select(CONNECTION_LIST,[],[]) for sock in read_sockets: if sock ==server_socket: sockfd,addr = server_socket.accept() CONNECTION_LIST.append(sockfd) print ("Client (%s,%s) connected" % addr) broadcast_data(sockfd,"[%s:%s] entered room\n"% addr) else: try: data = sock.recv(RECV_BUFFER) if data: broadcast_data(sock,"\r"+'<'+str(sock.getpeername())+'>'+data) except: broadcast_data(sock,"Client (%s,%s) is offline"% addr) print ("Client (%s,%s) is offline"% addr) sock.close() CONNECTION_LIST.remove(sock) continue server_socket.close()
聊天的客户端也是一样的
Chat-Client:
import socket,select,string,sysdef prompt(): sys.stdout.write(" ") sys.stdout.flush()if __name__=="__main__": if(len(sys.argv)<3): print "Usage: python chat_client.py host port" sys.exit() host = sys.argv[1] port = int(sys.argv[2]) s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.settimeout(2) try: s.connect((host,port)) except: print ("Unable to connnect") sys.exit() print("Connected to remote host,Start send message") prompt() while True: rlist = [sys.stdin,s] read_list,write_list,error_list = select.select(rlist,[],[]) for sock in read_list: if sock ==s: data = sock.recv(4096) if not data: print '\nDisconnected from chat server'; sys.exit() else: sys.stdout.write(data) prompt() else: msg = sys.stdin.readline() s.send(msg) prompt()
Proxy(好像当时码的时候有小错误,反正就是连接两边的服务器,都接收过来,然后各自在转发出去,来来回回,写晕了)
import sysimport socketimport threadingdef server_loop(local_host,local_port,remote_host,remote_port,receive_first): server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) try: server.bind(local_host,local_port) except: print ("[!!] Failed to listen on %s:%d"% (local_host,local_port)) print ("[!!] Check for other listening sockets or correct permissions") sys.exit(0) print ("[*] Listening on $s:%d"% (localhos_host,local_port)) server.listen(5) while True: client_socket.addr = server.accept() print ("[==>] Received incoming connnection from %s:%d"% addr[0],addr[1]) proxy_thread = threading.Thread(target = proxy_handler,args =(client_socket,remote_host,remote_port,receive_first)) proxy_thread.start()def proxy_handler(client_socket,remote_host,remote_port,receive_first): remote_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) remote_socket.connect((remote_host,remote_port)) if receive_first: remote_buffer = receive_from(remote_socket) hexdump(remote_buffer) remote_buffer = response_handler(remote_buffer) remote_socket.send(local_buffer) print("[==>] Sent to remote") remote_buffer = receive_from(remote_socket) if len(remote_buffer): print("[<==] Sending %d bytes to local_host."%len(remote_buffer)) client.send(remote_buffer) while True: local_buffer = receive_from(client_socket) if len(remote_buffer): print ("[==>] Received %d bites from local_host" %len(local_buffer)) hexdump(local_buffer) local_buffer = request_handler(local_buffer) remote_socket.send(local_buffer) print("[==>] Sent to remote") remote_buffer = receive_from(remote_socket) if len(remote_buffer): print("[<== ] Received %d bytes from remote." % len(remote_buffer)) hexdump(remote_buffer) remote_buffer = response_handler(remote_buffer) client.socket.send(remote_buffer) print("[<==] Sent to Sent to local_host") if not len(local_buffer) or not len(remote_buffer): client_socket.close() remote_socket.close() print("[*] No more data.Closing connections") breakdef hexdump(src,length = 16): result =[] digits = 4 if isinstance(str,unicode) else 2 for i in xrange(0,len(src),length): s = src[i:i+length] hexa = b' '.join(["%0*x"%(digits,ord(x)) for x in s]) text = b''.join([x if 0x20 <= ord(0) <=0x7F else b'.' for x in s]) result.append(b'X %-*s %s'%(i,length*(digits + 1),hexa,text)) print(b'\n'.join(result))def receive_from(connection): buffer = '' connection.settimeout(2) try: while True: data = connection.recv(4096) if not data: break buffer +=data except: pass return bufferdef request_handler(buffer): return bufferdef response_handler(buffer): return bufferdef main(): if len(sys.argv[1:])!=5: print("Usage:python proxy.py [localhos_host] [local_port] [remote_host] [remote_port] [receice_first]") print("Example:python proxy.py 127.0.0.1") sys.exit(0) local_host = sys.argv[1] local_port = int(sys.argv[2]) remote_host = sys.argv[3] remote_port = sys.argv[4] receive_first = sys.argv[5] if 'True' in receive_first: receive_first = True else: receive_first = False server_loop(local_host,local_port,remote_host,remote_port,receive_first)main()
网络
网络编程
编程
书籍
内容
基础
基础知识
客户
客户端
小错
就是
时候
服务器
知识
稍后
背景
自在
语言
还是
服务
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
女生java软件开发
计算机网络技术建议专升本吗
网络安全工程师蛋糕店
华为和安卓是一个服务器的吗
不可缺少的数据库管理
MIUI主题软件开发
软件开发的资源最重要的是
如何安装dns服务器
建站数据库
去日本做软件开发加班多吗
沈阳恩方软件开发
戴尔t310服务器开机蓝屏
lte移动通信网络安全风险
金飞鹰滑雪场管理系统服务器配置
怎么将电脑变成服务器给手机使用
服务器上装什么安全软件好
网络安全检查项的管理
软件开发私活平台
购买数据库系统的账务处理
数据库怎么插入另外一个表
ado制作数据库代码
网络设计安全防护数据库
数据库测评的安全控制点
云南村庄规划数据库标准
前苏联网络安全
康复类医疗器械软件开发
云服务器防火墙设置
上海夺汇网络技术有限公司郑凯
数据库的种类
魔域宝宝的数据库是什么