Witam Serdecznie.
Mam proszę Państwa problem. Muszę napisać prostą aplikacje klient serwer. Oto co ma robić ta aplikacja:
"Użytkownik otwiera okienko serwera, który oczekuje na połączenie od klientów. Po nawiązaniu połączenia (koniecznie każde w osobnym wątku), w okienku serwera można wybrać "radio-buttonem" jedną z komend:
-wyślij tekst (podany w polu tekstowym)
-rysuj kółko na zadanej pozycji
-odtwórz jakiś dźwięk
Po kliknięciu "wyślij komendę" serwer wysyła wszystkim klientom odpowiedni rozkaz. Klienci podłączeni do serwera oczekują na niego i gdy nadejdzie natychmiast go wykonują. Oczywiście obsługa rodzaju błędów musi być oparta na wyjątkach."
Zrobiłem w tej chwili taki niby komunikator przez który można wysyłać wiadomość. Poniżej zamieszczam kody:
Serwer
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class serwer extends javax.swing.JFrame {
public serwer() {
initComponents();
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
textArea1 = new java.awt.TextArea();
jButton1 = new javax.swing.JButton();
jTextField1 = new javax.swing.JTextField();
jTextField2 = new javax.swing.JTextField();
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("serwer");
jButton1.setText("Wyślij");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
wyslij(evt);
}
});
jTextField2.setText("192.168.1.100");
jLabel1.setText("Napisz wiadomość");
jLabel2.setText("Podaj adres IP");
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(138, 138, 138)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, 174, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(99, 99, 99)
.addComponent(jButton1)
.addGap(196, 196, 196))
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel2)
.addContainerGap())
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel1)
.addContainerGap())
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
.addComponent(jTextField1, javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(textArea1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 454, Short.MAX_VALUE))
.addContainerGap())))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(textArea1, javax.swing.GroupLayout.PREFERRED_SIZE, 231, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(24, 24, 24)
.addComponent(jLabel1)
.addGap(5, 5, 5)
.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(11, 11, 11)
.addComponent(jLabel2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jButton1))
.addContainerGap(31, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
private void wyslij(java.awt.event.ActionEvent evt) {
int port = 5500;
String adresip = jTextField2.getText();
String napis = jTextField1.getText();
String wiadomosc = "";
try {
InetAddress servAddr = InetAddress.getByName(adresip);
String data = napis;
byte buf[] = data.getBytes();
DatagramSocket socket = new DatagramSocket();
DatagramPacket packet = new DatagramPacket(buf, buf.length, servAddr, port);
socket.send(packet);
wiadomosc=wiadomosc+"wyslano do: "+adresip+"wiadomosc "+napis+"\n";
textArea1.setText("");
jTextField1.setText("");
}
catch(Exception ex){
System.err.println(ex);
}
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new serwer().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JTextField jTextField1;
private javax.swing.JTextField jTextField2;
private java.awt.TextArea textArea1;
// End of variables declaration
}
Klient
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class klient extends javax.swing.JFrame {
public klient() {
initComponents();
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
textArea1 = new java.awt.TextArea();
jButton1 = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("Klient");
jButton1.setText("Nasłuchuj");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
nasluchuj(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(98, 98, 98)
.addComponent(textArea1, javax.swing.GroupLayout.PREFERRED_SIZE, 424, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(74, Short.MAX_VALUE))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(263, Short.MAX_VALUE)
.addComponent(jButton1)
.addGap(260, 260, 260))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(25, 25, 25)
.addComponent(textArea1, javax.swing.GroupLayout.PREFERRED_SIZE, 212, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(36, 36, 36)
.addComponent(jButton1)
.addContainerGap(57, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
private void nasluchuj(java.awt.event.ActionEvent evt) {
int port = 5500;
try{
DatagramSocket socket = new DatagramSocket(port);
while(true){
byte[] buf = new byte[100];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
textArea1.setText("Dane odebrane ["+new String(packet.getData()).trim()+"]");
}
}
catch(Exception e) {
System.err.println(e);
}
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new klient().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private java.awt.TextArea textArea1;
// End of variables declaration
}
Mam teraz problem z pozostałą częścią projektu. Czy w ogóle to co napisałem do tej pory spełnia wymagania jakie mam postawione? Tzn te połączenia będą nawiązywane w osobnym wątku? I jak rozwiązać tą część z dźwiękiem i rysowaniem kółka? Niestety moja widza odnośnie javy nie jest zbyt wielka dlatego proszę Państwa o pomoc. Pod tym linkiem zamieściłem to co zrobiłem do tej pory (pliki): http://www.sendspace.pl/file/6248b4748ef5300fb90106f
Bardzo proszę o pomoc
Pozdrawiam.