Jason-Jessica

Java

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  5 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks
问题的产生:软件公司组织内部培训,有时投影仪(资源)紧缺,培训时没有投影仪,在这种情况下每个人只能打开自己的电脑,边听边翻演讲者提供的PPT或者相关资料。这样可能会导致听众不能及时跟上演讲者的思路,以致培训失败。
需求:将投影仪电子化,大家的屏幕显示与演讲者一致。屏幕数20个左右。
设计:开发语言:java
        IDE:Eclipse
        开发思路:使用socket机制使得演讲者的机器和听众的机器进行通讯。演讲者的机器作为服务端,听众的机器作为客户端,服务端每隔1秒截屏一次,客户端每个2秒去服务端取一次截屏图片数据并显示。
详细设计:
主程序mainapp.java:
 1 package cn.com.lz.sharescreen;
 2 import java.awt.EventQueue;
 3 
 4 import javax.swing.JFrame;
 5 import javax.swing.JButton;
 6 import javax.swing.JSplitPane;
 7 import javax.swing.JToolBar;
 8 import javax.swing.JRadioButton;
 9 import javax.swing.JTextField;
10 import javax.swing.JLabel;
11 import javax.swing.event.ChangeListener;
12 import javax.swing.event.ChangeEvent;
13 import javax.swing.JDesktopPane;
14 import java.awt.event.ActionListener;
15 import java.awt.event.ActionEvent;
16 
17 
18 public class mainapp {
19 
20     private JFrame frmAgreecomm;
21     private JTextField textField;
22 
23     /**
24      * Launch the application.
25      */
26     public static void main(String[] args) {
27         EventQueue.invokeLater(new Runnable() {
28             public void run() {
29                 try {
30                     mainapp window = new mainapp();
31                     window.frmAgreecomm.setVisible(true);
32                 } catch (Exception e) {
33                     e.printStackTrace();
34                 }
35             }
36         });
37     }
38 
39     /**
40      * Create the application.
41      */
42     public mainapp() {
43         initialize();
44     }
45 
46     /**
47      * Initialize the contents of the frame.
48      */
49     private void initialize() {
50         frmAgreecomm = new JFrame();
51         frmAgreecomm.setTitle("AGREE_COMM");
52         frmAgreecomm.setBounds(100100561245);
53         frmAgreecomm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
54         frmAgreecomm.getContentPane().setLayout(null);
55         
56         JButton btnRun = new JButton("\u672C\u673A\u5145\u5F53\u670D\u52A1\u7AEF\uFF0C\u5176\u4ED6\u673A\u5668\u53EF\u4EE5\u8FDE\u63A5\u81F3\u672C\u673A");
57         btnRun.addActionListener(new ActionListener() {
58             public void actionPerformed(ActionEvent e) {
59                 ServerScreen frame = new ServerScreen();
60                 frame.setVisible(true);
61             }
62         });
63         btnRun.setBounds(754541023);
64         frmAgreecomm.getContentPane().add(btnRun);
65         
66         textField = new JTextField();
67         textField.setBounds(15011612421);
68         frmAgreecomm.getContentPane().add(textField);
69         textField.setColumns(10);
70         
71         JLabel lblServerip = new JLabel("ServerIP\uFF1A");
72         lblServerip.setBounds(751196515);
73         frmAgreecomm.getContentPane().add(lblServerip);
74         
75         JButton btnClose = new JButton("\u672C\u673A\u8FDE\u63A5\u81F3\u670D\u52A1\u7AEF");
76         btnClose.addActionListener(new ActionListener() {
77             public void actionPerformed(ActionEvent e) {
78                 ClientScreen frame = new ClientScreen(textField.getText());
79     
80             }
81         });
82         btnClose.setBounds(31311516823);
83         frmAgreecomm.getContentPane().add(btnClose);
84     }
85 }
86 
抓图程序:
package cn.com.lz.sharescreen;

import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import javax.imageio.ImageIO;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;



