Это код для этого через консоль, но моя миссия состоит в том, чтобы разработать графический интерфейс с использованием методов, уже предоставленных в моем классе Socket. Это не приложение клиент / сервер. Я не нахожусь в стороне от света с небольшим знанием, которым я обладаю, используя JFrame, реализующий ActionListeners, чтобы иметь достойный графический интерфейс для этого проекта. Я должен заранее объявить через GUI, на какой IP-адрес отправляется сообщение (сокет будет уникальным при 64000 для исходящих и входящих сообщений) и отображать сообщения, отправленные и полученные в разных окнах чата (фреймах) для каждого IP-адреса, к которому подключается я или что я соединяюсь с. Я знаю, что мне нужен потенциальный JTextField для IP-адреса, куда отправляется сообщение, другой JTextField для отправляемого сообщения, JTextArea для входящих и исходящих сообщений, JButton для отправки сообщений и заголовок моего в окне должен отображаться IP-адрес, с которым я разговариваю, и используемый номер сокета. Для многих это может быть так просто, но я был бы очень признателен, если бы вы поделились своими знаниями, потому что я только пытаюсь учиться и становиться лучше.
Socket.java
import java.net.*;
import java.util.*;
import java.util.concurrent.*;
public class Socket {
private InetAddress myAddress;
private int port;
private DatagramSocket socket = null;
private ConcurrentLinkedQueue<DatagramPacket> messageQueue = new ConcurrentLinkedQueue<DatagramPacket>();
public Socket(int port) {
this.port = port;
try {
this.myAddress = InetAddress.getLocalHost();
this.socket = new DatagramSocket(port, this.myAddress);
} catch (Exception e) {
e.printStackTrace();
System.exit(-1);
}
Thread receiveThread = new Thread(
new Runnable() {
public void run() {
receiveThread();
}
});
receiveThread.setName("Receive Thread For Port = " + this.port);
receiveThread.start();
}
public void receiveThread() {
do {
byte[] inBuffer = new byte[1024];
for ( int i = 0 ; i < inBuffer.length ; i++ ) {
inBuffer[i] = ' ';
}
DatagramPacket inPacket = new DatagramPacket(inBuffer, inBuffer.length);
try {
// this is a blocking call
socket.receive(inPacket);
} catch(Exception e) {
e.printStackTrace();
System.exit(-1);
}
String message = new String(inPacket.getData());
System.out.println("ReceiveThread - Message on port = " + this.port +"\n"+
" message = " + message + "\n" +
" From IP = " + inPacket.getAddress() + " -"+
" From Port = " + inPacket.getPort()
);
messageQueue.add(inPacket);
} while(true);
}
public DatagramPacket receive() {
return messageQueue.poll();
}
public void send(String s, InetAddress destinationIP, int destinationPort) {
byte[] outBuffer;
try {
outBuffer = s.getBytes();
DatagramPacket outPacket = new DatagramPacket(outBuffer, s.length());
outPacket.setAddress(destinationIP);
outPacket.setPort(destinationPort);
socket.send(outPacket);
} catch (Exception e) {
e.printStackTrace();
System.exit(-1);
}
}
}
// Driver.java
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.util.concurrent.TimeUnit;
public class Driver {
public static void main(String[] args) {
Socket socket = new Socket(64000);
InetAddress myAddress = null;
try {
//myAddress = InetAddress.getByName("192.168.1.xxx"); //Router B
myAddress = InetAddress.getLocalHost();
} catch (Exception e) {
e.printStackTrace();
System.exit(-1);
}
socket.send("This is Me", myAddress, 64000);
socket.send("I am IP 192.168.1.xxx", myAddress, 64000);
try {
System.out.println("Main is sleeping");
TimeUnit.SECONDS.sleep(2);
System.out.println("Main is awake");
} catch (Exception e) {
e.printStackTrace();
System.exit(-1);
}
DatagramPacket packet;
do {
packet = socket.receive();
if (packet != null) {
String message = new String(packet.getData());
System.out.println("Message = " + message);
}
} while(packet != null);
System.out.println("End of fun!");
}
}