Hier ist mal das Programm des Client1:
package Main;
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class client1 extends JFrame implements ActionListener
{
JLabel l1=new JLabel("Enter your Name:");//Label erzeugen und Namen geben
JLabel l2=new JLabel("Set IP to chat:");//Label erzeugen und Namen geben
JLabel l3=new JLabel("Enter the text:");//Label erzeugen und Namen geben
JLabel lserver=new JLabel("Set Server - IP:");//Label erzeugen und Namen geben
JTextField t1=new JTextField();//Textfeld erzeugen
JTextField t2=new JTextField();//Textfeld erzeugen
JTextField t3=new JTextField();//Textfeld erzeugen
JTextArea t4=new JTextArea();//Textarea erzeugen
JTextField tserver=new JTextField();//Textfeld erzeugen
JScrollPane jsp=new JScrollPane(t4);//Scrollpane erzeugen und in t4 einbinden
DatagramSocket so,so1;//Typ festlegen von Datagramsockets
DatagramPacket sp,rp;//Typ festlegen von Datagrampacket
//kontruktor
client1()
{
super("Roberto's Live Messenger");//Client1-Frame benennen
setLayout(null);//Layout auf null setzen
l1.setBounds(20,20,120,20);//Label Koordinaten einstellen
t1.setBounds(120,20,150,20);//Textfeld Koordinaten einstellen
l2.setBounds(20,50,90,20);//Label Koordinaten einstellen
t2.setBounds(120,50,102,20);//Textfeld Koordinaten einstellen
lserver.setBounds(20,80,102,20);//Label Koordinaten einstellen
tserver.setBounds(120,80,102,20);//Textfeld Koordinaten einstellen
l3.setBounds(20,110,100,20);//Label Koordinaten einstellen
t3.setBounds(20,140,250,20);//Textfeld Koordinaten einstellen
jsp.setBounds(20,170,250,100);//Scrollpane Koordinaten einstellen
add(l1);//Label in Frame setzen
add(l2);//Label in Frame setzen
add(l3);//Label in Frame setzen
add(t1);//Textfeld in Frame setzen
add(t2);//Textfeld in Frame setzen
add(t3);//Textfeld in Frame setzen
add(lserver);//Label in Frame setzen
add(tserver);//Textfeld in Frame setzen
add(jsp);//Scrollpane in Frame setzen
t3.addActionListener(this);//Actionlistener auf Textfeld3 setzen
setVisible(true);//Frame sichtbar machen
setSize(300,350);//Grösse von Frame einstellen
setResizable(false);//Frame ist nicht vergrösser-/verkleinerbar
try//Im Fall wenn so oder so1 besetzt sein sollten oder wenn ein anderer Fehler auftritt soll folgendes geschehen
{
so=new DatagramSocket(); // send
so1=new DatagramSocket(10000); // receive
}
catch(Exception e){}
}
/**
* Wird in t3 etwas eingegeben dann wird die Methode senddata aufgerufen und der Text wird gesendet und in t4 gesetzt.
* Anschliessend wird t3 wieder gelöscht.
*/
public void actionPerformed(ActionEvent e)
{
senddata(e.getActionCommand());//aufrufen von senddata mit parameter s(eingegebener Text) (s = String)
t3.setText("");//Text von t3 löschen
}
/**
* senddata ist eine Methode die den zu sendenden Text aufbereitet und versendet
* @param s
*/
public void senddata(String s)
{//method senddata
try
{
String st=s+"¦Client1¦"+t2.getText()+"¦"+t1.getText();//zusammenbauen des zu schickenden Strings
byte data[]=st.getBytes();//reservierung der bytes
sp=new DatagramPacket(data,data.length,InetAddress.getByName(tserver.getText()),20000);//zusammensetzen des Paketes
so.send(sp);//senden des paketes
t4.append(t1.getText() + ": " + s + "\n");//was man geschrieben hat wird angezeigt
}
catch(Exception e){}
}
/**
* ???????????????
*/
public void waitdata()
{
while(true)
{//wait method
try
{
byte data[]=new byte[100];//reservieren der bytes
rp=new DatagramPacket(data,data.length);//zusammensetzen des pakets
so1.receive(rp);//bekommt paket
t4.append(new String(rp.getData(),0,rp.getLength())+"\n");//schreiben des empfangenen paketes
}
catch(Exception e){
}
}
}
public static void main(String args[])
{
client1 c=new client1();//Neues Objekt c mit dem Typ client1 wird erstellt
c.waitdata();//warten auf daten
}
}
Im Grunde gesehen ist mein Messenger so aufgebaut: Er besteht ja wie schon gesagt aus 4 Programmen:
1.Mainclass, diese ruft den LoginPanel auf, durch klicken auf den Login Button öffnet sich ein neues Fenster mit der Benutzeroberfläche
2.MainListMenu ist, sozusagen zusammen mit 3. MainList, die Benutzeroberfläche, nur dass 3.MainList ein Panel ist dass den ChatButton enthält und ins 2.MainListMenu(=Frame= eingebunden wird. Das MainListMenu hat oben ein Barren mit Menüs.
Und anschliessend 4. der Client1 den ich euch hier hingepostet habe.
Kurzgefassen: Mainclass ruft durch betätigen des LoginButtons das MainListmenu auf.Das MainListMenu enthalt gleichzeitig den Panel MainList, und in Mainlist wird der client1 aufgerufen.
Damit man dann zwischen zwei clients kommunizieren kann habe ich nocheinmal genau dasselbe programm von 1. - 4. nur dass der client1 nun client2 heisst und mit den Sockets an den Server angepasst ist.
Nun zum Server: Im Grunde gesehen tut der Server nichts anderes als die Daten weiterzuleiten oder zu stoppen zwischen den beiden Clients, mehr nicht. er besteht aus einem Start und Stop button.