Chinaunix

标题: python socket 问题 [打印本页]

作者: enmingma    时间: 2011-11-19 18:13
标题: python socket 问题
本帖最后由 enmingma 于 2011-11-19 19:22 编辑

我接触python不久,现在用socket想做一个简单的网络程序,实现server和client之间的通信,连接后,client向server发送消息,server返回相应的信息,我的代码入下
server.py
  1. #!/usr/bin/env python
  2. #server.py
  3. if __name__ == "__main__":
  4.     import socket
  5.     s = socket.socket()
  6.         
  7.     address=('localhost',12345)
  8.     s.bind(address)
  9.         
  10.     s.listen(5)
  11.             
  12.     while True:
  13.         c, addr = s.accept()
  14.         print 'Got connection from',addr
  15.         c.send('thank you for connection')
  16.         word=c.recv(1025)
  17.         c.send(word+' too')
  18.         c.close()
复制代码
client.py:
  1. #!/usr/bin/env python
  2. #client.py
  3. if __name__ == "__main__":
  4.     import socket
  5.    
  6.     s = socket.socket()

  7.     address=('127.0.0.1',12345)
  8.    
  9.     s.connect(address)
  10.     print s.recv(1024)
  11.     while(True):
  12.         word=raw_input('>')
  13.         if not word:
  14.             continue
  15.         else:
  16.             s.send(word)
  17.             print s.recv(1027)
  18.             s.close()
复制代码
我现在的情况是,client第一次发送消息,服务器可以正常返回,第二次发送消息,client就报错退出了,报错如下:
Traceback (most recent call last):
  File "./client.py", line 17, in <module>
    s.send(word)
  File "/usr/local/lib/python2.6/socket.py", line 165, in _dummy
    raise error(EBADF, 'Bad file descriptor')
socket.error: [Errno 9] Bad file descriptor

希望大家给个指点,提示一下也行啊,谢谢了
作者: lkk2003rty    时间: 2011-11-19 19:34
本帖最后由 lkk2003rty 于 2011-11-19 22:35 编辑

你自己都close了  你怎么能发成?
作者: enmingma    时间: 2011-11-20 08:02
回复 2# lkk2003rty


    我试过了,把close注释掉也不行啊
作者: lkk2003rty    时间: 2011-11-20 14:21
回复 3# enmingma


    server端都close掉了  你还能发啥 ?
作者: bikong0411    时间: 2011-11-20 14:37
while下就close了,当然就1次冷
作者: wt133664    时间: 2011-11-20 18:51
repeat listen in the while loop
作者: enmingma    时间: 2011-11-21 09:19
回复 4# lkk2003rty


    server和client端的close()我都试过把他们注释掉,还是不行,我是刚接触python,以前没啥编程基础,还希望这位兄台说的详细点,谢谢了
作者: enmingma    时间: 2011-11-21 09:27
回复 6# wt133664


    不是很懂,
作者: zyd320    时间: 2011-11-21 11:03
客户端的s.close()不应该在while循环里,说的应该是这个意思
作者: enmingma    时间: 2011-11-21 11:19
回复 9# zyd320


    应该不是close的问题,close的各种可能我都试过了
作者: lkk2003rty    时间: 2011-11-22 00:28
回复 7# enmingma


    有这时间回帖~~~stfw~~~~答案就出来了~~~~
作者: agathewiky    时间: 2011-11-22 15:01
我刚才试了下,错误有两点:
1.accept应该放在while外面,它是响应client的connect操作的,也就是TCP的三次握手
2.然后close当然也必然得放在外面
作者: agathewiky    时间: 2011-11-22 15:12
还有如果你想每次while都重新accept和close,那你就得把client中的conect操作写到while内。
作者: firmlyjin    时间: 2011-11-23 14:51

  1. #!/usr/bin/env python
  2. #client.py
  3. if __name__ == "__main__":
  4.     import socket
  5.    

  6.     while(True):

  7.          s = socket.socket()

  8.         address=('127.0.0.1',12345)
  9.    
  10.         s.connect(address)
  11.         print s.recv(1024)
  12.         word=raw_input('>')
  13.         if not word:
  14.             continue
  15.         else:
  16.             s.send(word)
  17.             print s.recv(1027)
  18.             s.close()
复制代码


原来的s被close掉之后,又没有重新建立,当然无法send了。现在把s都放在一个while里面,就ok了。
作者: firmlyjin    时间: 2011-11-23 14:52

  1. #!/usr/bin/env python
  2. #client.py
  3. if __name__ == "__main__":
  4.     import socket
  5.    

  6.     while(True):

  7.          s = socket.socket()

  8.         address=('127.0.0.1',12345)
  9.    
  10.         s.connect(address)
  11.         print s.recv(1024)
  12.         word=raw_input('>')
  13.         if not word:
  14.             continue
  15.         else:
  16.             s.send(word)
  17.             print s.recv(1027)
  18.             s.close()
复制代码


原来的s被close掉之后,又没有重新建立,当然无法send了。现在把s都放在一个while里面,就ok了。
作者: firmlyjin    时间: 2011-11-23 14:58
回复 1# enmingma

  1. #!/usr/bin/env python
  2. #client.py
  3. if __name__ == "__main__":
  4.     import socket
  5.    

  6.     while(True):

  7.          s = socket.socket()

  8.         address=('127.0.0.1',12345)
  9.    
  10.         s.connect(address)
  11.         print s.recv(1024)
  12.         word=raw_input('>')
  13.         if not word:
  14.             continue
  15.         else:
  16.             s.send(word)
  17.             print s.recv(1027)
  18.             s.close()
复制代码


原来的s被close掉之后,又没有重新建立,当然无法send了。现在把s都放在一个while里面,就ok了。
作者: firmlyjin    时间: 2011-11-23 14:59
回复 1# enmingma

  1. #!/usr/bin/env python
  2. #client.py
  3. if __name__ == "__main__":
  4.     import socket
  5.    

  6.     while(True):

  7.          s = socket.socket()

  8.         address=('127.0.0.1',12345)
  9.    
  10.         s.connect(address)
  11.         print s.recv(1024)
  12.         word=raw_input('>')
  13.         if not word:
  14.             continue
  15.         else:
  16.             s.send(word)
  17.             print s.recv(1027)
  18.             s.close()
复制代码


原来的s被close掉之后,又没有重新建立,当然无法send了。现在把s都放在一个while里面,就ok了。
作者: firmlyjin    时间: 2011-11-23 15:05
sorry,网络出了问题




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2