2016-04-25 2 views
0

ich mit einem TCPClient Klasse arbeiten und einer TCPServer Klasse. Ich habe ein Zeichenprogramm in meinem TCPClient erstellt und dann Punkt (Zeichnung) Informationen an den Server sendet, und umgekehrt, um alle Clients auf dem Server arbeiten auf der „gleichen“ Leinwand laufen zu lassen.Zeichnung Funktion vermasselt, wenn die Verbindung zwischen Server und Client Erstellen

TCPServer:

public class TCPServer { 

    private static final int serverPort = 9000; 

    public static void main(String argv[]) throws Exception { 
     ServerSocket welcomeSocket = new ServerSocket(serverPort); 

     ArrayList<Point> completeDrawing = new ArrayList<>(); 
     ArrayList<Point> receivedList = new ArrayList<>(); 

     while (true) { 

      Socket connectionSocket = welcomeSocket.accept(); 
      ObjectInputStream inFromClient = new ObjectInputStream(connectionSocket.getInputStream()); 


      ObjectOutputStream outToClient = new ObjectOutputStream(connectionSocket.getOutputStream()); 

      receivedList.addAll((ArrayList<Point>) inFromClient.readObject()); 
      completeDrawing.addAll(receivedList); 
      receivedList.clear(); 

      outToClient.writeObject(completeDrawing); 

      connectionSocket.close(); 
     } 

    } 
} 

TCPClient:

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) { 
       synchronized (location) { 
       location.add(e.getPoint()); 
       location.notify(); 
       } 
      } 
     }); 

     addMouseMotionListener(new MouseMotionAdapter() { 
      @Override 
      public void mouseDragged(MouseEvent e) { 
       synchronized (location) { 
       location.add(e.getPoint()); 
       location.notify(); 
       repaint(); 
       } 
      } 
     }); 

     setPreferredSize(new Dimension(800, 500)); 
     setBackground(Color.WHITE); 
    } 

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

     synchronized (location) { 
      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 { 

     InetAddress SERVERIP = InetAddress.getLocalHost(); 

     JFrame frame = new JFrame("Drawing with friends"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new TCPClient(), 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); 

     while(true) { 
      synchronized (location) { 
       Socket clientSocket = new Socket("localhost", 9000); 

       ObjectOutputStream outToServer = new ObjectOutputStream(clientSocket.getOutputStream()); 
       ObjectInputStream inFromServer = new ObjectInputStream(clientSocket.getInputStream()); 

       outToServer.writeObject(location); 

       outToServer.flush(); 
       location.wait(); 

       location.addAll((ArrayList<Point>) inFromServer.readObject()); 
      } 
     } 
    } 
} 

Mit diesen Klassen vermasselt meine Zeichenfunktion auf. Es beginnen hinkt und Stottern hart, während die Zeichnung von einem Punkt funktioniert nur: enter image description here

Allerdings, wenn ich meinen Server zum Client-Stream auf Kommentar, es funktioniert gut (nur in einem Client-Fenster natürlich): enter image description here

ich habe eine SUSPESION das Problem des Client von Daten überschwemmt verwendet wird, aber davon abgesehen, dass ich weiß nicht, wie um dieses Problem zu arbeiten.

+0

was genau hast du auskommentiert? –

+0

@IvanZelenskyy //outToClient.writeObject(completeDrawing); – WONDERGG

+0

Ich habe Ihren Code kopiert und ich habe es ohne Latenz arbeiten. Aber was soll der Server tun, damit ich überprüfen kann, ob er richtig funktioniert? –

Antwort

0

Es gibt zu viele Daten auf dem Client, da die Daten in ‚Zeichnung‘ Arraylisten (auf beiden Seiten) eine Menge Vervielfältigungen haben. Code neu schreiben, um nur neue Punkte zu "location" und "completeDrawing" hinzuzufügen:

ArrayList<Point> serverPoints = (ArrayList<Point>)inFromServer.readObject(); 
for(Point p : serverPoints){ 
    if(!location.contains(p)) location.add(p); 
} 
Verwandte Themen