Toon posts:

[java] tekst over UDP zenden na TCP commando

Pagina: 1
Acties:
  • 161 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Doel:
Nadat de server een commando van de client over een TCP verbinding heeft ontvangen, moet deze een bepaalde tekst over UDP gaan sturen. Vervolgens moet er bij de client een nieuwe command prompt gestart worden, waarin deze tekst output belandt. De server moet om de paar seconden deze zelfde tekst opnieuw versturen. De client kan het versturen stoppen door een stopcommando via de TCP verbinding te versturen. De client beschikt alleen over een command prompt.

Ik heb een werkende server en client geschreven voor de TCP verbinding. Mocht het nodig zijn wil ik deze code ook posten. Daarnaast heb ik ook een werkende UDP server/client:

Client:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.io.*;
import java.net.*;
class UDPClient {
   public static void main(String args[]) throws Exception
   {
      BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
      DatagramSocket clientSocket = new DatagramSocket();
      InetAddress IPAddress =InetAddress.getByName("127.0.0.1");
      byte[] sendData = new byte[1024];
      byte[] receiveData = new byte[1024];
      String sentence = inFromUser.readLine();
      sendData = sentence.getBytes();
      DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
      clientSocket.send(sendPacket);
      DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
      clientSocket.receive(receivePacket);
      String modifiedSentence = new String(receivePacket.getData());
      System.out.println("FROM SERVER:" +modifiedSentence);
      clientSocket.close();
   }


Server:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.io.*;
import java.net.*;
class UDPServer {
   public static void main(String args[]) throws Exception
      {
         DatagramSocket serverSocket = new
                              DatagramSocket(9876);
            byte[] receiveData = new byte[1024];
            byte[] sendData = new byte[1024];
            while(true)
               {
                  DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                  serverSocket.receive(receivePacket);
                  String sentence = new String( receivePacket.getData());
                  InetAddress IPAddress = receivePacket.getAddress();
                  int port = receivePacket.getPort();
                  String sendText = "Te verzenden tekst";
                  sendData = capitalizedSentence.getBytes();
                  DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
                  serverSocket.send(sendPacket);
               }
      }
}


Ik heb dus werkende codes voor zowel een tcp client/server als udp client/server. Nu moet ik ze dus laten samenwerken. Beide servers moeten samengevoegd worden tot 1 server. Het is dus niet de bedoeling dat ik met 2 losse server eindig.

Problemen:
1. Hoe kun je de tekst die via UDP wordt verzonden, in een appart venster laten komen, nadat je het commando vanaf de client het commando hebt gegeven om het verzenden te starten? Het is van belang dat je 2 schermen hebt, 1 om commando's te sturen, en een tweede om de tekst te ontvangen. Als ik de tekst ook op het scherm om commando's te versturen terrecht laat komen, dan kan ik geen commando's meer verzenden zoals Stop(), omdat hij constant serveroutput aan het ontvangen is.

2. De server moet meerdere clients kunnen verwerken. Mijn tcp server bevat kan verschillende threads starten. Moet dit ook in de UDP server worden ingebouwd? In mijn tests kon mijn UDP server gewoon meerdere clienten ontvangen, maar het kan zijn dat ik toch iets fout heb gedaan waardoor dat dit toeval is.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 21-04 13:55
Als je een Java applicatie in de console start heb je altijd maar (maximaal) één console. Je kunt wel met AWT of Swing een nieuw venster maken waarin je nieuwe data stuurt.

[ Voor 4% gewijzigd door Soultaker op 13-12-2005 23:47 ]


Verwijderd

Topicstarter
Hm dat is niet zo'n goed nieuws. Ik heb nog nooit een grafische interface gemaakt in java, en ik heb niet veel tijd om dit af te ronden. Ik heb een poging gewaagd om een grafische interface te maken, maar het wil niet helemaal lukken. Hier is de code:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import java.awt.*;
import javax.swing.*;
public class Gui {
    public static JFrame mainFrame = null;
    public static JTextArea commandOutput = null;
    public static JTextArea audioOutput = null;
    public static JTextField commandLine = null;