public class CaptureScreen implements Runnable{
    
public static void main ( String [] args ) throws InterruptedException{
    
//测试生成缩略图
    createThumbnail("c:\\555.gif"200200100"c:\\uuuu.jpg");
    
//测试捕捉屏幕,每隔一秒捕获一次
    String path = "c:\\screen\\";
    
int i = 0;
    
for ( ;; )
    {
        i
++;
        String filepath 
= path + i + ".jpg";
        snatchScreen(filepath);
        Thread.currentThread().sleep(
2000);
    }

}

/**
* 处理图片,改变起大小,可进行缩略和放大
@param filename 源文件名称
@param thumbWidth  处理后宽度
@param thumbHeight 处理后高度
@param quality     品质 最高100,最小0
@param outFilename  输出文件名称
*/

    
public static void createThumbnail ( String filename, int thumbWidth, int thumbHeight, int quality, String outFilename )
    {
        Image image 
= Toolkit.getDefaultToolkit().getImage(filename);
        MediaTracker mediaTracker 
= new MediaTracker(new Container());
        mediaTracker.addImage(image, 
0);
        
try
        {
            mediaTracker.waitForID(
0);
            
double thumbRatio = (double) thumbWidth / (double) thumbHeight;
            
int imageWidth = image.getWidth(null);
            
int imageHeight = image.getHeight(null);
            
double imageRatio = (double) imageWidth / (double) imageHeight;
            
if ( thumbRatio < imageRatio )
            {
                thumbHeight 
= (int) ( thumbWidth / imageRatio );
            }
            
else
            {
                thumbWidth 
= (int) ( thumbHeight * imageRatio );
            }
            BufferedImage thumbImage 
= new BufferedImage(thumbWidth,
            thumbHeight, BufferedImage.TYPE_INT_RGB);
            Graphics2D graphics2D 
= thumbImage.createGraphics();
            graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            graphics2D.drawImage(image, 
00, thumbWidth, thumbHeight, null);
            BufferedOutputStream out 
= new BufferedOutputStream(new FileOutputStream(outFilename));
            JPEGImageEncoder encoder 
= JPEGCodec.createJPEGEncoder(out);
            JPEGEncodeParam param 
= encoder.getDefaultJPEGEncodeParam(thumbImage);
            quality 
= Math.max(0, Math.min(quality, 100));
            param.setQuality((
float) quality / 100.0ffalse);
            encoder.setJPEGEncodeParam(param);
            encoder.encode(thumbImage);
            out.close();
        }
        
catch ( Exception e )
        {
            e.printStackTrace();
        }
    }
    
    
/**
    * 抓取电脑屏幕
    * 
@param path
    
*/
    
public static void snatchScreen ( String path )
    {
        Robot robot;
        
try
        {
            robot 
= new Robot();
            Dimension d 
= Toolkit.getDefaultToolkit().getScreenSize();
            Rectangle rect 
= new Rectangle(00, d.width, d.height);
            BufferedImage image 
= robot.createScreenCapture(rect);
            ImageIO.write(image, 
"jpg"new File(path));
        }
        
catch ( Exception e )
        {
            System.out.println(
"Failed to snatch screen  ");
            e.printStackTrace();
        }
    
    }

