当前位置: 代码迷 >> Java相关 >> Socket编程,关于SocketException异常
  详细解决方案

Socket编程,关于SocketException异常

热度:482   发布时间:2007-10-01 17:19:24.0
Socket编程,关于SocketException异常
我刚写了个Socket程序,服务器端向客户端传送一个文件。
程序在执行的时候,发送比较小的文件时不会发生异常(我试了一下,大约500kB以下)。可是当发送比较大的多媒体文件的时候,就会有异常产生。异常的具体信息是:
java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at java.io.BufferedOutputStream.write(BufferedOutputStream.java:105)
at server.Server.sendMusicFileToClient(Server.java:104)
at server.Server.<init>(Server.java:50)
at server.Server.main(Server.java:116)
不知道这是什么原因造成的,希望有哪位达人,能帮忙解答一下。谢谢

代码如下:
服务器端:
messageOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(serverSocket.getOutputStream())),true);
localFile=new BufferedInputStream(new FileInputStream(filePath+"\\"+selectedFile));
dataOut=new BufferedOutputStream(serverSocket.getOutputStream());
try{
File file=new File(filePath+"\\"+selectedFile);
int fileLength=(int)file.length();
messageOut.println((new Integer(fileLength)).toString());
byte[] musicData=new byte[fileLength];
localFile.read(musicData, 0, fileLength);
dataOut.write(musicData, 0, fileLength);
dataOut.flush();
localFile.close();
dataOut.close();
}catch(Exception e)
客户端:
try{
int fileLength;
fileLength=Integer.parseInt(messageIn.readLine());
byte[] musicData=new byte[fileLength];
dataIn=new BufferedInputStream(clientSocket.getInputStream());
localFile=new BufferedOutputStream(new FileOutputStream("music/"+selectedMusicName));
dataIn.read(musicData, 0, fileLength);
localFile.write(musicData, 0, fileLength);
localFile.flush();
dataIn.close();
localFile.close();
}catch(Exception e){
}
搜索更多相关的解决方案: Socket  

----------------解决方案--------------------------------------------------------
以下是引用chowchow616在2007-10-1 17:19:24的发言:
我刚写了个Socket程序,服务器端向客户端传送一个文件。
程序在执行的时候,发送比较小的文件时不会发生异常(我试了一下,大约500kB以下)。可是当发送比较大的多媒体文件的时候,就会有异常产生。异常的具体信息是:
java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at java.io.BufferedOutputStream.write(BufferedOutputStream.java:105)
at server.Server.sendMusicFileToClient(Server.java:104)
at server.Server.<init>(Server.java:50)
at server.Server.main(Server.java:116)
不知道这是什么原因造成的,希望有哪位达人,能帮忙解答一下。谢谢

代码如下:
服务器端:
messageOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(serverSocket.getOutputStream())),true);
localFile=new BufferedInputStream(new FileInputStream(filePath+"\\"+selectedFile));
dataOut=new BufferedOutputStream(serverSocket.getOutputStream());
try{
File file=new File(filePath+"\\"+selectedFile);
int fileLength=(int)file.length();估计是你的这地方错了,把int换为long
messageOut.println((new Integer(fileLength)).toString());
byte[] musicData=new byte[fileLength];
localFile.read(musicData, 0, fileLength);
dataOut.write(musicData, 0, fileLength);
dataOut.flush();
localFile.close();
dataOut.close();
}catch(Exception e)
客户端:
try{
int fileLength;
fileLength=Integer.parseInt(messageIn.readLine());
byte[] musicData=new byte[fileLength];
dataIn=new BufferedInputStream(clientSocket.getInputStream());
localFile=new BufferedOutputStream(new FileOutputStream("music/"+selectedMusicName));
dataIn.read(musicData, 0, fileLength);
localFile.write(musicData, 0, fileLength);

localFile.flush();
dataIn.close();
localFile.close();
}catch(Exception e){
}


----------------解决方案--------------------------------------------------------

回复:(狂放不羁)以下是引用chowchow616在2007-10-1...
谢谢:)
我刚才试了一下。但是,数组的长度,用long定义好像是不允许的。程序会报错。
我后来通过一种方法,差不多解决了这个问题。
如下:
把原来的发送报文和接受报文的
dataOut.write(musicData, 0, fileLength); //server端

dataIn.read(musicData, 0, fileLength); //client端
分别换成了
for(int i=0;i<100;i++) //server端
dataOut.write(musicData, fileLength/100*i, fileLength/100);

for(int i=0;i<100;i++) //client端
dataIn.read(musicData, fileLength/100*i, fileLength/100);
即把文件分成100个报文发送和接收,程序就不再报告异常。
所以,问题会不会出现在,网络编程中,报文的长度有一个上限值?长度超过这个上限,程序就会有异常产生。

----------------解决方案--------------------------------------------------------
  相关解决方案