Загрузка данных
TCPConnectionListener.java
package ru.example.network;
import java.io.IOException;
public interface TCPConnectionListener {
void onConnectionReady(TCPConnection tcpConnection);
void onReceiveString(TCPConnection tcpConnection, String s);
void onDisconnect(TCPConnection tcpConnection);
void onException(TCPConnection tcpConnection, IOException e);
}
¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬TCPConnection.java
package ru.example.network;
import java.io.*;
import java.net.Socket;
import java.nio.charset.Charset;
/**
* Класс представляет TCP-соединение
*/
public class TCPConnection {
private final Socket socket;
private final Thread thread;
private final TCPConnectionListener eventListener;
private final BufferedReader in;
private final BufferedWriter out;
public TCPConnection(TCPConnectionListener eventListener, String ipAddress, int port) throws IOException {
this(eventListener, new Socket(ipAddress, port));
}
public TCPConnection(TCPConnectionListener eventListener, Socket socket) throws IOException {
this.eventListener = eventListener;
this.socket = socket;
in = new BufferedReader(new InputStreamReader(socket.getInputStream(), Charset.forName("UTF-8")));
out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), Charset.forName("UTF-8")));
thread = new Thread(new Runnable() {
@Override
public void run() {
try {
eventListener.onConnectionReady(TCPConnection.this);
while (!thread.isInterrupted()) {
eventListener.onReceiveString(TCPConnection.this, in.readLine());
}
} catch (IOException e) {
eventListener.onException(TCPConnection.this, e);
} finally {
eventListener.onDisconnect(TCPConnection.this);
}
}
});
thread.start();
}
public synchronized void sendString(String value) {
try {
out.write(value + "\r\n");
out.flush();
} catch (IOException e) {
eventListener.onException(this, e);
disconnect();
}
}
private synchronized void disconnect() {
thread.interrupt();
try {
socket.close();
} catch (IOException e) {
eventListener.onException(this, e);
}
}
@Override
public String toString() {
return "TCPConnection: " + socket.getInetAddress() + ": " + socket.getPort();
}
}
ChatServer.java
package ru.example.chat.server;
import ru.example.network.TCPConnection;
import ru.example.network.TCPConnectionListener;
import java.io.IOException;
import java.net.ServerSocket;
import java.util.ArrayList;
@SuppressWarnings("InfiniteLoopStatement")
public class ChatServer implements TCPConnectionListener {
public static void main(String[] args) {
new ChatServer();
}
private final ArrayList<TCPConnection> connections = new ArrayList<>();
private ChatServer() {
System.out.println("Server running...");
try(ServerSocket serverSocket = new ServerSocket(8189)) {
while(true) {
try {
new TCPConnection(this, serverSocket.accept());
} catch (IOException e) {
System.out.println("TCPConnection exception: " + e);
}
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public synchronized void onConnectionReady(TCPConnection tcpConnection) {
connections.add(tcpConnection);
sendToAllConnections("Client connected: " + tcpConnection);
}
@Override
public synchronized void onReceiveString(TCPConnection tcpConnection, String value) {
sendToAllConnections(value);
}
@Override
public synchronized void onDisconnect(TCPConnection tcpConnection) {
connections.remove(tcpConnection);
sendToAllConnections("Client disconnected: " + tcpConnection);
}
@Override
public void onException(TCPConnection tcpConnection, IOException e) {
System.out.println("TCPConnection exception: " + e);
}
private void sendToAllConnections(String value){
System.out.println(value);
for (TCPConnection connection : connections) {
connection.sendString(value);
}
}
}
ClientWindow.java
package ru.example.chat.client;
import ru.example.network.TCPConnection;
import ru.example.network.TCPConnectionListener;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
public class ClientWindow extends JFrame implements ActionListener, TCPConnectionListener {
private static final String IP_ADDR = "10.254.10.145";
private static final int PORT = 8189;
private static final int WIDTH = 600;
private static final int HEIGHT = 400;
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new ClientWindow();
}
});
}
private final JTextArea log = new JTextArea();
private final JTextField fieldNickname = new JTextField("Гость");
private final JTextField fieldInput = new JTextField();
private TCPConnection connection;
private ClientWindow() {
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setSize(WIDTH, HEIGHT);
setLocationRelativeTo(null);
setAlwaysOnTop(true);
add(fieldNickname, BorderLayout.NORTH);
log.setEditable(false);
log.setLineWrap(true);
add(new JScrollPane(log), BorderLayout.CENTER);
fieldInput.addActionListener(this);
add(fieldInput, BorderLayout.SOUTH);
setVisible(true);
try {
connection = new TCPConnection(this, IP_ADDR, PORT);
} catch (IOException e) {
printMessage("Connection exception: " + e);
}
}
@Override
public void actionPerformed(ActionEvent e) {
String msg = fieldInput.getText();
if (msg.equals("")) return;
fieldInput.setText(null);
connection.sendString(fieldNickname.getText() + ": " + msg);
}
@Override
public void onConnectionReady(TCPConnection tcpConnection) {
printMessage("Connection ready...");
}
@Override
public void onReceiveString(TCPConnection tcpConnection, String value) {
printMessage(value);
}
@Override
public void onDisconnect(TCPConnection tcpConnection) {
printMessage("Connection close");
}
@Override
public void onException(TCPConnection tcpConnection, IOException e) {
printMessage("Connection exception: " + e);
}
private synchronized void printMessage(String message) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
log.append(message + "\n");
}
});
}
}