您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > Python核心编程第三版课后习题解答(第二章)
Python核心编程第三版课后习题解答——第二章2-1.面向连接的套接字和无连接的套接字之间的区别是什么?面向连接的:通信之前必须先建立起一个连接,提供序列化的,可靠的和不重复的数据交付,而没有边界记录。无连接的:在通信开始之前并不需要建立连接,在数据传输过程中并无法保证它的顺序性,可靠性或重复性。2-2.用自己的话描述客户端/服务器架构的意思。服务器就是一系列硬件或软件,为一个或多个客户端(服务的用户)提供所需的“服务”。它存在唯一目的就是等待客户端的请求,并响应它们(提供服务),然后等待更多的请求。客户端因特定的请求而联系服务器,并发送必要的数据,然后等待服务器的回应,最后完成请求或给出故障的原因。2-3.TCP和UDP之中,哪种类型的服务器接受连接,并将它们转换到独立的套接字进行客户端通信?TCP。2-4.客户端。更新Tcp和Udp客户端,以使得服务器名称无需硬编码到应用程序中。此外,应该允许用户指定主机名和端口号,且如果二者中任何一个或者全部参数丢失,那么应该使用默认值。[python]viewplaincopy1.spanstyle=font-family:'ComicSansMS';font-size:18px;fromsocketimport*2.3.DefaultHOST='localhost'4.DefaultPORT=12365.BUFSIZ=10246.defGetAddr():7.Host=raw_input(Pleaseinputhost:)8.Port=raw_input(Pleaseinputport:)9.returnHost,int(Port)10.11.Host,Port=GetAddr()12.13.ifnotHost:14.Host=DefaultHOST15.ifnotPort:16.Port=DefaultPORT17.18.ADDR=(Host,Port)19.20.tcpCliSock=socket(AF_INET,SOCK_STREAM)21.tcpCliSock.connect(ADDR)22.23.whileTrue:24.data=raw_input('')25.ifnotdata:26.break27.tcpCliSock.send(data)28.data=tcpCliSock.recv(BUFSIZ)29.printdata30.31.tcpCliSock.close()/spanspanstyle=font-family:'MicrosoftYaHei';font-size:24px;strong32./strong/span2-5.网络互接和套接字。更新服务器代码,使其具有更多功能,令其能够识别以下命令。data服务器返回其当前日期/时间戳os获取操作系统信息ls列出当前目录文件清单lsdir返回dir目录中的文件清单[python]viewplaincopy1.spanstyle=font-family:'ComicSansMS';font-size:18px;fromsocketimport*2.fromtimeimportctime3.importos4.importre5.6.HOST=7.PORT=12408.ADDR=(HOST,PORT)9.BUFSIZ=102410.11.tcpSerSock=socket(AF_INET,SOCK_STREAM)12.tcpSerSock.bind(ADDR)13.tcpSerSock.listen(5)14.responsedic={'data':ctime(),'os':os.name,'ls':str(os.listdir(os.curdir))}15.16.whileTrue:17.printWaitingforconnect...18.tcpCliSock,addr=tcpSerSock.accept()19.print'...connectedfrom:',addr20.21.whileTrue:22.data=tcpCliSock.recv(BUFSIZ)23.findre=re.match(r'lsdir\((.+)\)',data)24.ifnotdata:25.break26.elifresponsedic.get(data):27.tcpCliSock.send(responsedic[data])28.eliffindre:29.printos.listdir(findre.group(1))30.tcpCliSock.send(str(os.listdir(findre.group(1))))31.else:32.tcpCliSock.send(str(data))33.tcpCliSock.close()34.tcpCliSock.close()/spanspanstyle=font-family:'MicrosoftYaHei';font-size:24px;strong35./strong/span2-6.使用socket.getservbyname()来确定使用UDP协议的“daytime”服务的端口号。Socket.getservbyname(‘daytime’,‘udp’)可得到结果端口为132-7.创建一个简单的半双工聊天程序Server部分:[python]viewplaincopy1.spanstyle=font-family:'ComicSansMS';spanstyle=font-size:18px;fromsocketimport*2.3.HOST=4.PORT=20515.ADDR=(HOST,PORT)6.BUFSIZ=10247.tcpSerSock=socket(AF_INET,SOCK_STREAM)8.tcpSerSock.bind(ADDR)9.tcpSerSock.listen(5)10.11.whileTrue:12.printWaitingforconnect...13.tcpCliSock,addr=tcpSerSock.accept()14.print'...connectedfrom:',addr15.whileTrue:16.data=tcpCliSock.recv(BUFSIZ)17.ifdata=='Quit':18.tcpCliSock.close()19.else:20.print%ssaid:%s%(addr,data)21.senddata=22.whilesenddata==:23.senddata=raw_input('')24.tcpCliSock.send(senddata)25.data=None26.tcpCliSock.close()/span/spanClient部分:[python]viewplaincopy1.spanstyle=font-family:'ComicSansMS';spanstyle=font-size:18px;fromsocketimport*2.HOST='localhost'3.PORT=20514.BUFSIZ=10245.ADDR=(HOST,PORT)6.7.tcpCliSock=socket(AF_INET,SOCK_STREAM)8.tcpCliSock.connect(ADDR)9.10.whileTrue:11.data=raw_input('')12.ifnotdata:13.continue14.tcpCliSock.send(data)15.data=tcpCliSock.recv(BUFSIZ)16.printdata17.18.tcpCliSock.close()/span/span2-8,2-9,2-10.多用户,多房间,全双工聊天Server部分:[python]viewplaincopy1.spanstyle=font-family:'ComicSansMS';font-size:18px;importsocket,select2.importre3.server=socket.socket()4.Addr=(,2050)5.server.bind(Addr)6.server.listen(5)7.inputs=[server]8.clientdict={}9.user=Nonameuser10.roomnumber=011.printStartthechatserver...12.13.whileTrue:14.rs,ws,es=select.select(inputs,[],[])15.foriinrs:16.ifi==server:17.client,addr=i.accept()18.#printConnectedfrom,addr,thisisuser%s%user19.inputs.append(client)20.clientdict[client]=[client,addr,user,roomnumber]21.22.else:23.try:24.data=i.recv(1024)25.matchname=re.match(r'(.+)\sjointheserver',data)26.matchroom=re.match(r'Jointheroom(\d)',data)27.ifmatchname:28.printdata29.forxininputs:30.ifx==serverorx==i:31.pass32.else:33.ifclientdict[x][2]==Nonameuserorclientdict[x][3]==0:34.pass35.else:36.x.send(data)37.username=matchname.group(1)38.clientdict[i][2]=username39.i.send('Welcome,%s'%username)40.elifmatchroom:41.print'%s'%clientdict[i][2],data42.roomnumber=matchroom.group(1)43.clientdict[i][3]=roomnumber44.i.send('Youjoinroom%s'%roomnumber)45.forxininputs:46.ifx==serverorx==i:47.pass48.else:49.ifclientdict[x][3]==clientdict[i][3]:50.x.send('%sjointhisroom'%clientdict[i][2])51.else:52.senddata=%ssaid:%s%(clientdict[i][2],data)53.forxininputs:54.ifx==serverorx==i:55.pass56.else:57.ifclientdict[x][3]==clientdict[i][3]:58.x.send(senddata)59.disconnected=False60.61.exceptsocket.error:62.disconnected=True63.64.ifdisconnected:65.leftdata=%shasleft%clientdict[i][2]66.printleftdata67.forxininputs:68.ifx==serverorx==i:69.pass70.else:71.x.send(leftdata)72.inputs.remove(i)/spanClient部分:[python]viewplaincopy1.spanstyle=font-family:'ComicSansMS';font-size:18px;fromsocketimport*2.impo
本文标题:Python核心编程第三版课后习题解答(第二章)
链接地址:https://www.777doc.com/doc-4210879 .html