但是把客户端放到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
我try catch了
错误信息就是Error 10061
没其他的了!!
#3
10061是连接都没有建立起来的,你在哪看到 socket 已经连接了?
#4
没有连接的话,估计服务器那方系统有防火墙阻挡,设置开放对应端口...
#5
try:
self.sockobj.connect((self.serverHost, self.serverPort))
connected = True
print "Connect server successed!"
这句话足可以说明,已经连接上了啊!
#6
没有连接的话,估计服务器那方系统有防火墙阻挡,设置开放对应端口...
防火墙是全部关掉了的,从windows向linux是ping通的,并且telnet + ip + 端口,是通的。
而且经测试发现linux向linux发送也是成功的。
不知道为什么linux拒绝windows的发送?!?
#7
最好贴出完整错误信息...
完整信息如下:
#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
在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)
不知道你的回答的意思是什么,完全不对啊
#10
在SocketClient.connect()中,能打印出"Connect server successed!",应该是连上了。
但后面报错,说明未连上。
因此,在打印"Connect server successed!"信息之后,检测能否ping服务器。
如果不能,故障点就确定了。
如果能ping通,但还是报10061错,故障点就在后面的代码中。
但后面报错,说明未连上。
因此,在打印"Connect server successed!"信息之后,检测能否ping服务器。
如果不能,故障点就确定了。
如果能ping通,但还是报10061错,故障点就在后面的代码中。
#11
在SocketClient.connect()中,能打印出"Connect server successed!",应该是连上了。
但后面报错,说明未连上。
因此,在打印"Connect server successed!"信息之后,检测能否ping服务器。
如果不能,故障点就确定了。
如果能ping通,但还是报10061错,故障点就在后面的代码中。
一直是能ping通的 ,不管是connect之前还是之后,应该是服务器那边主动拒绝接受的问题,
这里client应该没问题,因为linux对linux是可以发送的。
#12
估计7楼那堆错误来自LogClient,感觉你的异常处理写的随意了点,不易看出对应的位置..
#13
实在不行,就截包。
将linux ==> linux和windows ==> linux的收发包都截下来,然后对比。
将linux ==> linux和windows ==> linux的收发包都截下来,然后对比。
#14
异常的时候打印下traceback , 可以查下这个模块的接口,看下具体异常堆栈信息
#15
比较简单的办法,
代码中使用traceback来跟踪输出, 并使用编辑器的debug功能,一行一行调试, 检测执行到哪行代码出错.
代码中使用traceback来跟踪输出, 并使用编辑器的debug功能,一行一行调试, 检测执行到哪行代码出错.
#1
最好贴出完整错误信息...
#2
最好贴出完整错误信息...
我try catch了
错误信息就是Error 10061
没其他的了!!
#3
10061是连接都没有建立起来的,你在哪看到 socket 已经连接了?
#4
没有连接的话,估计服务器那方系统有防火墙阻挡,设置开放对应端口...
#5
最好贴出完整错误信息...
我try catch了
错误信息就是Error 10061
没其他的了!!
try:
self.sockobj.connect((self.serverHost, self.serverPort))
connected = True
print "Connect server successed!"
这句话足可以说明,已经连接上了啊!
#6
没有连接的话,估计服务器那方系统有防火墙阻挡,设置开放对应端口...
防火墙是全部关掉了的,从windows向linux是ping通的,并且telnet + ip + 端口,是通的。
而且经测试发现linux向linux发送也是成功的。
不知道为什么linux拒绝windows的发送?!?
#7
最好贴出完整错误信息...
完整信息如下:
#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
在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)
不知道你的回答的意思是什么,完全不对啊
#10
在SocketClient.connect()中,能打印出"Connect server successed!",应该是连上了。
但后面报错,说明未连上。
因此,在打印"Connect server successed!"信息之后,检测能否ping服务器。
如果不能,故障点就确定了。
如果能ping通,但还是报10061错,故障点就在后面的代码中。
但后面报错,说明未连上。
因此,在打印"Connect server successed!"信息之后,检测能否ping服务器。
如果不能,故障点就确定了。
如果能ping通,但还是报10061错,故障点就在后面的代码中。
#11
在SocketClient.connect()中,能打印出"Connect server successed!",应该是连上了。
但后面报错,说明未连上。
因此,在打印"Connect server successed!"信息之后,检测能否ping服务器。
如果不能,故障点就确定了。
如果能ping通,但还是报10061错,故障点就在后面的代码中。
一直是能ping通的 ,不管是connect之前还是之后,应该是服务器那边主动拒绝接受的问题,
这里client应该没问题,因为linux对linux是可以发送的。
#12
估计7楼那堆错误来自LogClient,感觉你的异常处理写的随意了点,不易看出对应的位置..
#13
实在不行,就截包。
将linux ==> linux和windows ==> linux的收发包都截下来,然后对比。
将linux ==> linux和windows ==> linux的收发包都截下来,然后对比。
#14
异常的时候打印下traceback , 可以查下这个模块的接口,看下具体异常堆栈信息
#15
比较简单的办法,
代码中使用traceback来跟踪输出, 并使用编辑器的debug功能,一行一行调试, 检测执行到哪行代码出错.
代码中使用traceback来跟踪输出, 并使用编辑器的debug功能,一行一行调试, 检测执行到哪行代码出错.