java用Socket实现的远程桌面浏览&n…
来源:互联网 发布:双硬盘ubuntu安装win10 编辑:程序博客网 时间:2024/05/16 13:54
转自http://fluagen.blog.51cto.com/146595/425818
用socket做长连接时,出现了内存溢出的错误。搞了4天的时间总算是搞定了。
现总结下:
1.socket一般分为短连接和长连接。
长连接是一旦一个客户端登陆上服务器,其与服务器之间的连接就不关闭,不管他们之间进行了多少次交易,直到客户端退出登陆或网络出现故障。这种技术在联机交易系统实现有利于提高效率。
长:connect连上后不断开,
2.短连接进行一次连接做完业务逻辑处理后就关闭连接,关闭了socket连接也就释放了socket所占用的资源,所以不会出现内存溢出的问题。
长连接一般是连接上服务器后,会做一个循环的业务逻辑处理。如果这个时候我们不得不在循环里创建对象发送到服务器端做处理然后服务器端(反之亦然),那么就有可能出现内存溢出的问题。
例如下面实现的远程桌面的程序:
服务器端
- com.hjdf.calis.cvrs.util.CvrsSystem.println(serverPort
+ "等待连接中......" ); -
serverSkt.setSoTimeout( -
clientSkt = serverSkt.accept(); -
com.hjdf.calis.cvrs.util.CvrsSystem.println(serverPort+ + -
clientSkt.getInetAddress() + 建立连接" ); -
clientSkt.setSoTimeout( -
ObjectOutputStream out = ObjectOutputStream(clientSkt.getOutputStream()); -
ObjectInputStream in= ObjectInputStream(clientSkt.getInputStream()); -
-
ObjectOutputStream pipeout = ObjectOutputStream(outputstream); -
ObjectInputStream pipein = ObjectInputStream(inputstream); -
String pipstr= -
-
pipstr = (String) pipein.readObject(); -
(pipstr null)!= { -
out.writeObject(pipstr); -
} -
iswrite = -
} -
out.writeObject(pipstr); -
out.flush(); -
} -
ScreenImageInfo screenInfo= (ScreenImageInfo)in.readObject(); -
-
pipeout.writeObject(screenInfo); -
-
pipstr = (String) pipein.readObject(); -
(pipstr null)!= { -
out.writeObject(pipstr); -
} -
iswrite = -
} -
out.writeObject(pipstr); -
out.flush(); -
} -
screenInfo= (ScreenImageInfo)in.readObject(); -
-
}
客户端
- ObjectInputStream
in= ObjectInputStream(clientSkt.getInputStream()); -
Toolkit toolkit = Toolkit.getDefaultToolkit(); -
Dimension screenSize = toolkit.getScreenSize(); -
Rectangle screenRect = Rectangle(screenSize); -
Robot robot = Robot(); -
ObjectOutputStream out = ObjectOutputStream(clientSkt.getOutputStream()); -
( null)(clientCom = (String) in.readObject()) != { -
-
(clientCom.equals( "GET")){ -
BufferedImage image = robot.createScreenCapture(screenRect); -
ByteArrayOutputStream byteOutStream = ByteArrayOutputStream(); -
JPEGImageEncoder encoder = -
JPEGCodec.createJPEGEncoder(byteOutStream); -
-
JPEGEncodeParam param = encoder.getDefaultJPEGEncodePara m(image); -
param.setQuality( false); -
encoder.setJPEGEncodeParam(param); -
encoder.encode(image); -
ScreenImageInfo imageInfo = -
ScreenImageInfo(byteOutStream.toByteArray()); -
out.writeObject(imageInfo); -
} -
}
修改服务器端和客户端,解决内存溢出:
服务器
- com.hjdf.calis.cvrs.util.CvrsSystem.println(serverPort
+ "等待连接中......" ); -
serverSkt.setSoTimeout( -
clientSkt = serverSkt.accept(); -
com.hjdf.calis.cvrs.util.CvrsSystem.println(serverPort+ + -
clientSkt.getInetAddress() + 建立连接" ); -
clientSkt.setSoTimeout( -
-
-
ObjectInputStream in= ObjectInputStream(clientSkt.getInputStream()); -
ObjectOutputStream pipeout = ObjectOutputStream(outputstream); -
ScreenImageInfo screenInfo= (ScreenImageInfo)in.readObject(); -
-
pipeout.writeObject(screenInfo); -
} -
}
客户端
- Toolkit
toolkit = Toolkit.getDefaultToolkit(); -
Dimension screenSize = toolkit.getScreenSize(); -
Rectangle screenRect = Rectangle(screenSize); -
Robot robot = Robot(); -
-
ObjectOutputStream out = ObjectOutputStream(clientSkt.getOutputStream()); -
BufferedImage image = robot.createScreenCapture(screenRect); -
ByteArrayOutputStream byteOutStream = ByteArrayOutputStream(); -
JPEGImageEncoder encoder = -
JPEGCodec.createJPEGEncoder(byteOutStream); -
-
JPEGEncodeParam param = encoder.getDefaultJPEGEncodePara m(image); -
param.setQuality( false); -
encoder.setJPEGEncodeParam(param); -
encoder.encode(image); -
ScreenImageInfo imageInfo = -
ScreenImageInfo(byteOutStream.toByteArray()); -
out.writeObject(imageInfo); -
}
- java用Socket实现的远程桌面浏览&n…
- VC++实现窗口的任意分割 --&n…
- 用JAVA实现的远程桌面控制功能
- 一步一步教你用 java&n…
- iphone实现NavigationController&n…
- java.lang.ArithmeticException:&n…
- java.io.FileNotFoundException:&n…
- 浏览一个Flex技术交流网站,看到的&…
- 利用socket实现服务器和客户端的远程桌面
- 0819—Linux_( 实现 ls&n…
- PageBean方式实现分页效果 &n…
- localForage——轻松实现 Web&n…
- 用java实现在命令方式清屏(native&…
- Java JFrame 设计视图&n…
- 最新JAVA学习路线 --&n…
- JAVA中Action层, Service层&n…
- Java中Could not find&n…
- java实现远程桌面监控
- Shower Line
- Hibernate入口之Configuration
- Android反编译
- 用算法计算出算术表达式:(56-20)/(4+2)的值
- 诺斯悖论
- java用Socket实现的远程桌面浏览&n…
- React-Native频繁修改IP,烦吗
- UIVIewController自定义切换效果
- Java中数据输入输出流——DataInputS…
- 开源项目导入eclipse的一般步骤
- 如何建立一个maven工程导入m…
- Java网络编程(1) Socket缓…
- Android开发 旋转屏幕导致Act…
- Android点击事件实例之通过…