java.net.SocketException: сброс соединения - PullRequest
0 голосов
/ 28 января 2010

Я использую Java-код клиент-сервер на своей локальной машине и подключаю их с помощью сокетов Java.

Сначала я могу подключить клиента к серверу и отправить строку данных. Когда сервер получает данные, он также возвращает строку, изначально.

После этого общения все просто падает. Нет ответа с обеих сторон.

Я использую графический интерфейс javafx, и данные, возвращаемые с сервера, должны вызывать некоторые действия (вставлять узлы в стадию javafx). У меня есть наблюдаемое для этого. Но даже без javafx клиент зависает после получения данных с сервера (он фактически получает). Это как-то связано с потоками ввода / вывода.

Очевидно, что у многих была эта проблема, но никто не публикует решения. О, я отключил свой брандмауэр.

Что такое сброс соединения? Это может быть javafx? Я не очень хорош в этом. Еще одна вещь, я использую отдельный класс Java (кроме класса Java) для подключения. Класс javafx создает объект, который обрабатывает соединение. Поэтому я просто вызываю методы (например, streamFromServer, который слушает входной поток сокета). Только при вызове этого метода происходит сбой клиента, поэтому я знаю, что он как-то связан с потоками ввода / вывода.


Мне удалось решить проблему, выполнение на стороне клиента было приостановлено циклом while, как показано ниже:

try{
   String ins;
   while((ins = (String)in.readObject()) != null){
      //do something with the data read in.
      //'in' is an ObjectInputStream bound to a client socket
   }
} catch(Exception e){
   e.printStackTrace();
}

Цикл while связывал выполнение на клиенте, и поэтому программа не могла выйти за пределы этой точки, поэтому, будучи невежественным пользователем, я предположил, что программа потерпела крах.

Я справился с этим, создав новый класс, который реализует runnable, и создал в нем поток, который проверяет входной поток вместо основной клиентской программы, например:

try{
    in = new ObjectInputStream(clientSocket.getInputStream());
    listenerThread = new StreamListener(in);
} catch(Exception e){
    e.printStackTrace();        
}

И класс StreamListener:

import java.io.ObjectInputStream;
import java.util.Observable;

public class StreamListener  extends Observable implements Runnable{
    private ObjectInputStream in = null;
    public String[] bubbles = null;
    private boolean connectionOpen = true;
    public StreamListener(ObjectInputStream in){
        this.in = in;
        Thread t = new Thread(this);
        t.start();
    }
    @Override
    public void run(){
        while(connectionOpen){
            try{
                String ins;
                while((ins = (String)in.readObject()) != null){
                    System.out.println("Received: " + ins);
                    if(ins.equals("noInitial")){
                        System.out.println("Reply of no initial from server, I must be the first to connect");
                    }
                    if(ins.contains("initial#")){
                        initiateBubbles(ins.substring(8));
                    }
                    if(ins.contains("new#")){
                        int index = bubbles.length;
                        String s = ins.substring(4);
                        bubbles[index] = s;
                    }
                    if(ins.contains("drag#")){
                        String s = ins.substring(5), owner = s.substring(0,s.indexOf("#")), x = "", y = "";
                        String coordinates = s.substring(s.indexOf("#") + 1);
                        for(int i = 0; i < coordinates.length(); i++){
                            if(coordinates.charAt(i) == '#'){
                                x = coordinates.substring(0, i);
                                y = coordinates.substring(i + 1, coordinates.length() - 1);
                            }
                        }
                        String[] str;
                        for(int i = 0; i < bubbles.length; i++){
                            str = bubbles[i].split("#");
                            if(str[0].equals(owner)){
                                str[2] = x;
                                str[3] = y;
                            }
                        }
                    }
                    continue;
                }
            } catch(Exception e){
                connectionOpen = false;
                System.err.println("Could not receive bubble data from server: " + e.toString());
            }
        }
    }
    public String[] getBubbles(){
        return bubbles;
    }
    public void initiateBubbles(String s){
        bubbles = s.split("@");
        System.out.println("Bubbles initialised");
        fireNotify();
    }
    public void moveBubble(String s){
        fireNotify(s);
    }
    public void fireNotify(){
        setChanged();
        notifyObservers();
        System.out.println("Observer notified");
    }
    public void fireNotify(String s){
        setChanged();
        notifyObservers(s);
        System.out.println("Observer notified");
    }
    public void close(){
        connectionOpen = false;
        try{
            in.close();
        } catch(Exception e) {
            System.err.println("Could not close listener thread: " + e.toString());
        }
    }
}

и вуаля !! Это подводит меня к моему следующему вопросу, так или иначе наблюдатель не получает уведомления. Кто-нибудь может сказать мне, почему? Вот класс JavaFX Observer:

import java.util.Observable;
import java.util.Observer;
import java.lang.System;

public class BubbleAdapter extends Observer{
    public-read var bubbles : Bubble[];
    public-read var bubblesInitialised : Boolean = false;
    public-read var bubbleString : String[];
    public-init var connector : StreamListener
        on replace {connector.addObserver(this)};

    override function update(observable : Observable, arg : Object){
        FX.deferAction(
            function() : Void {
                System.out.println("Observer called");
                if(arg == null){
                    bubbleString = connector.getBubbles();
                    var str : String[];
                    for(i in [0..sizeof bubbleString]){
                        if(bubbleString[i].contains("#")){
                            str = bubbleString[i].split("#");
                            bubbles[i] = Bubble {
                                name : bind str[0]
                                time : bind str[1]
                                translateX : bind Float.parseFloat(str[2])
                                translateY : bind Float.parseFloat(str[3])
                            }
                            //insert bubble after Main.stage.scene.content[Main.currentIndex++];
                        }
                    }
                    bubblesInitialised = true;
                }
                else if(arg instanceof String){

                }

            }
        );
    }
}

Не обращайте внимания на мелкие мелочи, этот наблюдатель должен сначала напечатать «Обозреватель призван», чего не происходит. Итак, еще раз, пожалуйста, помогите.

1 Ответ

1 голос
/ 28 января 2010

Начните с просмотра журнала ошибок. Исключения, сообщения, выбрасываемые и перехваченные вашей программой или сторонним контейнером, вызывающим ваше приложение.

Для отладки сетевых коммуникаций просто запустите Wireshark на любом ПК в этой локальной сети, и наблюдайте за пакетами, идущими между двумя сторонами - используйте номера портов, протоколы -tcp / udp для фильтрации ваших пакетов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...