Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Сервер и клиент Java

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

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
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Volkov31

Цитата:
внешнему ip

который как выглядит? может он тоже серый.

Всего записей: 15113 | Зарегистр. 20-09-2014 | Отправлено: 23:53 17-12-2016
Volkov31



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нормальный вроде
 
   

Всего записей: 16 | Зарегистр. 04-06-2016 | Отправлено: 16:31 18-12-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Volkov31

Цитата:
Нормальный вроде  

У всех он в конце концов "нормальный", смотреть нужно в роутере что назначается на внешний интерфейс!

Всего записей: 15113 | Зарегистр. 20-09-2014 | Отправлено: 16:35 18-12-2016
Volkov31



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А где посмотреть?
 
Я нашел где. У меня серый IP. Я забыл сказать, что я пользуюсь сайтом NO-IP, пытался через DNS(с NO-IP) тоже не получается.
Что делать?
 
P.S. В роутер вставлен 3G модем.
 
 

Всего записей: 16 | Зарегистр. 04-06-2016 | Отправлено: 17:47 18-12-2016 | Исправлено: Volkov31, 18:11 18-12-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Что делать?  

Покупать у провайдера белый, либо использовать hamachi или располагать серверную часть чата на внешнем сервере.

Всего записей: 15113 | Зарегистр. 20-09-2014 | Отправлено: 19:20 18-12-2016
Volkov31



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Серверную часть можно расположить на любом внешнем сервере или нужно искать специальный? Бесплатно ли это? Способ с Hamachi сработал, спасибо).

Всего записей: 16 | Зарегистр. 04-06-2016 | Отправлено: 21:23 18-12-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Volkov31

Цитата:
любом внешнем сервере или нужно искать специальный?

тот, который позволит запустить серверную часть и разрешит подключения к ней.
 

Цитата:
Бесплатно ли это?  

обычно нет

Всего записей: 15113 | Зарегистр. 20-09-2014 | Отправлено: 21:30 18-12-2016
Volkov31



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Большое спасибо за помощь!

Всего записей: 16 | Зарегистр. 04-06-2016 | Отправлено: 20:34 19-12-2016
landy



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Volkov31, еще можно попробовать использовать Динамический DNS, твой роутер эту фичу поддерживает. Тогда можно будет обращаться по доменному имени к твоему внутреннему динамическому IP.

Всего записей: 576 | Зарегистр. 17-01-2003 | Отправлено: 15:31 16-01-2017
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Сервер и клиент Java


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru