python实现客户端向服务端传文件,在同一台机器上可以执行,但是windows不能向linux传,Error 10061??

时间:2021-01-10 05:58:28
同样一段python代码,客户端和服务端都在linux上没问题。
但是把客户端放到windows上就发送不过去,ip都改了,socket显示已连接。
但是发送文件时,报Error 10061错误。
我在网上查这个错误是服务端refused,拒绝连接,很奇怪啊!!!
求大神帮忙!!

下面是客户端python的代码
# -*- coding: utf-8 -*-
import sys
import threading
import time
import socket
from kafka.client import KafkaClient
from kafka.producer import SimpleProducer, KeyedProducer
from os import path, walk
import datetime as dt
import ConfigParser

conf = ConfigParser.ConfigParser()
conf.read('conf.ini')
logs = conf.options('LOGDIRS')
host = conf.get('KAFKA','host')
port = conf.getint('KAFKA','port')
worknode = conf.get('SERVER','worknode')
serverip = conf.get('SERVER','serverip')
serverport = conf.getint('SERVER','serverport')
sleeptime = conf.getint('SERVER','sleeptime')

class SocketClient(object):

    def __init__(self, serverHost, serverPort, handler):
        self.serverHost = serverHost
        self.serverPort = serverPort
        self.handler = handler
        self.sockobj = None

    
    def connect(self):
        self.sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        connected = False
        while not connected:
            try:
                self.sockobj.connect((self.serverHost, self.serverPort))
                connected = True
                print "Connect server successed!"
            except socket.error, arg:
                (errno, message) = arg
                print "Connect server failed: message=%s" % message
                time.sleep(sleeptime)
        return connected
   
                
    def sendHeartbeat(self, stop_event):
        while(not stop_event.is_set()):
            try:
                self.sockobj.send('heartbeat&'+ worknode + '&\n')
                time.sleep(sleeptime)
            except Exception, ex:
                print ex
                stop_event.set()
                #print "[debug]heartbeat except"
        #print "[debug]thread sendHeartbeat end"

    def recvMessage(self, stop_event):
        while(not stop_event.is_set()):
            try:
                data = self.sockobj.recv(1024)
                if(data):
                 self.handler(data)
                else:
                 stop_event.set()
                 #print "[debug]recv data is empty"
            except Exception, ex:
                print ex   
                stop_event.set()  
                #print "[debug]recv except"
        #print "[debug]thread recvMessage end"
    
    def start(self):
while True:
stop_event = threading.Event()
connected = self.connect()
heartbeat = threading.Thread(target=self.sendHeartbeat, args=(stop_event,))
heartbeat.start()
getmessage = threading.Thread(target=self.recvMessage, args=(stop_event,))
getmessage.start()
while(not stop_event.is_set()):
time.sleep(sleeptime)
self.stop()
#print "[debug]reconnect"

    def stop(self):
        self.sockobj.close()

       
class LogClient(object):
    def __init__(self, kafkaHost, kafkaPort):
        self.kafkaHost = kafkaHost
        self.kafkaPort = kafkaPort
    
    def fixLen(self, s, l):
        s = s[0:8]+worknode+s[8:]
        fixed = s+" "*(l-len(s))
        return fixed
    
    def sendLog(self, topic, filename):
        try:
client = KafkaClient(self.kafkaHost, self.kafkaPort)
producer = SimpleProducer(client, topic)
f = open(filename, 'rb')
fname = path.basename(f.name)
ftext = f.read()
producer.send_messages(ftext)
f.close()
client.close()
print "kafka sent "+filename
        except Exception, ex:
            print ex

def handler(data):
    try:
        logClient = LogClient(host, port)
        logClient.sendLog('testkafka', path.join('D:\\test\\tonghuashun\\', '20140303'+".log"))
    except Exception, ex:
        print ex

if __name__ == '__main__':
    client = SocketClient(serverip, serverport,handler)
    client.start()

15 个解决方案

#1


最好贴出完整错误信息...

#2


引用 1 楼 angel_su 的回复:
最好贴出完整错误信息...

我try catch了   
错误信息就是Error 10061 
没其他的了!!

#3


10061是连接都没有建立起来的,你在哪看到 socket 已经连接了?

#4


没有连接的话,估计服务器那方系统有防火墙阻挡,设置开放对应端口...

#5


引用 2 楼 yiyiqiu123 的回复:
Quote: 引用 1 楼 angel_su 的回复:

最好贴出完整错误信息...

我try catch了   
错误信息就是Error 10061 
没其他的了!!


