一個簡單UDP通信程序的問題

 最近在學java網絡編程,我寫了一個小的udp程序,不過遇到一個問題:

 

如圖,192.168.3.2是內網主機,通過192.168.3.1代理上網

            192.168.3.1是服務器,裏面添加了路由和遠程訪問角色,一做nat端口映射

            10.59.12.99是外網主機

            所有主機都沒有開啓防火牆

當前,192.168.3.2和10.59.12.99都有該聊天程序,兩臺主機可以通信,通過192.168.3.2可以向10.59.12.99發送消息

問:如何從10.59.12.99向192.168.3.2發送消息???

程序截圖:

 

端口映射截圖:

 

程序如下:

 

  1. package lwb.it.gui.chat; 
  2.  
  3. import java.awt.Dimension; 
  4. import java.awt.FlowLayout; 
  5. import java.awt.List; 
  6. import java.awt.event.ActionEvent; 
  7. import java.awt.event.ActionListener; 
  8. import java.awt.event.WindowEvent; 
  9. import java.awt.event.WindowListener; 
  10. import java.net.DatagramPacket; 
  11. import java.net.DatagramSocket; 
  12. import java.net.InetAddress; 
  13. import java.net.SocketException; 
  14.  
  15. import javax.swing.JButton; 
  16. import javax.swing.JFrame; 
  17. import javax.swing.JPanel; 
  18. import javax.swing.JTextField; 
  19.  
  20. public class ChatRoom { 
  21.  
  22.     static JTextField fieldIP = null
  23.     static JTextField fieldDT =null
  24.     static List list = null
  25.     static DatagramPacket datagramPacket = null
  26.     static DatagramSocket datagramSocket = null
  27.     /** 
  28.      * @param args 
  29.      */ 
  30.     public static void main(String[] args)  { 
  31.  
  32.         try { 
  33.             datagramSocket = new DatagramSocket(3500); 
  34.         } catch (SocketException e1) { 
  35.             // TODO Auto-generated catch block 
  36.             e1.printStackTrace(); 
  37.         } 
  38.         final JFrame frame = new JFrame("聊天室"); 
  39.         frame.setLayout(new FlowLayout()); 
  40.         list = new List(10); 
  41.         JPanel p = new JPanel(); 
  42.         frame.add(list); 
  43.         frame.add(p); 
  44.         fieldIP =  new JTextField(10); 
  45.         fieldDT = new JTextField(16); 
  46.         final JButton button = new JButton("發送"); 
  47.         p.add(fieldIP); 
  48.         p.add(fieldDT); 
  49.         frame.add(button); 
  50.         list.setSize(new Dimension(300, 400)); 
  51.         p.setPreferredSize(new Dimension(310, 20)); 
  52.          
  53.         p.setLocation(0, 200); 
  54.          
  55.         frame.setBounds(200,200,320,260); 
  56.         frame.setResizable(false); 
  57.         frame.setVisible(true); 
  58.         new Thread(new Runnable() { 
  59.              
  60.             @Override 
  61.             public void run() { 
  62.                  
  63.                  
  64.                 button.addActionListener(new ActionListener() { 
  65.                      
  66.                     @Override 
  67.                     public void actionPerformed(ActionEvent e) { 
  68.                         String IP = fieldIP.getText(); 
  69.                         String DT = fieldDT.getText(); 
  70.                          
  71.                         try { 
  72.                              
  73.                              
  74.                                 byte [] buf = DT.getBytes("utf-8"); 
  75.                                 datagramPacket = new DatagramPacket(buf, 
  76.                                         buf.length, 
  77.                                         InetAddress.getByName(IP), 2000); 
  78.                                 datagramSocket.send(datagramPacket); 
  79.                                 // datagramSocket.close(); 
  80.                                 fieldDT.setText(null); 
  81.                         } catch (Exception exception) { 
  82.                             exception.printStackTrace(); 
  83.                         }  
  84.                     } 
  85.                 }); 
  86.             } 
  87.         }).start(); 
  88.         new Thread(new Runnable() { 
  89.              
  90.             @Override 
  91.             public void run() { 
  92.                 try { 
  93.                     DatagramSocket datagramSocket = new DatagramSocket(2000); 
  94.                     byte[] buf = new byte[512]; 
  95.                     DatagramPacket datagramPacket = new DatagramPacket(buf, 512); 
  96.                     while (true) { 
  97.                         datagramSocket.receive(datagramPacket); 
  98.                         list.add(new String(datagramPacket.getData(), 0, 
  99.                                 datagramPacket.getLength(),"utf-8") +"   -- " +datagramPacket.getAddress().getHostAddress() + " :"+ datagramPacket.getPort()); 
  100.                     } 
  101.                 } catch (Exception e) { 
  102.                     e.printStackTrace(); 
  103.                 } 
  104.                 frame.addWindowListener(new WindowListener() { 
  105.                     @Override 
  106.                     public void windowClosing(WindowEvent e) { 
  107.                         datagramSocket.close(); 
  108.                         System.out.println("123"); 
  109.                         e.getWindow().dispose(); 
  110.                     } 
  111.                      
  112.                     @Override 
  113.                     public void windowClosed(WindowEvent e) { 
  114.                         System.exit(0);  
  115.                     } 
  116.  
  117.                     @Override 
  118.                     public void windowOpened(WindowEvent e) { 
  119.                         // TODO Auto-generated method stub 
  120.                          
  121.                     } 
  122.  
  123.                     @Override 
  124.                     public void windowIconified(WindowEvent e) { 
  125.                         // TODO Auto-generated method stub 
  126.                          
  127.                     } 
  128.  
  129.                     @Override 
  130.                     public void windowDeiconified(WindowEvent e) { 
  131.                         // TODO Auto-generated method stub 
  132.                          
  133.                     } 
  134.  
  135.                     @Override 
  136.                     public void windowActivated(WindowEvent e) { 
  137.                         // TODO Auto-generated method stub 
  138.                          
  139.                     } 
  140.  
  141.                     @Override 
  142.                     public void windowDeactivated(WindowEvent e) { 
  143.                         // TODO Auto-generated method stub 
  144.                          
  145.                     } 
  146.                      
  147.                 });              
  148.             } 
  149.         }).start(); 
  150.          
  151.     } 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章