首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

关于Python的socket没法建立连接

2013-04-20 
关于Python的socket无法建立连接我在看programming python的时候,看了socket部分,然后编了个简单的客户端

关于Python的socket无法建立连接
我在看programming python的时候,看了socket部分,然后编了个简单的客户端服务端程序。

例子是书上的例子,运行起来也成功了。

但是当我想让远程的机器连接我主机的时候,却总是失败。(我让我女朋友用她的电脑执行客户端脚本连接我的机器,失败;但是我用自己的机器运行客户端脚本,则成功;IP用的是我的外网IP)

代码如下:
服务端

from socket import *          # get socket constructor and constants
myHost=''                     # ''=all available interfaces on host
myPort=50007                  # listen on a non-reserved port number

sockobj=socket(AF_INET, SOCK_STREAM)     # make a TCP socket object
sockobj.bind((myHost, myPort))             # bind it to server port number
sockobj.listen(5)                        # listen, allow 5 pending connects

while True:                              # listen until process killed
    connection, address=sockobj.accept() # wait for next client connect
    print('Server connected by', address)# connection is a new socket
    while True:
        data=connection.recv(1024)       # read next line on client socket
        if not data: break               # send a reply line to the client
        connection.send(b'Echo=>'+data)  # until eof when socket closed
    connection.close()

客户端
import sys
from socket import *                            # portable socket interface plus constants
serverHost="X.X.X.X"                          # 这里我用我自己的外网IP替换了,并让我女朋友从远程执行代码
serverPort=50007                               # non-reserved port used by the server

message=[b'Hello network world']                      # default text to send to server

if len(sys.argv) > 1:
    serverHost=sys.argv[1]                            # server from cmd line arg 1
    if len(sys.argv) > 2:                             # text from cmd line args 2..n


        message=(x.encode() for x in sys.argv[2:])

sockobj=socket(AF_INET, SOCK_STREAM)                  # make a TCP/IP socket object
sockobj.connect((serverHost, serverPort))             # connect to server machine + port

for line in message:
    sockobj.send(line)                                # send line to server over socket
    data=sockobj.recv(1024)                           # receive line from server: up to 1k
    print('Client received: ',data)                   # bytes are quoted, was 'x', repr(x)

print('success')
sockobj.close() 



结果就是,服务端这边错误信息:
Server connected by ('66.175.219.136', 2073)
Traceback (most recent call last):
  File "C:\Users\asus\Desktop\echo-server.py", line 23, in <module>
    data=connection.recv(1024)       # read next line on client socket
socket.error: [Errno 10054] 远程主机强迫关闭了一个现有的连接。

客户端则是:
Traceback (most recent call last):
  File "D:\Documents\Desktop\Internet Programming\echo-client.py", line 24, in <module>
    sockobj.connect((serverHost, serverPort))             # connect to server machine + port
socket.error: [Errno 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。


请问一下高手,到底是什么原因?
[解决办法]
10060是超时,所以首先确定网络是否通了(防火墙、路由器端口映射之类)
因为客户端没有连接上,所以服务器端10054(对方强制关闭)也是自然的事
[解决办法]
Server connected by ('66.175.219.136', 2073)
已经连接了不是么,不过看上面端口号蛮小的,不像是你的客户端代码发的,貌似先收到别人的包了,然后服务器挂了,你的客户端才跟着出错...
[解决办法]
是TCP的?
可以直接用telnete 看看对应的端口是否在本地可以访问
格式如下
telnet xxx(IP) port
感觉更像是防火墙/NAT配置的问题

热点排行