我一直在嘗試在java中學習網絡,並開始通過簡單的GUI製作簡單的客戶端/服務器程序。服務器只有一個JTextArea,客戶端有一個JTextField,JTextArea和一個JButton。它的工作方式是客戶端用戶在JTextField中輸入消息並單擊JButton(發送)。這將調用sendData方法,該方法將客戶端輸入的消息放入DatagramPacket中,並將數據包發送到預定義端口上的服務器。啓動時服務器創建一個線程,該線程連續循環,以便使用DatagramSocket.recieve(DatagramPacket)方法被動地偵聽數據包。如果收到一個數據包,它會用數據包中的數據更新gui的JTextArea。但是,似乎數據包沒有到達服務器。我已經在LAN網絡上測試過了,它正在工作。但是,當通過互聯網使用時,數據包似乎正在丟失。我已經嘗試過兩個不同的人,他們已經將他們的端口轉發並確保他們被轉發。客戶端和服務器都由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和麪板類的新實例,並將其設置爲其內容窗格。我沒有包含服務器的面板類,因爲它不包含任何重要的代碼。
再次感謝。
嗨,網絡已配置(端口已被轉發)。但我忘了防火牆。我將配置防火牆並再次嘗試。感謝 –
嗨,我已經配置了防火牆和網絡,並且仍然沒有數據包似乎到達服務器。有任何想法嗎? –
其他人有什麼想法?你能幫忙的話,我會很高興。謝謝 –