try:
                self.sockobj.connect((self.serverHost, self.serverPort))
                connected = True
                print "Connect server successed!"


这句话足可以说明,已经连接上了啊!

#6


引用 4 楼 angel_su 的回复:
没有连接的话,估计服务器那方系统有防火墙阻挡,设置开放对应端口...


防火墙是全部关掉了的,从windows向linux是ping通的,并且telnet + ip + 端口,是通的。
而且经测试发现linux向linux发送也是成功的。
不知道为什么linux拒绝windows的发送?!?

#7


引用 1 楼 angel_su 的回复:
最好贴出完整错误信息...


完整信息如下:
python实现客户端向服务端传文件,在同一台机器上可以执行,但是windows不能向linux传,Error 10061??

#8


在SocketClient.connect()的return之前,调用ping命令。
import socket, sys, os

host, port = ('192.168.1.1', 80)
arr_result = socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM)
for i, result in enumerate(arr_result):
    print('{0}#, {1}'.format(i, result))
    if result[0] == socket.AF_INET:
        print('Family: AF_INET')
    elif result[0] == socket.AF_INET6:
        print('Family: AF_INET6')
    else:
        print('Family: {0}'.format( result[0] ))

    if result[1] == socket.SOCK_STREAM:
        print('Socket Type: SOCK_STREAM')
    elif result[1] == socket.SOCK_DGRAM:
        print('Socket Type: SOCK_DGRAM')

    print('Protocol: {0}'.format( result[2] ))
    print('Canonical Name: {0}'.format( result[3] ))
    print('Socket Address: {0}'.format( result[4] ))

    s = 'ping {0} -c 5'.format( result[4][0] )
    print(s)
    os.system(s)

#9


引用 8 楼 wuyu1998 的回复:
在SocketClient.connect()的return之前,调用ping命令。
import socket, sys, os

host, port = ('192.168.1.1', 80)
arr_result = socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM)
for i, result in enumerate(arr_result):
    print('{0}#, {1}'.format(i, result))
    if result[0] == socket.AF_INET:
        print('Family: AF_INET')
    elif result[0] == socket.AF_INET6:
        print('Family: AF_INET6')
    else:
        print('Family: {0}'.format( result[0] ))

    if result[1] == socket.SOCK_STREAM:
        print('Socket Type: SOCK_STREAM')
    elif result[1] == socket.SOCK_DGRAM:
        print('Socket Type: SOCK_DGRAM')

    print('Protocol: {0}'.format( result[2] ))
    print('Canonical Name: {0}'.format( result[3] ))
    print('Socket Address: {0}'.format( result[4] ))

    s = 'ping {0} -c 5'.format( result[4][0] )
    print(s)
    os.system(s)


不知道你的回答的意思是什么,完全不对啊 python实现客户端向服务端传文件,在同一台机器上可以执行,但是windows不能向linux传,Error 10061??

#10


在SocketClient.connect()中,能打印出"Connect server successed!",应该是连上了。
但后面报错,说明未连上。
因此,在打印"Connect server successed!"信息之后,检测能否ping服务器。
如果不能,故障点就确定了。
如果能ping通,但还是报10061错,故障点就在后面的代码中。

#11


引用 10 楼 wuyu1998 的回复:
在SocketClient.connect()中,能打印出"Connect server successed!",应该是连上了。
但后面报错,说明未连上。
因此,在打印"Connect server successed!"信息之后,检测能否ping服务器。
如果不能,故障点就确定了。
如果能ping通,但还是报10061错,故障点就在后面的代码中。


一直是能ping通的 ,不管是connect之前还是之后,应该是服务器那边主动拒绝接受的问题,
这里client应该没问题,因为linux对linux是可以发送的。

#12


估计7楼那堆错误来自LogClient,感觉你的异常处理写的随意了点,不易看出对应的位置..

#13


实在不行,就截包。
将linux ==> linux和windows ==> linux的收发包都截下来,然后对比。

#14


异常的时候打印下traceback , 可以查下这个模块的接口,看下具体异常堆栈信息

#15


比较简单的办法,
代码中使用traceback来跟踪输出,  并使用编辑器的debug功能,一行一行调试, 检测执行到哪行代码出错.

#1


最好贴出完整错误信息...

#2


引用 1 楼 angel_su 的回复:
最好贴出完整错误信息...

我try catch了   
错误信息就是Error 10061 
没其他的了!!

#3


10061是连接都没有建立起来的,你在哪看到 socket 已经连接了?

#4


