千家信息网

linux网络编程入门三步走

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,背景:每一个语言都会有入门的helloworld内容:看完网络编程的基础知识,知道原来网络编程也有小练习概述:Echo,Chat,Proxy网上有专门的练习。不管是UNIX网络编程还是其他的书籍都会有
千家信息网最后更新 2026年11月01日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安全错误 数据库的锁怎样保障安全 科技赋能下的互联网金融 互联网与科技发展 合肥互联网科技公司 互联网科技logo设计 奔汉互联网科技 互联网科技咨询 甘肃拓世互联网科技有限公司 互联网巨头投资的硬核科技 互联网科技实习生岗位职责 互联网科技寓意 米聚互联网科技南京有限公司排面 为客找房互联网科技公司怎么样 众安科技工业互联网合作 高科技互联网套路 深圳无忧互联网科技 黑云互联网科技有限公司 互联网科技融合创新 济南小医互联网科技有限公司招聘 河南商务圈互联网科技有限公司 山东亿川互联网科技有限责任公司 互联网科技社 盛创互联网科技有限公司 济南华为互联网科技产业总部基地 互联网科技博主是什么意思 黑科技闪耀互联网之光 注册互联网科技公司经营范围大全 互联网科技研发水平 互联网公司高科技产品 广州三三互联网科技有限公司 恒生科技指数 中概互联网
0