2013-07-18 3 views
0

Я пытался научиться созданию сетей в 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 и новый экземпляр класса панели и устанавливает его как содержимое панель. Я не включил класс панели для Сервера, так как он не содержит какого-либо значимого кода.

Еще раз спасибо.

ответ

1

Похоже, что конфигурации сетевой безопасности не позволяют получать UDP-пакеты. Вам необходимо настроить свою сеть таким образом, чтобы она принимала пакеты UDP на указанных портах. Кроме того, вам необходимо настроить брандмауэр для приема пакетов UDP на указанных портах.

+1

Hi, сеть настроена (порты были перенаправлены). Но я забыл о брандмауэре. Я настрою брандмауэр и повторю попытку. Спасибо –

+0

Привет, Я настроил как брандмауэр, так и сеть, и все еще нет пакетов, которые, кажется, доходят до сервера. Есть идеи? –

+0

У кого-нибудь есть идеи? Любая помощь будет приятной. Спасибо –

Смежные вопросы