关于socket通信中,BufferedReader的readline函数问题

mrelay 2004-06-29 08:08:09
我用java做了一个服务器程序,用来跟vc程序通信,是用BufferedReader
的readline函数,来接收消息的。程序运行之后,有内存泄漏,于是,我做了一个简单服务器程序,只用readline接收数据,收到数据后就把数据删除掉, 别的什么都不做,VC客户端在不断的发送数据过来,VC客户端,在另外一台机器上。但是还是有内存泄漏,感觉像是Readline每次读完数据之后,并不能把缓冲区清空。请问,大家有没有遇到过类似的问题,怎么解决?
...全文
767 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
松耦合紧内聚 2004-06-30
  • 打赏
  • 举报
回复
随便说些!
如果自定义socket通讯协议时候,我会在协议中设计几个byte来存放此次发送数据的大小!
当读到这几个字节的数据,然后根据得到的数据大小开辟一段缓冲,读取数据!
并且如果是VC与java程序网络通信,VC要使用网络字节序格式传递数据!
java程序底层使用DataInput or Output Stream,再包装成其他高级流!
但是我个人还是直接用Data stream发送接收字节数组,来处理!
随便说写!


hykwolf 2004-06-30
  • 打赏
  • 举报
回复
InputStream in = m_socketClient.getInputStream();
byte[] buffer = new byte[512];
int b = 0;
String vc_reader = "";
while(true){
b = in.read(buffer);
if(b<0)
break;
vc_reader += new String(buffer,0,b);
}
in.close();//这个一定需要的,还有如果你用了OutputStream那么也要close();

不建议用readLine读取,请用InputStream直接读取,速度快,而且不会有字符错误
hykwolf 2004-06-30
  • 打赏
  • 举报
回复
没有对OutputStream 和InputStream 进行close()操作么?
Acylas 2004-06-30
  • 打赏
  • 举报
回复
VC客户端在不断的发送数据 这些数据是什么数据?有没有换行或者说有没有包含\r\n之类的?
如果不断发送的数据都没换行的话那就可能出现问题,readline读取数据不能超过2147483647.
不同的语言之间不赞成用readline这种方法读数据
mrelay 2004-06-30
  • 打赏
  • 举报
回复
程序已经很简单了。就以下这几句就有内存泄漏。这几句是放在一个线程里边的。
m_oVcWriter = new PrintStream(m_socketClient.getOutputStream());
m_oVcReader = new BufferedReader(new InputStreamReader(m_socketClient.getInputStream()));
public void run() {
while (true) {
{
try {
String revMsg = m_oVcReader.readLine();
}
revMsg = null;

}
catch (ClassCastException e) {
);
continue;
}
}

}
catch (IOException E) {

//失联
}
}
}
hykwolf 2004-06-30
  • 打赏
  • 举报
回复
你的vc客户端只是发送这些消息么?发送完这些消息后vc客户端是否还要干什么其他的事情呢?
如果他只是发送这些message的话,那么请在他发送完毕后关闭连接,等待下次发送的时候重新创建连接.
你的数据读取是在你的子线程中完成的
你的每个子线程都是一个clientSocket
这样你的每一个子线程都存在一个连接,他们占用你的系统资源,你需要close()掉他
比如
{
这是一个主线程
while(true){
建听到了一个vc请求,开辟一个新的线程读取这次的vc发送的消息
ReadMsg read = new ReadMsg(clientSocket);
read.start();
}
}
那么这个ReadMsg中需要做的是向上面那样读取你vc发送过来的message
读取完毕后需要调用OutputStream InputStream Socket 3个对象的close()方法,这里的socket是传入的clientSocket,虽然只关闭socket会自动释放掉Stream的,但还是建议先关闭Stream的,在关闭Socket的。
hesi726 2004-06-30
  • 打赏
  • 举报
回复
打印打印接收到的 revMsg 看看!
另外,记录并输出接收到的字节的总长度看看!!


详细看看 BufferedReader 的说明

mrelay 2004-06-30
  • 打赏
  • 举报
回复
刚开始的时候内存还不长,但是,过了一段时间之后,内存就开始长了。
close()操作 是要到通信结束之后,才能调用吧。我要不停的等待接收数据。
这跟VC程序编写有关系吗? 是不是VC程序,有什么错误呀?
Acylas 2004-06-29
  • 打赏
  • 举报
回复
是你程序没处理好,程序处理好了肯定不会出现这个问题的。要不你贴出你相关程序检查一下

13,100

社区成员

发帖
与我相关
我的任务
社区描述
Java J2ME
社区管理员
  • J2ME社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