该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
import java.awt.Dimension;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import java.util.zip.Deflater;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import javax.imageio.ImageIO;
/*
* ly 2014-11-20
* 该类实时发送截屏消失,多线程实现,不包含鼠标信息,且没有做对每个Client做
*/
publicclass MultiSendScreen
{
public static int SERVER_PORT=8000;
private static int SEND_IMAGE_SYMBOL=11;
private Robot robot;
public Dimension screen;
public Rectangle rect ;
public static void main(String args[])
{
new MultiSendScreen(SERVER_PORT);
}
//构造方法 开启套接字连接 机器人robot 获取屏幕大小
public MultiSendScreen(int SERVER_PORT)
{
try {
ServerSocket serverSocket = new ServerSocket(SERVER_PORT);
serverSocket.setSoTimeout(864000000);
robot = new Robot();
screen = Toolkit.getDefaultToolkit().getScreenSize(); //获取主屏幕的大小
rect = new Rectangle(screen);
int numClient = 1;
while(true)
{
Socket client = serverSocket.accept();
System.out.println("连接一个客户端并开启一个线程,编号为:"+numClient+" 时间是:"+ new Date()+"\n");
InetAddress inerAddress = client.getInetAddress();
System.out.println("客户"+numClient+"的IP主机地址是:"+inerAddress.getHostAddress()+"\n");
HandleAclient task = new HandleAclient(client);
new Thread(task).start();
numClient++;
}
} catch (Exception e) {
e.printStackTrace();
}
//构造屏幕大小的矩形
}
class HandleAclient implements Runnable
{
private Socket client;
public HandleAclient(Socket client)
{
this.client = client;
}
@Override
public void run()
{
//实时等待接收截屏消息
while(true)
{
try{
BufferedImage img = robot.createScreenCapture(rect); //屏幕截图
BufferedImage cursor= ImageIO.read(new File("img/cursor.png")); //把鼠标加载到缓存中
Point p= MouseInfo.getPointerInfo().getLocation(); //获取鼠标坐标
img.createGraphics().drawImage(cursor, p.x, p.y, null); //在图片画上鼠标
//把图片写到字节数组中
ByteArrayOutputStream byte_out = new ByteArrayOutputStream(); //创建字节流
ImageIO.write(img,"jpg", byte_out); //使用ImageIO把图片写入字节流!!
byte_out.flush();
byte[] data = byte_out.toByteArray(); //字节流转换成字节数组
//将生成的字节数组进行压缩
ZipOutputStream zos = new ZipOutputStream(byte_out);
zos.setLevel(Deflater.BEST_COMPRESSION);
zos.putNextEntry(new ZipEntry("ScreenCapture.jpg"));
zos.write(data);
zos.closeEntry();
zos.close();
//发送字节数组
DataOutputStream dout = new DataOutputStream(client.getOutputStream());
dout.write(SEND_IMAGE_SYMBOL);
System.out.println("写入标识符:"+SEND_IMAGE_SYMBOL);
dout.writeInt(data.length);
System.out.println("写入图片长度:"+data.length);
dout.write(data);
dout.flush();
//图片 -- 数组 数组字节流 压缩字节数组流 写出被压缩后的字节数组
/*
DataOutputStream dout = new DataOutputStream(client.getOutputStream());
//把字节放到管道中输出
dout.write(SEND_IMAGE_SYMBOL);
System.out.println("写入标识符:"+SEND_IMAGE_SYMBOL);
dout.writeInt(data.length);
System.out.println("写入图片长度:"+data.length);
dout.write(data);
dout.flush();
*/
} catch (IOException ioe) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("连接断开");
} finally {
if (client != null) {
try {
client.close();
} catch (IOException e) {e.printStackTrace();}
}
}
}
}
}
}