Nechal nam tam bezet server a vy jste meli udelat klienta - oknovou aplikaci ve swingu, ktery se tam pripoji (podle parametru z argumentu - server, port).
Ten mel za ukol umet pridat zaznam (radka textu) a odeslat na server. Server pak poslal vsem pripojenym klientum tu radku a ty ji meli zobrazit.
Pak melo jit zaznam vymazat (zase se smazal vsem klientum pres server).
Dal jeste server informoval klienty o poctu pripojenych lidi, tak to se tam taky melo zorbazovat.
Zaznamy byly zobrazovany v JListu.
Dalsi pozadavky: Predepsany vzhled, GridBagLayout, synchronizace vlaken, spustit z jaru..
Kdyby nekdo chtel muj fugly kod, tak:
Main.java
Kód: Vybrat vše
package zapoctovy_test;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.*;
public class Main {
private static Client client;
private static JLabel clientCount;
private static JTextField text;
private static final DefaultListModel model = new DefaultListModel();
public static void main(String[] args) {
if(args.length != 2) {
JOptionPane.showMessageDialog(null, "Wrong number of arguments.");
return;
}
int port;
try {
port = Integer.parseInt(args[1]);
} catch(Exception e) {
JOptionPane.showMessageDialog(null, "Port is invalid.");
return;
}
client = new Client(args[0], port);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
okno();
client.start();
}
});
}
private static void okno() {
JFrame frame = new JFrame("SyncList Client");
JFrame.setDefaultLookAndFeelDecorated(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel main = new JPanel(new GridBagLayout());
main.setPreferredSize(new Dimension(250, 400));
// MAIN PANEL
GridBagConstraints c = new GridBagConstraints();
c.gridheight = 1;
c.gridx = 0;
c.gridy = 0;
c.gridwidth = 2;
c.weightx = 1.0;
c.fill = GridBagConstraints.HORIZONTAL;
c.insets = new Insets(1, 1, 1, 1);
// NUM OF CLIENTS
clientCount = new JLabel("Number of clients: 0");
main.add(clientCount, c);
// TEXTFIELD
text = new JTextField();
text.setPreferredSize(new Dimension(180, 30));
text.addKeyListener(new KeyListener() {
public void keyTyped(KeyEvent e) {}
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == 10) {
client.send("ADD " + text.getText());
text.setText(null);
}
}
public void keyReleased(KeyEvent e) {}
});
c.gridy = 1;
c.gridwidth = 1;
main.add(text, c);
// ADD BUTTON
JButton add = new JButton("ADD");
add.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
client.send("ADD " + text.getText());
text.setText(null);
}
});
c.gridx = 1;
c.weightx = 0.0;
main.add(add, c);
// JLIST
c.gridx = 0;
c.gridy = 2;
c.gridwidth = 2;
c.fill = GridBagConstraints.BOTH;
c.weighty = 1.0;
c.weightx = 1.0;
final JList messages = new JList(model);
main.add(messages, c);
// DELETE BUTTON
c.gridy = 3;
c.weighty = 0.0;
c.fill = GridBagConstraints.HORIZONTAL;
JButton delete = new JButton("DELETE SELECTED ITEM");
delete.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String item = (String) messages.getSelectedValue();
if(!item.isEmpty()) {
client.send("DEL " + item);
}
}
});
main.add(delete, c);
frame.getContentPane().add(main);
frame.pack();
frame.setVisible(true);
}
public static void setClients(String s) {
clientCount.setText("Number of clients: " + s);
}
public static void addMessage(String msg) {
synchronized(model) {
model.addElement(msg);
System.out.println(msg);
}
}
public static void deleteMessage(String msg) {
synchronized(model) {
for(int i = 0; i < model.size(); ++i) {
if(model.elementAt(i).equals(msg)) {
model.removeElementAt(i);
break;
}
}
}
}
public static void exit() {
System.exit(0);
}
}
Kód: Vybrat vše
package zapoctovy_test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import javax.swing.JOptionPane;
public class Client extends Thread {
private Socket socket;
private PrintWriter out;
private BufferedReader in;
private String server;
private int port;
public Client(String s, int p) {
port = p;
server = s;
}
@Override
public void run() {
try {
socket = new Socket(InetAddress.getByName(server), port);
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream());
String msg;
while(true) {
msg = in.readLine();
process(msg);
}
} catch(IOException e) {
JOptionPane.showMessageDialog(null, "Disconnected: " + e.getMessage());
Main.exit();
} finally {
socket.close();
}
} catch(IOException e) {
JOptionPane.showMessageDialog(null, "Server not found: " + e.getMessage());
Main.exit();
}
}
void send(String text) {
if(text.isEmpty()) return;
try {
out.println(text);
out.flush();
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "Disconnected. Sending message failed.");
Main.exit();
}
}
private void process(String msg) {
int pos = msg.indexOf(' ');
if(pos == -1) JOptionPane.showMessageDialog(null, "-1: " + msg);
String cmd = msg.substring(0, pos);
if(cmd.equals("CLIENTS")) {
Main.setClients(msg.substring(pos + 1));
} else if(cmd.equals("ADD")) {
Main.addMessage(msg.substring(pos + 1));
} else if(cmd.equals("DEL")) {
Main.deleteMessage(msg.substring(pos + 1));
}
}
}