+ -
当前位置:首页 → 问答吧 → Python网络编程遇到一个问题,请教高手解决

Python网络编程遇到一个问题,请教高手解决

时间:2010-11-02

来源:互联网

1·问题描述:
    让服务器的名字不要在代码里写死,要允许用户指定一个主机名和端口,只有在两个值都没有输入的时候,才使用默认值。
2·脚本如下:
  1. #!/usr/bin/python

  2. from socket import *

  3. HOST = raw_input('please IP address: ')
  4. PORT = input('please PORT: ')
  5. BUFSIZ = 1024
  6. ADDR = (HOST, PORT)
  7. tcpCliSock = socket(AF_INET, SOCK_STREAM)
  8. tcpCliSock.connect(ADDR)
  9. while True:
  10.     data = raw_input('> ')
  11.     if not data:
  12.         break
  13.     tcpCliSock.send(data)
  14.     data = tcpCliSock.recv(BUFSIZ)
  15.     if not data:
  16.         break
  17.     print data
  18. tcpCliSock.close()
复制代码
3·我的问题:
    不输入PORT值,程序报错;ADDR不能像函数那样传参。

作者: ning_lianjie   发布时间: 2010-11-02

回复 ning_lianjie


  貌似你HOST和PORT都没有指定默认值?

作者: donotblock   发布时间: 2010-11-02

回复 donotblock


    要求用户输入的,要如何指定呢?

作者: ning_lianjie   发布时间: 2010-11-02



QUOTE:
回复  donotblock


    要求用户输入的,要如何指定呢?
ning_lianjie 发表于 2010-11-02 15:56




    ADDR = (HOST and HOST or '127.0.0.1', PORT and PORT or '80')

作者: donotblock   发布时间: 2010-11-02

回复 donotblock


    果然可以,谢谢。以前在定义函数的默认参数的时候,直接可以PORT=80,没想到元组中定义还需要这样。。。

不过现在还存在一个问题,就是定义PORT=input(),如果值为空,就会报错,解决这个问题,该从何处着手?

作者: ning_lianjie   发布时间: 2010-11-02



QUOTE:
回复  donotblock


    果然可以,谢谢。以前在定义函数的默认参数的时候,直接可以PORT=80,没想到元 ...
ning_lianjie 发表于 2010-11-02 16:07




    PORT = input("abc:") 如果不输入直接敲回车,PORT就是空字符串啊。 你报什么错?

作者: donotblock   发布时间: 2010-11-02

回复 donotblock
  1. [root@ora01 16]# ./tsTclnt.py
  2. please IP address:
  3. please PORT:
  4. Traceback (most recent call last):
  5.   File "./tsTclnt.py", line 6, in ?
  6.     PORT = input('please PORT: ')
  7.   File "<string>", line 0
  8.    
  9.     ^
  10. SyntaxError: unexpected EOF while parsing
复制代码
这样,而且我在交互模式下,也一样:
  1. >>> PORT = input('please PORT: ')
  2. please PORT:
  3. Traceback (most recent call last):
  4.   File "<stdin>", line 1, in ?
  5.   File "<string>", line 0
  6.    
  7.     ^
  8. SyntaxError: unexpected EOF while parsing
复制代码

作者: ning_lianjie   发布时间: 2010-11-02



QUOTE:
回复  donotblock 这样,而且我在交互模式下,也一样:
ning_lianjie 发表于 2010-11-02 16:15




     输入的Ctrl+D还是回车? 用raw_input试试

作者: donotblock   发布时间: 2010-11-02

回复 donotblock


    直接回车,然后报错。如果用raw_input(),得到的结果就是空字符,就不是数字类型了。
  1. >>> PORT = raw_input('please PORT: ')
  2. please PORT:
  3. >>> PORT
  4. ''
复制代码

作者: ning_lianjie   发布时间: 2010-11-02



QUOTE:
回复  donotblock


    直接回车,然后报错。如果用raw_input(),得到的结果就是空字符,就不是数字类 ...
ning_lianjie 发表于 2010-11-02 16:26



我用的是python 3.12, input可以接受回车, 看了下文档,其实就相当于2.x版本的raw_input。  2.6下面只能用raw_input了,结果转换下:

ADDR = (....., PORT and int(PORT) or 80)

作者: donotblock   发布时间: 2010-11-02

回复 donotblock


    我用的版本就是Linux上面带的,Python 2.4.3
参考资料了解到raw_input与input的区别就是:
input()=eval(raw_input())
现在我迷惑的是,如何给变量PORT赋给用户输入的值,如果没有输入,如何用默认值赋。

作者: ning_lianjie   发布时间: 2010-11-02



QUOTE:
回复  donotblock


    我用的版本就是Linux上面带的,Python 2.4.3
参考资料了解到raw_input与input ...
ning_lianjie 发表于 2010-11-02 16:41




   额,我上面的回答不就可以做到了?? 直接敲回车就用默认的值,输入了就用输入值。 你莫不是在问怎么处理命令行参数?  
   BTW, 有没有看玩Python的初级教程, 没有的话建议系统看看,这些都是基本问题。 《Dive into python》

作者: donotblock   发布时间: 2010-11-02

回复 donotblock


    我的表述不太清楚,我先想一下。

作者: ning_lianjie   发布时间: 2010-11-02