Я пытался научиться созданию сетей в Java и начал с создания простой клиент-серверной программы с простым графическим интерфейсом. Сервер просто имеет JTextArea, и клиент имеет JTextField, JTextArea и JButton. Способ, которым он предназначен, заключается в том, что пользователь на стороне клиента создает сообщение в JTextField и нажимает JButton (Отправить). Это вызывает метод sendData, который принимает сообщение, набранное Клиентом, помещает его в DatagramPacket и отправляет пакет на Сервер на предопределенный порт. Сервер при запуске создает поток, который непрерывно циклически разрешает ему пассивно прослушивать пакеты с использованием метода DatagramSocket.recieve (DatagramPacket). Если пакет получен, он обновляет JTextArea gui с данными в пакете. Однако кажется, что пакеты не доходят до сервера. Я тестировал это в локальной сети, и он работает. Однако при использовании через Интернет пакеты, кажется, теряются. Я пробовал с двумя разными людьми, которые переправили свои порты и уверены, что они отправлены. Клиент и сервер состоят из 3 простых классов. Любая помощь будет принята с благодарностью. Извините за длинное описание и дамп кода. Примечание. Я использую UDP для этого только потому, что хочу изучить его, и я знаю, что TCP может быть лучше для таких вещей, как чат.Java UDP-пакеты, не достигнутые Серверная программа из клиентской программы
Client класс Клиент:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class Client {
DatagramSocket socket;
Panel panel;
public Client(Panel panel) {
this.panel = panel;
try {
socket = new DatagramSocket();
} catch (SocketException e) {
e.printStackTrace();
panel.textArea.setText("Socket could not be created.");
}
}
public void sendData(byte[] data, InetAddress ipAddress){
DatagramPacket packet = new DatagramPacket(data, data.length, ipAddress, 27015);
try {
socket.send(packet);
panel.textArea.setText("Client: Package being sent to server...");
} catch (IOException e) {
e.printStackTrace();
panel.textArea.setText("Package could not be sent");
}
}
}
класс Группа Клиент:
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.InetAddress;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class Panel extends JPanel implements ActionListener {
JButton send;
JTextField textField;
JTextField textArea;
Client client;
InetAddress ipAddress;
public Panel(){
this.setVisible(true);
send = new JButton("Send");
send.addActionListener(this);
send.setVisible(true);
textField = new JTextField();
textField.setVisible(true);
Dimension dim = new Dimension(300,20);
textField.setPreferredSize(dim);
textArea = new JTextField();
Dimension dim2 = new Dimension(300,100);
textArea.setPreferredSize(dim2);
this.add(textField);
this.add(send);
this.add(textArea, FlowLayout.LEFT);
client = new Client(this);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == send){
System.out.println("Send was pressed");
String message = textField.getText();
try {
ipAddress = InetAddress.getByName("localhost");
} catch (UnknownHostException e1) {
e1.printStackTrace();
textArea.setText("Hostname could not be resolved");
}
client.sendData(message.getBytes(), ipAddress);
textArea.setText("Client: " + message);
}
}
}
ServerThread класс сервера:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import javax.swing.JPanel;
public class ServerThread extends Thread{
private DatagramSocket socket;
Panel panel;
public ServerThread(Panel panel) {
this.panel = panel;
try {
socket = new DatagramSocket(27015);
panel.setTextArea("The server has begun listening on port 3659...");
} catch (SocketException e) {
e.printStackTrace();
panel.setTextArea("Server cant open socket and listen on port 3659");
}
}
public void run(){
while(true){
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, data.length);
try {
socket.receive(packet); // waits for packet to arrive
panel.setTextArea("Server: A package was recieved from the Client...");
} catch (IOException e) {
e.printStackTrace();
panel.setTextArea("Socket cant recieve packets");
}
String message = new String(packet.getData());
panel.setTextArea("Client: " + message);
}
}
}
Примечание: Для обоих сервера и клиента, основной класс просто создает новый Jframe и новый экземпляр класса панели и устанавливает его как содержимое панель. Я не включил класс панели для Сервера, так как он не содержит какого-либо значимого кода.
Еще раз спасибо.
Hi, сеть настроена (порты были перенаправлены). Но я забыл о брандмауэре. Я настрою брандмауэр и повторю попытку. Спасибо –
Привет, Я настроил как брандмауэр, так и сеть, и все еще нет пакетов, которые, кажется, доходят до сервера. Есть идеи? –
У кого-нибудь есть идеи? Любая помощь будет приятной. Спасибо –