2009-09-04 96 views
-4

我正在做一個客戶端 - 服務器應用程序。 我想用一臺服務器連接多個客戶端。這裏每個客戶端都使用三個端口的服務器連接:多線程多客戶端編程

  • 首先 - 發送圖像
  • 二 - 送鍵盤事件
  • 三 - 送鼠標事件

所有這些信息都發送到服務器,但它在多線程中造成問題。如果我使用單線程,那麼它是可以的,但是在多線程的情況下,由於多個端口而產生問題。 請任何人都可以給我解決方案。

感謝

客戶端代碼:

import java.awt.*; 
    import java.awt.image.BufferedImage; 
    import java.awt.event.*; 
    import javax.swing.*; 
    import java.net.*; 
    import java.io.*; 
    import java.awt.Robot.*; 
    class Client extends JFrame 
    { 
     // port no 143 for sending images... 
     // port no 321 for recieving mouseEvents... 
     // port no 678 for recieving keyEvents... 

     public static void main(String args[]) 
     { 
      new Client(); 
     } 

    /*-----------------------------for Establish Connection------------------*/ 
     Client() 
     { 
      super("10.1.8.123"); 

      setTitle("10.1.8.123"); 
      System.out.println("waiting for permission.."); 
      try 
      { 
       ServerSocket s=new ServerSocket(112); 
       Socket socket=s.accept(); 

       Thread.sleep(0,1); 

      } 

      catch(Exception e) 
      {} 

      setVisible(false); 

      new ImageSender(); 
      new MouseEventsReceiver(); 
      new KeyboardEventsReceiver(); 
     } 
    } 
    /*--------------------------------------------------------------------------*/ 

    class ImageSender implements Runnable 
    {  

     ImageSender() 
     { 
      Thread t=new Thread(this); 
      t.start(); 
     } 

    /*----------------------------------For capture the screen-------------------*/ 
     public void run() 
     { 
      try 
      { 
       Robot r=new Robot(); 
       Toolkit t=Toolkit.getDefaultToolkit(); 
       Rectangle rect=new Rectangle(t.getScreenSize()); 
       while(true) 
       { 
        Socket s=new Socket("10.1.8.107",112);   
        OutputStream out=s.getOutputStream(); 
        ObjectOutputStream oos=new ObjectOutputStream(out); 
        BufferedImage b_img=r.createScreenCapture(rect); 
        ImageIcon img=new ImageIcon(b_img); 
        oos.writeObject(img); 

        Thread.sleep(100); 

        oos.close();  
        out.close(); 
       } 
      } 
      catch(Exception e) 
      { 
       System.out.println("in ImageSender:"+e); 
      } 
     } 
    } 
    /*-----------------------------------------------------------------------------*/ 

    class MouseEventsReceiver implements Runnable 
    { 
     MouseEventsReceiver() 
     { 
      Thread t=new Thread(this); 
      t.start(); 
     } 
     public void run() 
     { 
      System.out.println("inside run...."); 

      try 
      { 
       ServerSocket s=new ServerSocket(113); //must be outside while()...    
       Robot r=new Robot(); 
       while(true) 
       { 
        System.out.println("Socket created at port 321"); 
       // ServerSocket s=new ServerSocket(321); 

        Socket client=s.accept(); 
        System.out.println("after accept..."); 

        InputStream in=client.getInputStream(); 
        ObjectInputStream ois=new ObjectInputStream(in); 

        MouseEvents m=(MouseEvents)ois.readObject(); 
        System.out.println("Mouse Event Received X="+m.getX()); 

        System.out.println("button:="+m.getButton()); 

        r.mouseMove(m.getX(),m.getY()); 
        if(m.getButton()==1) 
        { 
         r.mousePress(InputEvent.BUTTON1_MASK); 
         r.mouseRelease(InputEvent.BUTTON1_MASK); 

        } 
        else if(m.getButton()==2) 
        { 
         r.mousePress(InputEvent.BUTTON2_MASK); 
         r.mouseRelease(InputEvent.BUTTON2_MASK); 
        } 
        else if(m.getButton()==3) 
        { 
         r.mousePress(InputEvent.BUTTON3_MASK); 
         r.mouseRelease(InputEvent.BUTTON3_MASK); 
        } 
        else    
        { 
        }   

        ois.close(); 
        in.close(); 
       } 

      } 
      catch(Exception e) 
      { 
       System.out.println("in mouseEvent Reciever:"+e); 
      } 
     } 
    } 
    /*-----------------------------------------------------------------------------*/ 
    class KeyboardEventsReceiver implements Runnable 
    { 
     KeyboardEventsReceiver() 
     { 
      Thread t=new Thread(this); 
      t.start(); 
     } 
     public void run() 
     { 
      System.out.println("in keyboard run..."); 

      try 
      { 
       Robot r=new Robot(); 
       ServerSocket s=new ServerSocket(114); //must be outside while()...   

       while(true) 
       { 
       // ServerSocket s=new ServerSocket(678);   

        Socket client=s.accept(); 
        InputStream in=client.getInputStream(); 
        ObjectInputStream ois=new ObjectInputStream(in); 
        KeyboardEvents k=(KeyboardEvents)ois.readObject(); 
        System.out.println("Key Received:"+k.getKeyChar()); 
        r.keyPress((char)k.getKeyChar()); 
       // r.keyPress(97); 

        ois.close(); 
        in.close(); 
       } 
      } 
      catch(Exception e) 
      { 
       System.out.println("inside Key board events.."+e); 
      } 
     } 
    } 

