Βιβλία για Java και συμβουλές γiα Swing
Μάλλον δεν το εξήγησα καλά. Αυτό το πρόγραμμα έχει τρια TextFields και εφτά κουμπιά. Όταν πατάς ένα απ' τα έξι κουμπιά το κείμενο που υπάρχει σε κάθε TextFields αποθηκεύεται σε string μεταβλητές. Επίσης υπάρχει και ένα άλλο Frame το οποίο δεν είναι ορατό και έχει κάποιες άδειες Labels μέσα(αυτές που θέλω να γίνεται set το κείμενο απ' τα TextFields). Αφού ολοκληρωθεί η διαδικασία με την αποθήκευση του κειμένου στις μεταβλητές(πατώντας κάποιο απο τα έξι κουμπιά), πατάς το έβδομο και ανοίγει το Frame που έχει μέσα τις Labels που πιο πριν θα έπρεπε να έχει μπει το κείμενο απ' τα TextFields. Λοιπόν αυτές οι Labels συνεχίζουν να μένουν κενές, χωρίς καθόλου κείμενο. Τι μπορεί να φταίει???
«Η ευτυχία συνήθως έρχεται σε όσους είναι πολύ απασχολημένοι για να ψάξουν να τη βρουν.»
ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ
ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ
- lumenintervalum
- Wow! Terabyte level
- Posts: 2377
- Joined: Thu May 06, 2004 7:06 pm
- Location: somewhere far beyond..
- Contact:
κ το Java networking and awt bible έχει καναδυό κεφάλαια μέσα...(δεν έχω εντρυφήσει παραπάνω..)
We are just a moment in time
A blink of an eye
A dream for the blind
Visions from a dying brain
I hope you don't understand
_______________________
scraps& photo gallery στο deviantart- last update 25/08/06
A blink of an eye
A dream for the blind
Visions from a dying brain
I hope you don't understand
_______________________
scraps& photo gallery στο deviantart- last update 25/08/06
Γειά σας και χρόνια πολλά σε όλους! Λοιπόν έχω αρχίσει και ασχολούμαι μεε networking και αντιμετωπίζω ένα πρόβλημα:έχω δύο προγράμματα ,ένα Server και ένα Client. Όταν στέλνω δεδομένα από τον client στο server όλα είναι εντάξει , όταν όμως κάνω το ανάποδο τα δεδομένα δεν εμφαίζονται κατευθείαν στον client.Δηλαδή πρώτα θα πρέπει να στείλει καινούριο μήνυμα ο cliet και μετά θα εμφανιστούν τα δεδομέα που είχε ήδη στείλει ο server. Τι κάνω λάθος;
Server
Client
Server
Code: Select all
import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import javax.swing.*;
import java.net.*;
public class showDatagramServer extends JFrame implements ActionListener
{
private JTextArea ta;
JTextField tf;
private DatagramPacket sendPacket,receivePacket,receivePacket1;
private DatagramSocket socket;
public showDatagramServer()
{
super("Εξυπηρετητής Αυτόνομων πακέτων");
Container cp=getContentPane();
ta=new JTextArea();
tf=new JTextField("");
tf.addActionListener(this);
cp.add(tf, BorderLayout.NORTH);
JScrollPane sc=new JScrollPane(ta);
cp.add(ta, BorderLayout.CENTER);
addWindowListener(new Close_Window());
setSize(400,300);
setVisible(true);
try
{
socket=new DatagramSocket(2000);
}
catch(SocketException se)
{
se.printStackTrace();
System.exit(1);
}
}
public void packetWaiting()
{
while(true)
{
try
{
byte data[]=new byte[100];
receivePacket=new DatagramPacket(data,data.length);
socket.receive(receivePacket);
byte data1[]=new byte[100];
receivePacket1=new DatagramPacket(data1,data1.length);
socket.receive(receivePacket1);
String l= new String(receivePacket.getData());
int in=receivePacket.getLength();
String ll= new String(receivePacket1.getData());
int in1=receivePacket1.getLength();
ta.append("Περιεχόμενα: "+l.substring(0,in)+ " \nSecond Packet: "+ll.substring(0,in1) +receivePacket.getPort());
ta.append("\n\nΕπιστροφή δεδομένων στον πελάτη...");
}
catch(IOException io)
{
ta.append(io.toString()+"\n");
io.printStackTrace();
}
}
}
public void actionPerformed(ActionEvent e)
{
try
{
String f=tf.getText();
byte by[]=f.getBytes();
sendPacket=new DatagramPacket(by ,by.length,receivePacket.getAddress(),receivePacket.getPort());
socket.send(sendPacket);
ta.append("Πακέτο εστάλη\n");
}
catch(IOException io)
{
ta.append(io.toString()+"\n");
io.printStackTrace();
}
}
public static void main(String args[])
{
showDatagramServer s=new showDatagramServer();
s.packetWaiting();
}
public class Close_Window extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
}
Code: Select all
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class showDatagramClient extends JFrame implements ActionListener
{
private JTextArea ta;
private JTextField tf;
JComboBox b;
private DatagramPacket sendPacket,receivePacket,sendPacket1;
private DatagramSocket socket;
public showDatagramClient()
{
super("Πελάτης");
Container cp=getContentPane();
tf=new JTextField("Δώστε μήνυμα");
tf.addActionListener(this);
cp.add(tf, BorderLayout.NORTH);
ta=new JTextArea();
String[] g={"John","James"};
b=new JComboBox(g);
cp.add(b, BorderLayout.SOUTH);
JScrollPane sc=new JScrollPane(ta);
cp.add(ta, BorderLayout.CENTER);
addWindowListener(new Close_Window());
setSize(400,300);
setVisible(true);
try
{
socket=new DatagramSocket();
}
catch(SocketException se)
{
se.printStackTrace();
System.exit(1);
}
}
public void packetWaiting()
{
while(true)
{
try
{
byte data[]=new byte[100];
receivePacket=new DatagramPacket(data,data.length);
socket.receive(receivePacket);
ta.append("\nΠακέτο ελήφθη:" +"\nαπό τον host:" +receivePacket.getAddress()+"\nθύρα host: " + receivePacket.getPort() +"\nΜήκος: " +receivePacket.getLength() +"\nΠεριεχόμενα:\n\t"+new String(receivePacket.getData()));
}
catch(IOException ex)
{
ta.append(ex.toString()+"\n");
ex.printStackTrace();
}
}
}
public void actionPerformed(ActionEvent e)
{
try
{
String y=(String) b.getSelectedItem();
byte date[]=y.getBytes();
ta.append("\nΠεριεχόμενο πακέτου αποστολής:"+e.getActionCommand()+"\n");
String s=e.getActionCommand();
byte data[]=s.getBytes();
sendPacket=new DatagramPacket(data,data.length,InetAddress.getLocalHost(),2000);
socket.send(sendPacket);
ta.append("Πακέτο απεστάλη\n");
sendPacket1=new DatagramPacket(date,date.length,InetAddress.getLocalHost(),2000);
socket.send(sendPacket1);
}
catch(IOException ex)
{
ta.append(ex.toString() + "\n");
ex.printStackTrace();
}
}
public static void main(String args[])
{
showDatagramClient c=new showDatagramClient();
c.packetWaiting();
}
public class Close_Window extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
}
«Η ευτυχία συνήθως έρχεται σε όσους είναι πολύ απασχολημένοι για να ψάξουν να τη βρουν.»
ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ
ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ
- Einherjar
- Venus Project Founder
- Posts: 3751
- Joined: Tue Jan 27, 2004 4:42 pm
- Academic status: Alumnus/a
- Gender: ♂
- Location: Washington DC, USA
- Contact:
Δε ξέρω αν έχεις χρησιμοποιήσει ποτέ threads αλλά σίγουρα τώρα είναι μια αρκετά καλή στιγμή να το κάνεις. Τα κομμάτια κώδικα που "ακούνε" για πακέτα θα πρέπει να βρίσκονται σε ξεχωριστά threads. Η κλήση receive() του socket μπλοκάρει το πρόγραμμά σου μέχρι να λάβει ένα πακέτο. Αυτό σημαίνει, δεδομένου ότι όλα βρίσκονται σε ένα thread, ότι δε μπορεί να γίνει *τίποτα* άλλο παρά μόνο να ληφθεί ένα μήνυμα για να ξεμπλοκαριστεί.
Εσύ πατάς το κουμπί του server για να σταλεί ένα μήνυμα, έχει όμως ήδη μπλοκαριστεί στην εντολή
Έτσι το action μπαίνει σε μια ουρά και θα εξυπηρετηθεί όταν συμβεί κάτι. Αυτό το κάτι είναι τα 2 μηνύματα που στέλνει ο client οπότε βγαίνει από την αναμονή ο server και εξυπηρετεί και το action (στέλνει δηλαδή το μήνυμα στον client).
Εσύ πατάς το κουμπί του server για να σταλεί ένα μήνυμα, έχει όμως ήδη μπλοκαριστεί στην εντολή
Code: Select all
socket.receive(receivePacket);
[Better to understand a little than to misunderstand a lot]
Λοιπόν μετά από αρκετή προσπάθεια μιας και δεν έχω ξαναδουλέψει με threads έκανα ό,τι μπορούσα, όμως ακόμα τα ίδια. Μήπως ξέρει κάποιος τι κάνω λάθος;
Server
Client
Server
Code: Select all
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.SwingUtilities;
public class showDatagramClient extends JFrame implements ActionListener,Runnable
{
private JTextArea ta;
private JTextField tf;
JComboBox b;
private DatagramPacket sendPacket,receivePacket,sendPacket1;
private DatagramSocket socket;
static Thread t,t1;
public showDatagramClient()
{
super("Πελάτης");
Container cp=getContentPane();
tf=new JTextField("Δώστε μήνυμα");
tf.addActionListener(this);
cp.add(tf, BorderLayout.NORTH);
ta=new JTextArea();
String[] g={"John","James"};
b=new JComboBox(g);
cp.add(b, BorderLayout.SOUTH);
JScrollPane sc=new JScrollPane(ta);
cp.add(ta, BorderLayout.CENTER);
setSize(400,300);
setVisible(true);
try
{
socket=new DatagramSocket();
}
catch(SocketException se)
{
se.printStackTrace();
System.exit(1);
}
}
public void packetWaiting()
{
while(true)
{
try
{
byte data[]=new byte[100];
receivePacket=new DatagramPacket(data,data.length);
socket.receive(receivePacket);
ta.append("\nΠακέτο ελήφθη:" +"\nαπό τον host:" +receivePacket.getAddress()+"\nθύρα host: " + receivePacket.getPort() +"\nΜήκος: " +receivePacket.getLength() +"\nΠεριεχόμενα:\n\t"+new String(receivePacket.getData()));
}
catch(IOException ex)
{
ta.append(ex.toString()+"\n");
ex.printStackTrace();
}
}
}
public void run()
{
packet();
packetWaiting();
}
public void packet()
{
String y=(String) b.getSelectedItem();
byte date[]=y.getBytes();
ta.append("\nΠεριεχόμενο πακέτου αποστολής:"+tf.getText()+"\n");
String s=tf.getText();
byte data[]=s.getBytes();
try {
sendPacket=new DatagramPacket(data,data.length,InetAddress.getLocalHost(),2000);
} catch (UnknownHostException ex) {
ex.printStackTrace();
}
try {
socket.send(sendPacket);
} catch (IOException ex) {
ex.printStackTrace();
}
ta.append("Πακέτο απεστάλη\n");
try {
sendPacket1=new DatagramPacket(date,date.length,InetAddress.getLocalHost(),2000);
} catch (UnknownHostException ex) {
ex.printStackTrace();
}
try {
socket.send(sendPacket1);
} catch (IOException ex) {
ex.printStackTrace();
}
}
public void actionPerformed(ActionEvent e)
{
packet();
}
public static void main(String args[])
{
showDatagramClient c=new showDatagramClient();
c.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
c.packetWaiting();
c.packet();
t=new Thread();
t.start();
}
}
Code: Select all
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.SwingUtilities;
public class showDatagramClient extends JFrame implements ActionListener,Runnable
{
private JTextArea ta;
private JTextField tf;
JComboBox b;
private DatagramPacket sendPacket,receivePacket,sendPacket1;
private DatagramSocket socket;
static Thread t,t1;
public showDatagramClient()
{
super("Πελάτης");
Container cp=getContentPane();
tf=new JTextField("Δώστε μήνυμα");
tf.addActionListener(this);
cp.add(tf, BorderLayout.NORTH);
ta=new JTextArea();
String[] g={"John","James"};
b=new JComboBox(g);
cp.add(b, BorderLayout.SOUTH);
JScrollPane sc=new JScrollPane(ta);
cp.add(ta, BorderLayout.CENTER);
setSize(400,300);
setVisible(true);
try
{
socket=new DatagramSocket();
}
catch(SocketException se)
{
se.printStackTrace();
System.exit(1);
}
}
public void packetWaiting()
{
while(true)
{
try
{
byte data[]=new byte[100];
receivePacket=new DatagramPacket(data,data.length);
socket.receive(receivePacket);
ta.append("\nΠακέτο ελήφθη:" +"\nαπό τον host:" +receivePacket.getAddress()+"\nθύρα host: " + receivePacket.getPort() +"\nΜήκος: " +receivePacket.getLength() +"\nΠεριεχόμενα:\n\t"+new String(receivePacket.getData()));
}
catch(IOException ex)
{
ta.append(ex.toString()+"\n");
ex.printStackTrace();
}
}
}
public void run()
{
packet();
packetWaiting();
}
public void packet()
{
String y=(String) b.getSelectedItem();
byte date[]=y.getBytes();
ta.append("\nΠεριεχόμενο πακέτου αποστολής:"+tf.getText()+"\n");
String s=tf.getText();
byte data[]=s.getBytes();
try {
sendPacket=new DatagramPacket(data,data.length,InetAddress.getLocalHost(),2000);
} catch (UnknownHostException ex) {
ex.printStackTrace();
}
try {
socket.send(sendPacket);
} catch (IOException ex) {
ex.printStackTrace();
}
ta.append("Πακέτο απεστάλη\n");
try {
sendPacket1=new DatagramPacket(date,date.length,InetAddress.getLocalHost(),2000);
} catch (UnknownHostException ex) {
ex.printStackTrace();
}
try {
socket.send(sendPacket1);
} catch (IOException ex) {
ex.printStackTrace();
}
}
public void actionPerformed(ActionEvent e)
{
packet();
}
public static void main(String args[])
{
showDatagramClient c=new showDatagramClient();
c.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
c.packetWaiting();
c.packet();
t=new Thread();
t.start();
}
}
«Η ευτυχία συνήθως έρχεται σε όσους είναι πολύ απασχολημένοι για να ψάξουν να τη βρουν.»
ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ
ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