最近在學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發送消息???
程序截圖:
端口映射截圖:
程序如下:
- package lwb.it.gui.chat;
- import java.awt.Dimension;
- import java.awt.FlowLayout;
- import java.awt.List;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.awt.event.WindowEvent;
- import java.awt.event.WindowListener;
- import java.net.DatagramPacket;
- import java.net.DatagramSocket;
- import java.net.InetAddress;
- import java.net.SocketException;
- import javax.swing.JButton;
- import javax.swing.JFrame;
- import javax.swing.JPanel;
- import javax.swing.JTextField;
- public class ChatRoom {
- static JTextField fieldIP = null;
- static JTextField fieldDT =null;
- static List list = null;
- static DatagramPacket datagramPacket = null;
- static DatagramSocket datagramSocket = null;
- /**
- * @param args
- */
- public static void main(String[] args) {
- try {
- datagramSocket = new DatagramSocket(3500);
- } catch (SocketException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- }
- final JFrame frame = new JFrame("聊天室");
- frame.setLayout(new FlowLayout());
- list = new List(10);
- JPanel p = new JPanel();
- frame.add(list);
- frame.add(p);
- fieldIP = new JTextField(10);
- fieldDT = new JTextField(16);
- final JButton button = new JButton("發送");
- p.add(fieldIP);
- p.add(fieldDT);
- frame.add(button);
- list.setSize(new Dimension(300, 400));
- p.setPreferredSize(new Dimension(310, 20));
- p.setLocation(0, 200);
- frame.setBounds(200,200,320,260);
- frame.setResizable(false);
- frame.setVisible(true);
- new Thread(new Runnable() {
- @Override
- public void run() {
- button.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- String IP = fieldIP.getText();
- String DT = fieldDT.getText();
- try {
- byte [] buf = DT.getBytes("utf-8");
- datagramPacket = new DatagramPacket(buf,
- buf.length,
- InetAddress.getByName(IP), 2000);
- datagramSocket.send(datagramPacket);
- // datagramSocket.close();
- fieldDT.setText(null);
- } catch (Exception exception) {
- exception.printStackTrace();
- }
- }
- });
- }
- }).start();
- new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- DatagramSocket datagramSocket = new DatagramSocket(2000);
- byte[] buf = new byte[512];
- DatagramPacket datagramPacket = new DatagramPacket(buf, 512);
- while (true) {
- datagramSocket.receive(datagramPacket);
- list.add(new String(datagramPacket.getData(), 0,
- datagramPacket.getLength(),"utf-8") +" -- " +datagramPacket.getAddress().getHostAddress() + " :"+ datagramPacket.getPort());
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- frame.addWindowListener(new WindowListener() {
- @Override
- public void windowClosing(WindowEvent e) {
- datagramSocket.close();
- System.out.println("123");
- e.getWindow().dispose();
- }
- @Override
- public void windowClosed(WindowEvent e) {
- System.exit(0);
- }
- @Override
- public void windowOpened(WindowEvent e) {
- // TODO Auto-generated method stub
- }
- @Override
- public void windowIconified(WindowEvent e) {
- // TODO Auto-generated method stub
- }
- @Override
- public void windowDeiconified(WindowEvent e) {
- // TODO Auto-generated method stub
- }
- @Override
- public void windowActivated(WindowEvent e) {
- // TODO Auto-generated method stub
- }
- @Override
- public void windowDeactivated(WindowEvent e) {
- // TODO Auto-generated method stub
- }
- });
- }
- }).start();
- }
- }