已经发过两个贴子求助,再简单描述下我的问题:
自已开发的程序,C-S架构,server(多线程)用来接收日志文件,client(多网点设备)用来上传日志,在大多数的client设备上程序运行很正常,最近有一批新设备上,运行client后出现了问题,client连上后,server是线程死掉了,client报错后退出,但奇怪的是---client在发送了日志文件的一个字节后(server收到此字节),网络就不通了,需要拔插下client设备的网线水晶头,网络才能恢复......
出现这种问题,太郁闷了,有的同事说我是黑客程序,毕竟网不通了,这台设备就不能用这程序了,只有人工传日志了
各位前辈 多指教 谁遇到过这种问题
主要两个问题
1:问题出在server还是client??程序怎么会执行不下去 只收了一个字节
2:收了一个字节后 网络为什么不通了??!!我的client端程序如下(节选)
FileInputStream fis = new FileInputStream(fileName);
int data;
while ( -1 != ( data = fis.read( ) ) )
{
os.write( data );
}
os.flush();
......
System.out.println( "send file success!!" );
在一台设备上
client端设备上执行后 只从文件发送了一个字节 发送到server端后,client程序便出错退出了(server收到了此字节) 我的server端程序节选如下
.........
System.out.println(fileName);
fos = new FileOutputStream(fileName);
int data;
while ( -1 != ( data = is.read( ) ) )
{
fos.write( data );
}
fos.flush();
......
server.myface.flyOutputStream("接收文件成功!!");
client端出错后退出 printStackTrace()错误提示如下 :
java.net:SocketException: connection reset by peer :socket write error
......................
......................
自已开发的程序,C-S架构,server(多线程)用来接收日志文件,client(多网点设备)用来上传日志,在大多数的client设备上程序运行很正常,最近有一批新设备上,运行client后出现了问题,client连上后,server是线程死掉了,client报错后退出,但奇怪的是---client在发送了日志文件的一个字节后(server收到此字节),网络就不通了,需要拔插下client设备的网线水晶头,网络才能恢复......
出现这种问题,太郁闷了,有的同事说我是黑客程序,毕竟网不通了,这台设备就不能用这程序了,只有人工传日志了
各位前辈 多指教 谁遇到过这种问题
主要两个问题
1:问题出在server还是client??程序怎么会执行不下去 只收了一个字节
2:收了一个字节后 网络为什么不通了??!!我的client端程序如下(节选)
FileInputStream fis = new FileInputStream(fileName);
int data;
while ( -1 != ( data = fis.read( ) ) )
{
os.write( data );
}
os.flush();
......
System.out.println( "send file success!!" );
在一台设备上
client端设备上执行后 只从文件发送了一个字节 发送到server端后,client程序便出错退出了(server收到了此字节) 我的server端程序节选如下
.........
System.out.println(fileName);
fos = new FileOutputStream(fileName);
int data;
while ( -1 != ( data = is.read( ) ) )
{
fos.write( data );
}
fos.flush();
......
server.myface.flyOutputStream("接收文件成功!!");
client端出错后退出 printStackTrace()错误提示如下 :
java.net:SocketException: connection reset by peer :socket write error
......................
......................
从你的叙述中发现,server端线程死掉了。 是server端线死掉client端菜报错的吧?排查步骤:
1. server端仅启动一个线程,排除多线程资源竞争的问题
2. 别直接读一个字节就开始写文件,写到ByteArrayOutputStream排除是写文件的问题看还有错吗
1. server端仅启动一个线程,排除多线程资源竞争的问题
这种情况应该不存在,server不忙时,线程也会死掉
2. 别直接读一个字节就开始写文件,写到ByteArrayOutputStream排除是写文件的问题
ByteArrayOutputStream这个流我不太会用另外1:为什么是新设备会出现这种情况
2:我改了下client程序 加上了 os.flush();(上面帖的程序帖错了,是修改后的 修改前没有s.flush())之后 client端现在不报错了 显示send file success!!,但server还是只写了一个字节
后,就是走不出循环,不显示“接收文件成功”,线程死掉,网不通
不太明白,实际上写了不少,写到哪儿去了????不是写到文件里?
fos.write( data ); 这句是往文件里写呀
还有 socket的传输机制是什么 ?
client和server不同步吗? (client传一个字节 server接收一个字节 client再传......)
写文件也会有buffer,不会直接往文件写,这就是为什么会有fos.flush()。给你一个通用的读流的代码:
public static void copyStream(InputStream source, OutputStream dest,
int bufferSize) throws IOException {
if (bufferSize <= 0) {
bufferSize = DEFAULT_BUFFER_SIZE;
} int bytesToWrite;
byte[] buffer = new byte[bufferSize]; try {
while ((bytesToWrite = source.read(buffer)) != -1) {
// Technically, some read(byte[]) methods may return 0 and we
// cannot accept that as an indication of EOF.
if (bytesToWrite == 0) {
bytesToWrite = source.read();
if (bytesToWrite < 0)
break;
dest.write(bytesToWrite);
continue;
}
dest.write(buffer, 0, bytesToWrite);
}
} catch (IOException e) {
throw e;
} finally {
try {
dest.flush();
} catch (IOException e) {
// ignore
}
try {
source.close();
} catch (IOException e) {
// ignore
}
try {
dest.close();
} catch (IOException e) {
// ignore
}
}
}
问题出在client 将client端程序改了一下 一次读100个字节 通过
byte[] buffer = new byte[100];
.......
while ( -1 != (fis.read( buffer ) ) )
{
os.write( buffer );
os.flish();
}
看来新设备网速快,一个字节一个字节读取不行
但有个新的小问题 由于server没有修改(还是一个字节一个字节读取) 传过来的文件末尾有些文本是重复的 不知为什么