2013-05-05 2 views
0

Выполнение некоторой отладки, я думаю, что ошибка возникает в этом методе ниже. Метод в основном отправляет идентификатор (строка) на сервер, а сервер после получения этого идентификатора ищет запись, которую он отправляет клиенту. Идентификаторы отображаются в GUI JList, который пользователь выбирает так, каждый раз, когда пользователь нажимает на другой идентификатор в JList, этот метод активируется событием ListSelectionListener. Как только клиент получает запись с сервера, он отображает его в JTextField. Все работает так, как ожидалось, когда пользователь сначала нажимает ID в JList. Но когда вы нажимаете другую запись в списке, я получаю исключение:java.net.SocketException: Socket закрыт TCP-соединение

java.net.SocketException: Socket is closed

Edit: Теперь я получаю:

java.net.SocketException: Software caused connection abort: recv failed

Клиентская программа:

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.net.Socket; 
import java.net.UnknownHostException; 
import java.util.ArrayList; 

import javax.swing.DefaultListModel; 
import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextField; 
import javax.swing.event.ListSelectionEvent; 
import javax.swing.event.ListSelectionListener; 


public class ClientGUI extends JFrame implements ListSelectionListener{ 

    //gui components 
    JList jlist = null; 
    String requestID = null; //Assigned to selected ID in JList. 
    JScrollPane scpane = null; 
    JTextField field = null; 
    JPanel pane = null; 
    DefaultListModel<String> listModel = null; 
    ArrayList<String> idList = null; 

    //client stuff: 
    Socket sock1 = null; 
    Socket sock2 = null; 
    ObjectInputStream in = null; 
    ObjectOutputStream out = null; 

    public ClientGUI() throws ClassNotFoundException{ 
     //get List of IDs from Server1 
     try{ 
      sock1 = new Socket("FahadAhmed-PC", 8889); 
      in = new ObjectInputStream(sock1.getInputStream()); 
      idList = new ArrayList<String>(29); 
      ArrayList<Customer> custList = null; 
      custList = (ArrayList<Customer>) in.readObject(); 
      for(Customer c : custList){ 
       idList.add(c.getID()); 
      } 

      in.close(); 
      sock1.close(); 

      sock2 = new Socket("FahadAhmed-PC", 8888); 
      ArrayList streams = new ArrayList(3); 
      streams.add(out = new ObjectOutputStream(sock2.getOutputStream())); 
      streams.add(in = new ObjectInputStream(sock2.getInputStream())); 

     }catch(UnknownHostException e) { 
      System.err.println("Don't know about host: FahadAhmed-PC"); 
      System.exit(1); 
     }catch(IOException e){ 
      System.err.println(e); 
      System.exit(1); 
     } 

     //Setup GUI 
     jlist = new JList(idList.toArray()); 
     jlist.setVisibleRowCount(10); 
     scpane = new JScrollPane(jlist); 
     jlist.addListSelectionListener(this); 
     pane = new JPanel(new BorderLayout()); 
     pane.setPreferredSize(new Dimension(300, 300)); 
     field = new JTextField(29); 
     field.setEditable(false); 
     pane.add(scpane, BorderLayout.PAGE_START); 
     pane.add(field, BorderLayout.PAGE_END); 

     this.setContentPane(pane); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.pack(); 
     this.setVisible(true); 
    } 

    public static void main(String args[]) throws ClassNotFoundException{ 
     ClientGUI gui = new ClientGUI(); 
    } 


    @Override 
    public void valueChanged(ListSelectionEvent arg0) { 
     if(!arg0.getValueIsAdjusting()) 
      try { 
       System.out.println(jlist.getSelectedValue().toString()); 
       getRecord(jlist.getSelectedValue().toString()); 
      } catch (ClassNotFoundException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      }  
    } 

    private void getRecord(String getID) throws ClassNotFoundException { 
     try{ 

      //System.out.println(getID + "sent to getRecord method"); 
      out.writeObject(getID); 

      String rec = (String) in.readObject(); 

      field.setText(rec); 
      //in.close(); 
      //sock2.shutdownInput(); 
      out.flush(); 
      //sock2.shutdownOutput(); 
      //out.close(); 

     }catch(UnknownHostException e) { 
      System.err.println("Don't know about host: FahadAhmed-PC"); 
      System.exit(1); 
     }catch(IOException e){ 
      System.err.println(e); 
      System.exit(1); 
     } 
    } 


} 
+0

Я пробовал это, открыв новый сокет в методе выше, но я получил исключение: java.net.ConnectException: Connection отказано: connect –

ответ

1

Закрытие входа/выходной поток закрывает сокет. Вы должны использовать метод shutdownInput на гнездо, чтобы закрыть только входной поток:

//do sth with fromSocket ... and close it 
socket.shutdownInput(); 
socket.shutdownOutput(); 
+0

Должен ли я использовать его в методе? –

+0

Так что я снял in.close заявление и сделал это: \t \t \t '//in.close();' \t \t \t \t 'sock2.shutdownInput();' И проблема все еще существует. –

+0

О, я предположил, что вы будете делать то же самое для потока вывода, а также обновить ответ с этим дополнением. –

1

Закрытие либо входной поток или выходной поток закрывает сокет, и я не знаю, почему вы закрываете здесь что-нибудь, но здесь есть и другая проблема. Вы должны использовать те же самые ObjectInputStream и ObjectOutputStream для срока службы гнезда с обоих концов. В противном случае два сверстника выйдут из синхронизации, и вы начнете видеть такие вещи, как StreamCorruptedException: invalid type code.

+0

Хорошо, поэтому я сделал это так, чтобы он не закрывался внутри метода, и я уверен, что использую те же потоки на протяжении всей жизни сокета. Вывод закрывающих операторов в методе, теперь я получаю другую ошибку: java.net.SocketException: программное обеспечение вызвало прерывание соединения: recv failed –

+0

В коде, который вы опубликовали, вы создаете новые потоки Object каждый раз, когда вы вызываете 'getRecord(). ' – EJP

+0

Я обновил код. –

Смежные вопросы