千家信息网

linux网络编程入门三步走

发表于:2024-09-24 作者:千家信息网编辑
千家信息网最后更新 2024年09月24日,背景:每一个语言都会有入门的helloworld内容:看完网络编程的基础知识,知道原来网络编程也有小练习概述:Echo,Chat,Proxy网上有专门的练习。不管是UNIX网络编程还是其他的书籍都会有
千家信息网最后更新 2024年09月24日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安全错误 数据库的锁怎样保障安全 网络安全的实训体会 魔兽世界有永久70级服务器吗 加强社会网络安全意识教育 呼伦贝尔亿渠网络技术 iminit+数据库 安徽存储服务器机箱定制虚拟主机 模拟人生4保存数据库找不到 蛋白与转录因子数据库 锑锑软件开发上海有限公司 数据库安全测试主要涉及漏洞 小米手机怎清楚数据库 吉林通信软件开发服务检测中心 带界面的dhcp服务器 lol登陆不显示服务器 云服务器收费标准 ibatis数据库连接没有释放 软件开发工程题库 14年软件开发不断跳槽到现在 国家网络安全宣传简报大学 软件开发 合作信息 软件开发案例实验报告 加拿大情报机构网络安全评估报告 如何建立记忆障碍数据库 敦煌莫高窟网络技术 数据库 left 去逗号 嘉定区无线网络技术服务 机器视觉软件开发学习路径 两台手机共享移动数据库 海豚图标服务器 环境监测软件开发解决方案
0