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
#!/usr/bin/env python
#server.py
if __name__ == "__main__":
import socket
s = socket.socket()
address=('localhost',12345)
s.bind(address)
s.listen(5)
while True:
c, addr = s.accept()
print 'Got connection from',addr
c.send('thank you for connection')
word=c.recv(1025)
c.send(word+' too')
c.close()
复制代码
client.py:
#!/usr/bin/env python
#client.py
if __name__ == "__main__":
import socket
s = socket.socket()
address=('127.0.0.1',12345)
s.connect(address)
print s.recv(1024)
while(True):
word=raw_input('>')
if not word:
continue
else:
s.send(word)
print s.recv(1027)
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
#!/usr/bin/env python
#client.py
if __name__ == "__main__":
import socket
while(True):
s = socket.socket()
address=('127.0.0.1',12345)
s.connect(address)
print s.recv(1024)
word=raw_input('>')
if not word:
continue
else:
s.send(word)
print s.recv(1027)
s.close()
复制代码
原来的s被close掉之后,又没有重新建立,当然无法send了。现在把s都放在一个while里面,就ok了。
作者:
firmlyjin
时间:
2011-11-23 14:52
#!/usr/bin/env python
#client.py
if __name__ == "__main__":
import socket
while(True):
s = socket.socket()
address=('127.0.0.1',12345)
s.connect(address)
print s.recv(1024)
word=raw_input('>')
if not word:
continue
else:
s.send(word)
print s.recv(1027)
s.close()
复制代码
原来的s被close掉之后,又没有重新建立,当然无法send了。现在把s都放在一个while里面,就ok了。
作者:
firmlyjin
时间:
2011-11-23 14:58
回复
1#
enmingma
#!/usr/bin/env python
#client.py
if __name__ == "__main__":
import socket
while(True):
s = socket.socket()
address=('127.0.0.1',12345)
s.connect(address)
print s.recv(1024)
word=raw_input('>')
if not word:
continue
else:
s.send(word)
print s.recv(1027)
s.close()
复制代码
原来的s被close掉之后,又没有重新建立,当然无法send了。现在把s都放在一个while里面,就ok了。
作者:
firmlyjin
时间:
2011-11-23 14:59
回复
1#
enmingma
#!/usr/bin/env python
#client.py
if __name__ == "__main__":
import socket
while(True):
s = socket.socket()
address=('127.0.0.1',12345)
s.connect(address)
print s.recv(1024)
word=raw_input('>')
if not word:
continue
else:
s.send(word)
print s.recv(1027)
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