    private static void initGUI() {
        JPanel pane = null;

        // Set up the command pane
        JPanel commandPane = new JPanel(new BorderLayout());
        commandOutput = new JTextArea(10, 20);
        commandOutput.setLineWrap(true);
        commandOutput.setEditable(false);
        JScrollPane commandOutputPane = new JScrollPane(commandOutput, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        commandLine = new JTextField();
        commandPane.add(new JLabel("Command Output:"));
        commandPane.add(commandLine, BorderLayout.SOUTH);
        commandPane.add(commandOutputPane, BorderLayout.CENTER);
        commandPane.setPreferredSize(new Dimension(200, 200));

        // Set up the audio pane
        JPanel audioPane = new JPanel(new BorderLayout());
        audioOutput = new JTextArea(10, 20);
        audioOutput.setLineWrap(true);
        audioOutput.setEditable(false);
        JScrollPane audioOutputPane = new JScrollPane(audioOutput, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        audioPane.add(new JLabel("Audio Output:"));
                commandPane.add(commandOutputPane, BorderLayout.CENTER);
        commandPane.setPreferredSize(new Dimension(200, 200));


        // Set up the main pane
        JPanel mainPane = new JPanel(new BorderLayout());
        mainPane.add(commandPane, BorderLayout.EAST);
        mainPane.add(audioPane, BorderLayout.WEST);

        // Set up the main frame
        mainFrame = new JFrame("AudioServer");
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.setContentPane(mainPane);
        mainFrame.setSize(mainFrame.getPreferredSize());
        mainFrame.setLocation(800, 800);
        mainFrame.pack();
        mainFrame.setVisible(true);
    }

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


Het doel was om het volgende te maken:
Afbeeldingslocatie: http://www.darkchaos.nl/images/audioServer.JPG

Zou er iemand aub even naar deze interface willen kijken. Alle componenten staan erop, ik moet ze alleen nog in beeld zien te krijgen. Ze lijken elkaar te overlappen waardoor ze niet meer te zien zijn.

Tot slot moet ik alleen nog zien uit te vinden hoe ik kan zorgen dat de tekst vd server ipv in de commandprompt, in het bijbehorende textfield komt en de commando's van de commandline, naar de server worden verzonden... :Y)

[ Voor 6% gewijzigd door Verwijderd op 14-12-2005 02:42 ]


  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 03:55

Nick_S

++?????++ Out of Cheese Error

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import java.awt.BorderLayout;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class Gui {
    public static JFrame mainFrame = null;

    public static JTextArea commandOutput = null;

    public static JTextArea audioOutput = null;

    public static JTextField commandLine = null;

    private static void initGUI() {

        // Set up the command pane
        JPanel commandPane = new JPanel(new BorderLayout());
        commandOutput = new JTextArea(10, 20);
        commandOutput.setLineWrap(true);
        commandOutput.setEditable(false);
        JScrollPane commandOutputPane = new JScrollPane(commandOutput,
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);



        commandPane.add(new JLabel("Command Output:"), BorderLayout.NORTH);
        commandPane.add(commandOutputPane, BorderLayout.CENTER);
        commandPane.setPreferredSize(new Dimension(200, 200));

        // Set up the audio pane
        JPanel audioPane = new JPanel(new BorderLayout());
        audioOutput = new JTextArea(10, 20);
        audioOutput.setLineWrap(true);
        audioOutput.setEditable(false);
        JScrollPane audioOutputPane = new JScrollPane(audioOutput,
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        audioPane.add(new JLabel("Audio Output:"), BorderLayout.NORTH);
        audioPane.add(audioOutputPane, BorderLayout.CENTER);
        audioPane.setPreferredSize(new Dimension(200, 200));

        JPanel commandLinePane = new JPanel(new BorderLayout());
        commandLine = new JTextField();
        commandLinePane.add(new JLabel("Command Line:"), BorderLayout.NORTH);
        commandLinePane.add(commandLine, BorderLayout.CENTER);

        // Set up the main pane
        JPanel mainPane = new JPanel(new BorderLayout());
        mainPane.add(commandPane, BorderLayout.WEST);
        mainPane.add(audioPane, BorderLayout.EAST);
        mainPane.add(commandLinePane, BorderLayout.SOUTH);

        // Set up the main frame
        mainFrame = new JFrame("AudioServer");
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.setContentPane(mainPane);
        mainFrame.setSize(mainFrame.getPreferredSize());
        mainFrame.setLocation(800, 800);
        mainFrame.pack();
        mainFrame.setVisible(true);
    }

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

Hmm, dit was wel een beetje debug nivo hoor!

Kijk eens goed naar je regels 31 && 32. Heel slordig copy/paste werk... Ik weet niet wat voor IDE je gebruikt, maar Eclipse had al snel door, dat je je audioOutputPane nergens gebruikte.

Andere tips,

- gebruik van static variabele:
Alleen als je ze in meerdere instanties van dezelfde klasse nodig heb. Als je nu een client programma zou maken, die twee (of meer) van deze GUI's zou moeten bevatten, zou je deze code helemaal moeten aanpassen.

- Vermijd gebruik van public variabele.
Je gebruikt deze variabele als het goed is, nergens anders in je programma. Maak ze dan ook niet public!

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Verwijderd schreef op dinsdag 13 december 2005 @ 23:42:
Het is van belang dat je 2 schermen hebt, 1 om commando's te sturen, en een tweede om de tekst te ontvangen.
Misschien kan je voor een splitscreen oplossing kiezen, waar boven de serverresponses verschijnen, terwijl je onder een cmdline voor nieuwe input hebt? Zoiets verdelen over twee 'command prompts' is eigenlijk raar als je het ene helemaal niet als command prompt gebruikt.

Wie trösten wir uns, die Mörder aller Mörder?


Verwijderd

offtopic:
Deus3: Design & Management @ UT ;) Leuke opdracht, of niet soms...

Verwijderd

Topicstarter
Verwijderd schreef op woensdag 14 december 2005 @ 11:37:
offtopic:
Deus3: Design & Management @ UT ;) Leuke opdracht, of niet soms...
offtopic:
Jazeker, erg leuk vak. :)



Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.*;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class Gui {
    public static JFrame mainFrame = null;

    public static JTextArea commandOutput = null;

    public static JTextArea audioOutput = null;

    public static JTextField commandLine = null;

    private static void initGUI() {

        // Set up the command pane
        JPanel commandPane = new JPanel(new BorderLayout());
        commandOutput = new JTextArea(10, 20);
        commandOutput.setLineWrap(true);
        commandOutput.setEditable(true);
        JScrollPane commandOutputPane = new JScrollPane(commandOutput,
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);



        commandPane.add(new JLabel("Command Output:"), BorderLayout.NORTH);
        commandPane.add(commandOutputPane, BorderLayout.CENTER);
        commandPane.setPreferredSize(new Dimension(200, 200));

        // Set up the audio pane
        JPanel audioPane = new JPanel(new BorderLayout());
        audioOutput = new JTextArea(10, 20);
        audioOutput.setLineWrap(true);
        audioOutput.setEditable(false);
        JScrollPane audioOutputPane = new JScrollPane(audioOutput,
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        audioPane.add(new JLabel("Audio Output:"), BorderLayout.NORTH);
        audioPane.add(audioOutputPane, BorderLayout.CENTER);
        audioPane.setPreferredSize(new Dimension(200, 200));

        JPanel commandLinePane = new JPanel(new BorderLayout());
        commandLine = new JTextField();
        commandLinePane.add(new JLabel("Command Line:"), BorderLayout.NORTH);
        commandLinePane.add(commandLine, BorderLayout.CENTER);
        commandLine.addActionListener(new ActionAdapter() {
            public void actionPerformed(ActionEvent e) {
            commandOutput.setText(commandLine.getText());
            commandOutput.selectAll();
            }
         });



        // Set up the main pane
        JPanel mainPane = new JPanel(new BorderLayout());
        mainPane.add(commandPane, BorderLayout.WEST);
        mainPane.add(audioPane, BorderLayout.EAST);
        mainPane.add(commandLinePane, BorderLayout.SOUTH);

        // Set up the main frame
        mainFrame = new JFrame("AudioServer");
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.setContentPane(mainPane);
        mainFrame.setSize(mainFrame.getPreferredSize());
        mainFrame.setLocation(800, 800);
        mainFrame.pack();
        mainFrame.setVisible(true);
    }

    public static void main(String args[]) {
        initGUI();

    }



}
class ActionAdapter implements ActionListener {
        public void actionPerformed(ActionEvent e) {}
}


Om te beginnen, dank voor je hulp.
Ik heb de code een beetje uitgebreid: Ik heb er een actionlistener aan toegevoegd. Compilen gaat prima, alleen is de interface nogal dood :z Bij wijze van test wou ik de tekst die ik intyp in de commandline, laten weergeven onder Command Output. Dit doet hij dus niet.

Ook iets als...
Java:
1
2
commandLine = new JTextField();
commandLine.setText("Test");

...heeft geen resultaat. Het woord Test wordt gewoon niet weergegeven. Volgens een de java api en verschillende tutorials zou dit toch echt moeten werken. Wat zou de reden kunnen zijn dat dit niet werkt? commandLine.setEditable(true); veroorzaakt geen veranderingen.

Ps. De setText() methode werkt net zo min voor de commandLine als voor de overige textarea's.

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 20:50
Ik neem aan dat je de JTextFields in het geheel (zo goed als) niet ziet of wel?

[ Voor 40% gewijzigd door Kwistnix op 16-12-2005 18:03 ]


Verwijderd

Topicstarter
FallenAngel666 schreef op vrijdag 16 december 2005 @ 18:00:
Ik neem aan dat je de JTextFields in het geheel (zo goed als) niet ziet of wel?
Ik kan alle fields perfect zien, behalve de tekst in de fields.

[ Voor 3% gewijzigd door Verwijderd op 16-12-2005 21:27 ]


  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 20:50
Verwijderd schreef op vrijdag 16 december 2005 @ 21:27:
[...]


Ik kan alle fields perfect zien, behalve de tekst in de fields.
Ik heb je code letterlijk gekopieerd en de klasse ActionAdapter even snel geïmplementeerd:

Java:
1
2
3
4
5
6
7
lass ActionAdapter implements ActionListener { 
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == Gui.commandLine){
            Gui.commandOutput.setText(Gui.commandLine.getText());
        }
    } 
}


En alles werkt hier naar behoren.

Afbeeldingslocatie: http://people.zeelandnet.nl/jelleklap/gui.JPG

[ Voor 8% gewijzigd door Kwistnix op 16-12-2005 22:15 ]

Pagina: 1