2013-07-18 39 views
0

我一直在嘗試在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和麪板類的新實例,並將其設置爲其內容窗格。我沒有包含服務器的面板類,因爲它不包含任何重要的代碼。

再次感謝。

回答

1

聽起來像網絡安全配置阻止您接收UDP數據包。您需要配置您的網絡,使其接受指定端口上的UDP數據包。此外,您還必須配置防火牆以在指定的端口上接受UDP數據包。

+1

嗨,網絡已配置(端口已被轉發)。但我忘了防火牆。我將配置防火牆並再次嘗試。感謝 –

+0

嗨,我已經配置了防火牆和網絡,並且仍然沒有數據包似乎到達服務器。有任何想法嗎? –

+0

其他人有什麼想法?你能幫忙的話,我會很高興。謝謝 –