Volkov31
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Здравствуйте, у меня стоит роутер TP-Link и возникла проблема с портами. Я написал небольшое серверное приложение и небольшой чат. Запускаю сервер, запускаю клиент через компьютер подключенный к роутеру (подключение по ip 192.168.0.100) и все работает, но если клиент подключается через компьютер, неподключенный к моему роутеру (подключается друг по моему внешнему ip), то ничего не работает. Используется порт 5001, он открыт в роутере, фаервол отключен, 2ip показывает что порт закрыт. Почему не подключается и как открыть порт? Сервер: Код: import java.io.*; import java.net.*; import java.util.*; import javax.swing.*; import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.event.*; public class ChatServer{ ArrayList clientOutputStreams; JPanel statistic; JLabel Label1; int clients; public class ClientHandler implements Runnable { BufferedReader reader = null; Socket sock = null; PrintWriter sockWriter = null; public ClientHandler(Socket clientSOcket, PrintWriter writerr) { try { sock = clientSOcket; InputStreamReader isReader = new InputStreamReader(sock.getInputStream()); reader = new BufferedReader(isReader); sockWriter = writerr; } catch (Exception ex) { ex.printStackTrace(); } } public void run() { String message; try { while ((message = reader.readLine()) != null) { System.out.println("read " + message); System.out.println("отправка " + message); tellEveryone(message); } } catch (IOException e) { System.out.println("Соединение закрыто. " ); clientOutputStreams.remove(sockWriter); clients = clientOutputStreams.size(); String clientsString = Integer.toString(clients); Label1.setText("Кол-во клиентов: "+clientsString); } } } public static void main(String[] args) { new ChatServer().go(); } public void go() { Gui(); clientOutputStreams = new ArrayList(); try { System.out.println("Работаем "); ServerSocket serverSock = new ServerSocket(5001); while(true) { Socket clientSocket = serverSock.accept(); PrintWriter writer = new PrintWriter(clientSocket.getOutputStream()); Thread t = new Thread(new ClientHandler(clientSocket,writer)); t.start(); clientOutputStreams.add(writer); clients = clientOutputStreams.size(); String clientsString = Integer.toString(clients); Label1.setText("Кол-во клиентов: "+clientsString); } } catch (Exception ex) { ex.printStackTrace(); } } public void Gui() { JFrame frame = new JFrame("Сервер"); JPanel controlButton = new JPanel(); statistic = new JPanel(); JButton button1 = new JButton("Стоп"); JButton button2 = new JButton("Старт"); Label1 = new JLabel("Кол-во клиентов: "+clients); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); controlButton.add(button1); controlButton.add(button2); statistic.add(Label1); frame.getContentPane().add(BorderLayout.NORTH, controlButton); frame.getContentPane().add(BorderLayout.CENTER, statistic); frame.pack(); frame.setSize(400, 300); frame.setLocationRelativeTo(null); frame.setVisible(true); } public void tellEveryone(String message) { Iterator it = clientOutputStreams.iterator(); while (it.hasNext()) { try { PrintWriter writer = (PrintWriter) it.next(); writer.println(message); writer.flush(); System.out.println("отправлено " + message+writer); } catch (Exception ex) { ex.printStackTrace(); } } } } | Клиент: Код: import java.io.*; import java.net.*; import java.util.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class ChatClient { JTextArea incoming; JTextField outgoing; JLabel nameLabel; JButton nameButton; JPanel mainPanel; JLabel nameLabel1; JPanel namePanel; JPanel namePanel1; JFrame frame; JPanel controlPanel; JTextField nameText; JLabel controlLabel = new JLabel(); JMenuBar menuBar; JMenu menu; JMenu ipMenu; JMenuItem IpItem1; JMenuItem IpItem2; JScrollPane qScroller; BufferedReader reader = null; PrintWriter writer = null; Socket sock; String name = ""; String ip = "dwolkov.ddns.net"; public static void main(String[] args){ new ChatClient(); } public ChatClient(){ String s = (String) JOptionPane.showInputDialog(frame, "Введите IP: ", "Введите IP", JOptionPane.PLAIN_MESSAGE); System.out.println("Ip: " + s); ip = s; setUpNetworking(ip); gui(); } public void gui(){ frame = new JFrame("Чат"); mainPanel = new JPanel(); namePanel = new JPanel(); controlPanel = new JPanel(); menuBar = new JMenuBar(); menu = new JMenu("Настройки"); ipMenu = new JMenu("IP"); IpItem1 = new JMenuItem("Локально"); IpItem2 = new JMenuItem("Удаленно"); incoming = new JTextArea(13,40); incoming.setEditable(false); incoming.setLineWrap(true); incoming.setWrapStyleWord(true); qScroller = new JScrollPane(incoming); qScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); qScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); outgoing = new JTextField(20); outgoing.setText(""); nameText = new JTextField(20); nameLabel = new JLabel(""); nameLabel = new JLabel("Ник:"); JButton sendButton = new JButton("Отправить"); nameButton = new JButton("Отправить"); sendButton.addActionListener(new SendButtonListener()); nameButton.addActionListener(new NameButtonListener()); IpItem1.addActionListener(new IpItemListener()); namePanel.add(nameLabel); namePanel.add(nameText); namePanel.add(nameButton); mainPanel.add(qScroller); mainPanel.add(outgoing); mainPanel.add(sendButton); controlPanel.add(controlLabel); ipMenu.add(IpItem1); ipMenu.add(IpItem2); menu.add(ipMenu); menuBar.add(menu); frame.addWindowListener(new WindowCloseListen()); frame.setJMenuBar(menuBar); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(BorderLayout.CENTER, mainPanel); frame.getContentPane().add(BorderLayout.NORTH, namePanel); frame.getContentPane().add(BorderLayout.SOUTH, controlPanel); frame.setSize(500, 400); frame.setLocationRelativeTo(null); frame.setVisible(true); } public class SendButtonListener implements ActionListener{ public void actionPerformed(ActionEvent ev){ try{ if(nameLabel1 != null){ writer.println("["+name+"] » "+outgoing.getText()); writer.flush(); qScroller.getVerticalScrollBar().setValue(9999);} else{ controlLabel.setText("Введите имя!"); } }catch(Exception ex){ ex.printStackTrace(); } outgoing.setText(""); outgoing.requestFocus(); } } class WindowCloseListen implements WindowListener{ public void windowActivated(WindowEvent e) {} public void windowClosed(WindowEvent e) {} public void windowDeactivated(WindowEvent e) {} public void windowDeiconified(WindowEvent e) {} public void windowIconified(WindowEvent e) {} public void windowOpened(WindowEvent e) {} public void windowClosing(WindowEvent arg0) { if(writer != null){ if(name != ""){ writer.println("<|"+name+"|> » отключился."); writer.flush();} } } } public class NameButtonListener implements ActionListener{ public void actionPerformed(ActionEvent ev){ try{ if(!nameText.getText().isEmpty()&&nameText.getText().length() < 21){ name = nameText.getText(); namePanel.setVisible(false); namePanel1 = new JPanel(); nameLabel1 = new JLabel(""); nameLabel1.setText(name); namePanel1.add(nameLabel); namePanel1.add(nameLabel1); frame.getContentPane().add(BorderLayout.NORTH, namePanel1); writer.println(">|"+name+"|< » подключился."); writer.flush(); System.out.println("Имя: "+name); if(controlLabel.getText() == "Введите имя!"||controlLabel.getText() == "Введите имя которое не больше 10 символов!"){ controlLabel.setText("Имя введено."); } } else{ controlLabel.setText("Введите имя которое не больше 10 символов!"); nameText.requestFocus(); } }catch(Exception ex){ ex.printStackTrace(); } } } public class IpItemListener implements ActionListener{ public void actionPerformed(ActionEvent e) { System.out.println("Ш: "+e.getSource()); JMenuItem ipButton = (JMenuItem) e.getSource(); try { if(ipButton == IpItem1){ try{ sock.close(); }catch(Exception ex){} String[] localIP ; localIP =(InetAddress.getLocalHost().toString()).split("/"); setUpNetworking(localIP[1]); System.out.println(localIP[1]);} } catch (Exception e1) { e1.printStackTrace(); } if(ipButton == IpItem2){ try{ sock.close(); }catch(Exception ex){} setUpNetworking(ip); } System.out.println("Нажали: "); } } public void setUpNetworking(String net){ try{ InetAddress address = InetAddress.getByName(net); System.out.println(address); sock = new Socket( address, 5001); InputStreamReader streamReader = new InputStreamReader(sock.getInputStream()); reader = new BufferedReader(streamReader); writer = new PrintWriter(sock.getOutputStream()); Thread readerThread = new Thread(new IncomingReader()); readerThread.start(); controlLabel.setText("Соединение установлено."); }catch(Exception ex){ JOptionPane.showMessageDialog(frame , "Соединение с сервером не установлено!", "Ошибка соединения", JOptionPane.ERROR_MESSAGE); ex.printStackTrace(); controlLabel.setText("Соединение не установлено1."); } } public class IncomingReader implements Runnable{ public void run(){ String message; try{ while(reader!=null&&(message = reader.readLine())!=null){ incoming.append(message + "\n"); System.out.println("Принято " + message); } }catch(Exception ex){ ex.printStackTrace(); } } } } |
| Всего записей: 16 | Зарегистр. 04-06-2016 | Отправлено: 21:52 17-12-2016 | Исправлено: Volkov31, 21:53 17-12-2016 |
|