Я пытаюсь написать простую консольную программу, которая позволяет отправлять и получать сообщения String. Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как одновременно запускать код приема и код отправки.Как запустить эти две петли одновременно? (Java)
Индивидуально, классы работают. Я могу получать пакеты и отправлять пакеты, но заставить их работать сразу кажется мне невозможным.
Я искал многопоточность, но поскольку мои знания все еще очень просты, я не могу понять, как это работает.
Это код, который я использую в настоящее время. Я сам написал класс Dialog и нашел два других класса в Интернете.
Dialog класс:
import java.util.Scanner;
public class Dialog {
Scanner scanner = new Scanner(System.in);
User user = new User();
Network net = new Network();
ThreadReceive tr = new ThreadReceive();
ThreadSend ts = new ThreadSend();
public void run() {
System.out.println("WELCOME");
System.out.print("Port: ");
while(!user.setPort(giveInput())) {
System.out.println("Enter a valid port.");
}
System.out.print("IP: ");
user.setIP(giveInput());
System.out.println();
System.out.println("--- CONVERSATION STARTED ---");
tr.receive(user.getIP(), user.getPort()); // Starts receiving loop (within ThreadReceive class).
while (true) { // Starts sending loop.
ts.sendMessage(giveInput(), user.getIP(), user.getPort()); // Sends packet when input is given.
}
}
private String giveInput() {
String input = scanner.nextLine();
return input;
}
}
Принимающий класс:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class ThreadReceive extends Thread {
public void receive(String ip, int port) {
try {
// Create a socket to listen on the port.
DatagramSocket dsocket = new DatagramSocket(port);
// Create a buffer to read datagrams into. If a
// packet is larger than this buffer, the
// excess will simply be discarded!
byte[] buffer = new byte[2048];
// Create a packet to receive data into the buffer
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
// Now loop forever, waiting to receive packets and printing them.
while (true) {
// Wait to receive a datagram
dsocket.receive(packet);
// Convert the contents to a string, and display them
String msg = new String(buffer, 0, packet.getLength());
System.out.println(packet.getAddress().getHostName() + ": " + msg);
// Reset the length of the packet before reusing it.
packet.setLength(buffer.length);
}
}
catch (Exception e) {
System.err.println(e);
}
}
}
Отправив класс:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class ThreadSend extends Thread {
public void sendMessage(String message, String ip, int port) {
try {
byte[] data = message.getBytes();
InetAddress address = InetAddress.getByName(ip);
DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
DatagramSocket datagramSocket = new DatagramSocket();
datagramSocket.send(packet);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
Кроме того, есть ли способ, чтобы проверить, могу ли я принимать пакеты? Я тестировал его с другом, но было бы гораздо удобнее сделать это сам.
Спасибо!
Не могли бы вы просто сделать две программы, чтобы разговаривать друг с другом, а не пытаться сделать это в одном? – doctorlove
Ну, я хочу отправить код своему другу, чтобы узнать, можно ли общаться через консоль. Это означает, что необходимо прослушивать пакеты и позволять отправлять пакеты одновременно. – Daan
Замечание, не связанное с вопросом: рассмотрите использование Executors/ThreadFactory вместо создания подклассов Thread: http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/package-summary.html – Puce