服務器代碼:

import java.awt.event.ActionEvent; 
    import java.awt.event.ActionListener; 
    import java.awt.event.KeyEvent; 

    import javax.swing.ImageIcon; 
    import javax.swing.JFrame; 
    import javax.swing.JMenu; 
    import javax.swing.JMenuBar; 
    import javax.swing.JMenuItem; 
    import javax.swing.UIManager; 

    import java.awt.*; 
    import java.awt.event.*; 
    import javax.swing.*; 
    import java.net.*; 
    import java.io.*; 


    public class Menu extends JFrame 
    { 
     public String ip1="10.1.8.106"; 
     public String ip2="10.1.8.108"; 
     public String ip3="10.1.8.109"; 
     public int port=111; 
     public int i; 


     public Menu() 
     { 

      setTitle("Server"); 

      JMenuBar menubar = new JMenuBar(); 

      JMenu file = new JMenu("File"); 
      file.setMnemonic(KeyEvent.VK_F); 

      JMenuItem client1 = new JMenuItem("clt1"); 
      JMenuItem client2 = new JMenuItem("clt2"); 
      JMenuItem client3 = new JMenuItem("clt3"); 

      client1.setMnemonic(KeyEvent.VK_F1); 
      client2.setMnemonic(KeyEvent.VK_F2); 
      client3.setMnemonic(KeyEvent.VK_F3); 

      client1.setToolTipText("Client1 selected"); 
      client2.setToolTipText("Client2 selected"); 
      client3.setToolTipText("Client3 selected"); 

      client1.addActionListener(new ActionListener() 
      { 
       public void actionPerformed(ActionEvent event) 
       { 
         new Screen(ip1,port); 
       } 
      }); 

       client2.addActionListener(new ActionListener() 
      { 
       public void actionPerformed(ActionEvent event) 
       { 
       // port=port+3; 
        new Screen(ip2,port+3); 
       } 
      }); 

       client3.addActionListener(new ActionListener() 
      { 
       public void actionPerformed(ActionEvent event) 
       { 
       // port=port+3; 
        new Screen(ip3,port+6); 
       } 
      }); 


      file.add(client1); 
      file.add(client2); 
      file.add(client3); 

      menubar.add(file); 

      setJMenuBar(menubar); 

      setSize(250, 200); 
      setLocationRelativeTo(null); 
      setDefaultCloseOperation(EXIT_ON_CLOSE); 
      setVisible(true); 
     } 

     public static void main(String[] args) 
     { 

      new Menu(); 

     } 
    } 
    class Screen extends JFrame 
    { 
     // port no 143 for receiving images... 
     // port no 321 for sending mouseEvent... 
     // port no 678 for sending keyEvents... 

     final JFrame frame; 

    /* public static void main(String args[]) 
     { 
      new Screen(); 
     }*/ 
     Screen(String ip,int port) 
     { 
      super("Remote Access Server"); 
      frame=this; 
      try 
      { 
      // port=port+1; 
       Socket s=new Socket(ip,port+1); 

       Thread.sleep(0,1); 
      } 
      catch(Exception e) 
      {} 
      new ImageReceiver(frame,ip,port); 

      setVisible(true); 
     } 
    } 

    /*------------------------------------------------------------------------------------*/ 

    class ImageReceiver extends Window implements Runnable,MouseListener,MouseMotionListener,KeyListener 
    { 
      String ipadd; 
      int port1; 
     ImageReceiver(Frame f,String ip,int port) 
     { 
      super(f); 
      ipadd=ip; 
      port1=port; 
      addMouseListener(this); 
      addMouseMotionListener(this); //f not reqrd bcoz its done on window... 
      f.addKeyListener(this);  //f is required for clicking on frames.... 

      f.requestFocus(); // must required ... 

      Toolkit toolkit=Toolkit.getDefaultToolkit(); 
      setSize(toolkit.getScreenSize()); 

      setVisible(true); 

      Thread t=new Thread(this); 
      t.start(); 
     } 
     public void run() 
     { 
      try 
      { 
       ServerSocket s=new ServerSocket(port1+1); 
       while(true) 
       { 
        Socket socket=s.accept(); 
        setBackground(Color.black); 
        InputStream in=socket.getInputStream(); 
        ObjectInputStream ois=new ObjectInputStream(in); 
        ImageIcon img=(ImageIcon)ois.readObject(); 
        Graphics g=getGraphics(); 
        img.paintIcon(this,g,0,0); 
       } 
      } 
      catch(Exception e) 
      { 
       System.out.println(e); 
      } 
     } 
     /*--------------------------mouse events...----------------------------------------*/ 
     public void mouseClicked(MouseEvent m) 
     { 
      System.out.println("mouse clicked"); 
      sendPacket(new MouseEvents(m.getX(),m.getY(),m.getButton())); 
     } 
     public void mousePressed(MouseEvent m) 
     { 
     } 
     public void mouseReleased(MouseEvent m) 
     { 
     } 
     public void mouseEntered(MouseEvent m) 
     { 
     } 
     public void mouseExited(MouseEvent m) 
     { 
     } 
     public void mouseMoved(MouseEvent m) 
     { 
      sendPacket(new MouseEvents(m.getX(),m.getY())); 

     } 

     public void mouseDragged(MouseEvent m) 
     { 
    //  sendPacket(new MouseEvents(m.getX(),m.getY(),m.getButton())); 
     } 

     private void sendPacket(MouseEvents m) 
     { 
      try 
      { 
      // port1=port1+1; 
       Socket s=new Socket(ipadd,port1+2); 
       OutputStream out=s.getOutputStream(); 
       ObjectOutputStream oos=new ObjectOutputStream(out); 
       oos.writeObject(m); 
       oos.close(); 
       s.close(); 
      } 
      catch(Exception e) 
      { 
       System.out.println(e); 
      } 
     } 

     /*---------------------------keyboard events...-----------------------------------------------*/ 
     //all the events are required to be included.....+requestFocus() is also must...  

     public void keyPressed(KeyEvent k) 
     { 
      System.out.println("after key pressed..."); 
      sendKeyPacket(new KeyboardEvents(k.getKeyCode()));  
     } 
     public void keyReleased(KeyEvent k) 
     { 
      System.out.println("after key released..."); 
      sendKeyPacket(new KeyboardEvents(k.getKeyCode())); 

     } 
     public void keyTyped(KeyEvent k) 
     { 
      System.out.println("after key typed..."+k.getKeyChar()); 
      sendKeyPacket(new KeyboardEvents(k.getKeyChar())); 

     } 


     private void sendKeyPacket(KeyboardEvents k) 
     { 
      try 
      { 
      // port1=port1+1; 
       Socket s=new Socket(ipadd,port1+3); 
       OutputStream out=s.getOutputStream(); 
       ObjectOutputStream oos=new ObjectOutputStream(out); 
       oos.writeObject(k); 
       oos.close(); 
       s.close(); 
      } 
      catch(Exception e) 
      { 
       System.out.println(e); 
      } 
     } 


    } 
+0

這裏的多線程代碼在哪裏? :-) – Vanya

+0

TLTR(另外9個到 – Joel

+0

請格式化您的代碼 –

回答

0

我們需要更多的去不僅僅是這樣:

case of multithread it creates problem due to the multiple ports 

您究竟發現了什麼問題?

0

你也可以使用UDP和TCP爲不同的連接,並保持此套接字連接...

如果u保持UDP和TCP連接的話,很容易用於發送數據包,並通過端口套接字連接。 。

你是在正確的方式,但你需要修改細微的變化...... GUD繼續努力吧,這是烏拉圭回合的辦法是中R 18

還有一兩件事,如果u要使用多線程,那麼你必須相當好的線程管理和同步知識..