Zusammenfassungen
Universitätsnotizen im Markdown-Format aus Obsidian.
Comunicazione Client-Server in Swing
download MD herunterladenPARTE Server
Per quanto riguarda il file Main.java:
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class Main {
public static void main(String[] args) {
JFrame f = new JFrame("Server");
f.setSize(400,400);
JPanel p = new JPanel();
p.setLayout(new GridLayout(2, 1));
JButton startServer = new JButton("Start server");
JTextArea area = new JTextArea();
startServer.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Server server = new Server(area);
server.startServer();
startServer.setEnabled(false);
}
});
p.add(startServer);
p.add(new JScrollPane(area));
f.add(p);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
Per quanto riguarda il file MessagesHandler.java:
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import javax.swing.JTextArea;
public class MessagesHandler implements Runnable {
private Socket socket;
private JTextArea area;
public MessagesHandler(Socket socket, JTextArea area) {
this.socket = socket;
this.area = area;
}
@Override
public void run() {
try {
BufferedOutputStream bOut = new BufferedOutputStream(socket.getOutputStream());
PrintWriter out = new PrintWriter(bOut, true);
out.println("Welcome!");
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while(!Thread.currentThread().isInterrupted()) {
if(in.ready()) {
String line = in.readLine();
area.append("Client wrote: " + line + System.lineSeparator());
if(line.equals("ciao"))
out.println("ciao a te!");
else if(line.equals("come stai?"))
out.println("bene, tu?");
}
}
} catch (IOException e) {
area.append("Connection error: " + e.getMessage() + System.lineSeparator());
}
}
}
Per quanto riguarda il file Server.java:
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.swing.JTextArea;
public class Server implements Runnable {
private JTextArea area;
private ServerSocket server;
private ExecutorService executor;
public Server(JTextArea area) {
this.area = area;
executor = Executors.newCachedThreadPool();
}
public void startServer() {
try {
server = new ServerSocket(8000);
Thread t = new Thread(this);
t.start();
} catch (IOException e) {
area.append("Error while starting the server: " + e.getMessage() + System.lineSeparator());
}
}
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
area.append("Waiting for new connections..." + System.lineSeparator());
Socket socket = server.accept();
area.append("Client connected." + System.lineSeparator());
MessagesHandler handler = new MessagesHandler(socket, area);
executor.submit(handler);
} catch (IOException e) {
area.append("Connection error: " + e.getMessage() + System.lineSeparator());
return;
}
}
}
}
PARTE Client
Per quanto riguarda il file Main.java:
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class Main {
public static void main(String[] args) {
JFrame f = new JFrame("Client");
f.setSize(400,400);
JPanel p = new JPanel();
p.setLayout(new GridLayout(3, 1));
JButton startServer = new JButton("Send message");
JTextArea area = new JTextArea();
area.setEditable(false);
JTextArea myMessages = new JTextArea();
Client c = new Client(area);
c.startClient();
startServer.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
c.sendMessage(myMessages.getText());
myMessages.setText("");
}
});
p.add(startServer);
p.add(new JScrollPane(area));
p.add(new JScrollPane(myMessages));
f.add(p);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
Per quanto riguarda il file Client.java:
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import javax.swing.JTextArea;
public class Client implements Runnable {
private JTextArea area;
private Socket socket;
public Client(JTextArea area) { this.area = area; }
public void startClient() {
try {
socket = new Socket("localhost", 8000);
Thread t = new Thread(this);
t.start();
} catch (IOException e) {
area.append("Connection error: " + e.getMessage() + System.lineSeparator());
}
}
public void sendMessage(String text) {
if(socket == null)
return;
try {
BufferedOutputStream bOut = new BufferedOutputStream(socket.getOutputStream());
PrintWriter out = new PrintWriter(bOut, true);
out.println(text);
} catch (IOException e) {
area.append("Connection error: " + e.getMessage() + System.lineSeparator());
}
}
@Override
public void run() {
if(socket == null)
return;
try {
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while(!Thread.currentThread().isInterrupted()) {
if(in.ready()) {
area.append("Server wrote: " + in.readLine() + System.lineSeparator());
}
}
} catch (IOException e) {
area.append("Connection error: " + e.getMessage() + System.lineSeparator());
}
}
}