    @Override
    
public void run() {
        String path 
= "c:\\screen\\";
        String filepath 
= path + "cs.jpg";
        
while(true){
            snatchScreen(filepath);
            
            
try {
                Thread.currentThread().sleep(
2000);
            } 
catch (InterruptedException e) {
                
// TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
        
    }

}


户端程序:

package cn.com.lz.sharescreen;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;

import javax.imageio.stream.MemoryCacheImageInputStream;
import javax.imageio.stream.MemoryCacheImageOutputStream;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JMenuBar;
import javax.swing.border.LineBorder;
import java.awt.Color;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JButton;



public class ClientScreen extends JFrame implements Runnable{
    
private  String IP;
    Image ima
=Toolkit.getDefaultToolkit().getImage("C:\\360buy1.jpg");  

    
//ImageIcon ima = new ImageIcon("C:\\360buy1.jpg");
    public ClientScreen(String IP) {
        setTitle(
"\u5BA2\u6237\u7AEF");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(
100100668433);
        
this.IP=IP;
        
this.setVisible(true);
        
        
new Thread(this).start();
    }
    
public void paint(Graphics g){
        
super.paint(g);
        g.drawLine(
1010100100);
        
        g.drawImage(ima, 
00this);
    }
    
public void run(){
        
while(true){
            
try {
                Thread.sleep(
2000);
                 
            } 
catch (InterruptedException e) {
                
// TODO Auto-generated catch block
                e.printStackTrace();
            }
            MyClient mc
=new MyClient();
            mc.start();
            
//System.out.print(111111111);
            repaint();
        }
            
    }
    
public class MyClient extends Thread{   
        Socket socket 
= null;   
        
public void run(){
            
try {
                socket 
= new Socket(IP, 1111);            
                DataOutputStream doc 
= new DataOutputStream(socket.getOutputStream());   
                ObjectInputStream in 
= new ObjectInputStream(socket.getInputStream());   
                doc.writeUTF(
"list11111"); 
                doc.flush();
                
long len = in.readLong();
                System.out.print(len);
                FileInputStream fis
= new FileInputStream((File)in.readObject());
                
byte[] b=new byte[(int) len];
                fis.read(b);
                ima
=Toolkit.getDefaultToolkit().createImage(b);
                fis.close();
                doc.close();
                in.close();
                doc.close();   
                in.close();   
                socket.close();   
            } 
catch (UnknownHostException e) {
                e.printStackTrace();
            } 
catch (IOException e) {
                e.printStackTrace();
            } 
catch (ClassNotFoundException e) {
                
// TODO Auto-generated catch block
                e.printStackTrace();
            } 
finally {
                
            }   
        }
    } 
}
服务端程序:

package cn.com.lz.sharescreen;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Image;
import java.awt.Toolkit;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JEditorPane;


public class ServerScreen extends JFrame {

    
private JPanel contentPane;
    
public JEditorPane editorPane;

    
public ServerScreen() {
        setTitle(
"Server");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(
100100399446);
        contentPane 
= new JPanel();
        contentPane.setBorder(
new EmptyBorder(5555));
        contentPane.setLayout(
new BorderLayout(00));
        setContentPane(contentPane);
        
        editorPane 
= new JEditorPane();
        contentPane.add(editorPane, BorderLayout.CENTER);
        MyServer myserver
=new MyServer(); 
        myserver.start();
        
new Thread(new CaptureScreen()).start();
    }
    
public class MyServer extends Thread {
        
public MyServer(){
            
super();
            editorPane.setText(
"Welcome to use Agree_Comm"+"\n");
        }
        
public void run(){
            doListen();
            
        }
        
public void doListen() {   
            ServerSocket server;   
            
try {   
                server 
= new ServerSocket(1111);   
                
while (true) {   
                    Socket client 
= server.accept();   
                    
new Thread(new SSocket(client)).start();   
                }   
            } 
catch (IOException e) {   
                e.printStackTrace();   
            }   
        }   
      
        
//服务器进程   
        class SSocket implements Runnable {   
      
            Socket client;   
      
            
public SSocket(Socket client) {   
                
this.client = client;   
            }   
      
            
public void run() {   
                DataInputStream input;   
                ObjectOutputStream output; 

                
try {   
                    File img
=new File("C:\\screen\\cs.jpg");
                    
                    input 
= new DataInputStream(client.getInputStream());   
                    output 
= new ObjectOutputStream(client.getOutputStream());   
                    
//   
                    String listMsg = input.readUTF();  
                    Toolkit t
=getToolkit();
         
                    
long fis_len=img.length();
                    System.out.print(
"fis_len:"+fis_len);
                    output.writeLong(fis_len);
                    output.flush();
                    
                    editorPane.setText(editorPane.getText()
+"\n"+"Recive:   " + listMsg);
                    
//System.out.println("Recive:   " + listMsg);   
                    
//listMsg = input.readUTF();   
                    
//output.writeUTF("Recive Second:  " + listMsg + "    \r\n Thx");  
                    
//editorPane.setText(editorPane.getText()+"\n"+"Recive:   " + listMsg);
                    
//System.out.println("Recive Second:   " + listMsg); 
                    
                    output.writeObject(img);
                    output.flush();
                    input.close();
                    output.close();
                    client.close();
                } 
catch (IOException e) {   
                    e.printStackTrace();   
                } 
                
finally{
                    
                    
                }

            }   
        }   


    }
}






聚沙成洲,奋发超越。
posted on 2011-11-02 14:19 JasonLee 阅读(219) 评论(0)  编辑  收藏 所属分类: Communication(Socket)

只有注册用户登录后才能发表评论。


网站导航: