| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 934 人关注过本帖
标题:Socket编程,关于SocketException异常
只看楼主 加入收藏
chowchow616
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2006-7-16
收藏
 问题点数:0 回复次数:2 
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 
2007-10-01 17:19
狂放不羁
Rank: 4
等 级:贵宾
威 望:12
帖 子:925
专家分:0
注 册:2007-1-24
收藏
得分:0 
以下是引用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){
}

2007-10-01 18:02
chowchow616
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2006-7-16
收藏
得分:0 
回复:(狂放不羁)以下是引用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个报文发送和接收,程序就不再报告异常。
所以,问题会不会出现在,网络编程中,报文的长度有一个上限值?长度超过这个上限,程序就会有异常产生。

2007-10-02 10:21
快速回复:Socket编程,关于SocketException异常
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016125 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved