Помощь с графическим интерфейсом для отправки и получения сообщений / датаграмм: нет сервера - PullRequest
0 голосов
/ 08 ноября 2018

Это код для этого через консоль, но моя миссия состоит в том, чтобы разработать графический интерфейс с использованием методов, уже предоставленных в моем классе 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!");
    }

}
...