2016-04-20 2 views
0

私は複数のクライアントが同じキャンバスに描画できるソフトウェアを作成しています。これは、描かれた点のArrayListをサーバーに送り戻すことによって行われます。今のようにListArrayをセットアップしましたが、常に更新する必要があるため、サーバーには常に最新の情報があります。サーバにデータを送る無限ループでwriteObjectを設定する

クライアントコード:

public class TCPClient extends JPanel { 

    public static ArrayList<Point> location = new ArrayList<>(); 

    private JTextArea consoleOutput = new JTextArea(1,20); 

    public void addComponentToPane(Container pane) { 
     consoleOutput.setEditable(false); 
    } 

    public TCPClient() { 
     addMouseListener(new MouseAdapter() { 
      @Override 
      public void mousePressed(MouseEvent e) { 
       location.add(e.getPoint()); 
      } 
     }); 

     addMouseMotionListener(new MouseMotionAdapter() { 
      @Override 
      public void mouseDragged(MouseEvent e) { 
       location.add(e.getPoint()); 
       repaint(); 
      } 
     }); 
     setPreferredSize(new Dimension(800, 500)); 
     setBackground(Color.WHITE); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     if(location.isEmpty()){ 
      return; 
     } 

     Point p = location.get(0); 
     for (int i = 1; i < location.size(); i++) { 
      Point q = location.get(i); 
      g.drawLine(p.x, p.y, q.x, q.y); 
      p = q; 
     } 
    } 

    public static void main(String argv[]) throws Exception { 

     BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); 
     Socket clientSocket = new Socket("localhost", 9000); 
     ObjectOutputStream outToServer = new ObjectOutputStream(clientSocket.getOutputStream()); 

     InetAddress SERVERIP = InetAddress.getLocalHost(); 

     JFrame frame = new JFrame("Drawing with friends"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new CanvasFrame(), BorderLayout.CENTER); 

     JTextArea IPadress = new JTextArea(1,20); 
     IPadress.setEditable(false); 
     IPadress.append("DEVICE IP: " + SERVERIP.getHostAddress()); 
     frame.add(IPadress, BorderLayout.SOUTH); 

     frame.setSize(new Dimension(800,600)); 
     frame.setLocationRelativeTo(null); 
     frame.setResizable(false); 
     frame.setVisible(true); 

     ObjectInputStream inFromServer = new ObjectInputStream(clientSocket.getInputStream()); 

     outToServer.writeObject(location); 

     clientSocket.close(); 

    } 
} 

あなたが見ることができるように、すべてのクライアント/サーバー関連のが私のメインスレッドです。 writeObjectメソッドをメインスレッド内のwhileループに入れてみましたが、結果が出ませんでした。 その後、私は新しいrun()関数を作ろうとしましたが、それはまた私の入出力ストリームを台無しにしているようでした。

説明:私はoutToServer.writeObject(location)が必要です。反復的に送信されます。

答えて

1

あなたが話していることは分かりませんが、同じオブジェクトを送信し続ける場合は、新しい値が送信されるように、または再送信する代わりに新しいオブジェクトを作成するためにObjectOutputStream.writeUnshared()またはObjectOutputStream.reset()を使用する必要があります同じもの

関連する問題