没有连接的话,估计服务器那方系统有防火墙阻挡,设置开放对应端口...

#5


引用 2 楼 yiyiqiu123 的回复:
Quote: 引用 1 楼 angel_su 的回复:

最好贴出完整错误信息...

我try catch了   
错误信息就是Error 10061 
没其他的了!!


try:
                self.sockobj.connect((self.serverHost, self.serverPort))
                connected = True
                print "Connect server successed!"


这句话足可以说明,已经连接上了啊!

#6


引用 4 楼 angel_su 的回复:
没有连接的话,估计服务器那方系统有防火墙阻挡,设置开放对应端口...


防火墙是全部关掉了的,从windows向linux是ping通的,并且telnet + ip + 端口,是通的。
而且经测试发现linux向linux发送也是成功的。
不知道为什么linux拒绝windows的发送?!?

#7


引用 1 楼 angel_su 的回复:
最好贴出完整错误信息...


完整信息如下:
python实现客户端向服务端传文件,在同一台机器上可以执行,但是windows不能向linux传,Error 10061??

#8


在SocketClient.connect()的return之前,调用ping命令。
import socket, sys, os

host, port = ('192.168.1.1', 80)
arr_result = socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM)
for i, result in enumerate(arr_result):
    print('{0}#, {1}'.format(i, result))
    if result[0] == socket.AF_INET:
        print('Family: AF_INET')
    elif result[0] == socket.AF_INET6:
        print('Family: AF_INET6')
    else:
        print('Family: {0}'.format( result[0] ))

    if result[1] == socket.SOCK_STREAM:
        print('Socket Type: SOCK_STREAM')
    elif result[1] == socket.SOCK_DGRAM:
        print('Socket Type: SOCK_DGRAM')

    print('Protocol: {0}'.format( result[2] ))
    print('Canonical Name: {0}'.format( result[3] ))
    print('Socket Address: {0}'.format( result[4] ))

    s = 'ping {0} -c 5'.format( result[4][0] )
    print(s)
    os.system(s)

#9


引用 8 楼 wuyu1998 的回复:
在SocketClient.connect()的return之前,调用ping命令。
import socket, sys, os

host, port = ('192.168.1.1', 80)
arr_result = socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM)
for i, result in enumerate(arr_result):
    print('{0}#, {1}'.format(i, result))
    if result[0] == socket.AF_INET:
        print('Family: AF_INET')
    elif result[0] == socket.AF_INET6:
        print('Family: AF_INET6')
    else:
        print('Family: {0}'.format( result[0] ))

    if result[1] == socket.SOCK_STREAM:
        print('Socket Type: SOCK_STREAM')
    elif result[1] == socket.SOCK_DGRAM:
        print('Socket Type: SOCK_DGRAM')

    print('Protocol: {0}'.format( result[2] ))
    print('Canonical Name: {0}'.format( result[3] ))
    print('Socket Address: {0}'.format( result[4] ))

    s = 'ping {0} -c 5'.format( result[4][0] )
    print(s)
    os.system(s)


不知道你的回答的意思是什么,完全不对啊 python实现客户端向服务端传文件,在同一台机器上可以执行,但是windows不能向linux传,Error 10061??

#10


在SocketClient.connect()中,能打印出"Connect server successed!",应该是连上了。
但后面报错,说明未连上。
因此,在打印"Connect server successed!"信息之后,检测能否ping服务器。
如果不能,故障点就确定了。
如果能ping通,但还是报10061错,故障点就在后面的代码中。

#11


引用 10 楼 wuyu1998 的回复:
在SocketClient.connect()中,能打印出"Connect server successed!",应该是连上了。
但后面报错,说明未连上。
因此,在打印"Connect server successed!"信息之后,检测能否ping服务器。
如果不能,故障点就确定了。
如果能ping通,但还是报10061错,故障点就在后面的代码中。


一直是能ping通的 ,不管是connect之前还是之后,应该是服务器那边主动拒绝接受的问题,
这里client应该没问题,因为linux对linux是可以发送的。

#12


估计7楼那堆错误来自LogClient,感觉你的异常处理写的随意了点,不易看出对应的位置..

#13


实在不行,就截包。
将linux ==> linux和windows ==> linux的收发包都截下来,然后对比。

#14


异常的时候打印下traceback , 可以查下这个模块的接口,看下具体异常堆栈信息

#15


比较简单的办法,
代码中使用traceback来跟踪输出,  并使用编辑器的debug功能,一行一行调试, 检测执行到哪行代码出错.