ClientGUI блокируется после передачи одного объекта - PullRequest
0 голосов
/ 09 декабря 2011

Я строю клиентский сервер через Socket s .. Я отправляю объекты по сети от клиента к серверу. Проблема в том, что после отправки одного объекта, когда я пытаюсь отправить другой, клиентский графический интерфейс блокируется .. Я думаю, что это может иметь отношение к тому, что я не занимаюсь уборкой моего outputStream в классе ClientTransmit ?? Может кто-нибудь посмотреть, пожалуйста? Спасибо

    ************** clientGUI ***************

import java.awt.*;
import java.awt.event.*;
import java.util.Vector;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class ClientGUI extends JFrame implements ActionListener {
    public static final int defaultWidth = 80, defaultHeight = 40;

       private String streamChoice;

       private FootballStream footyStrm;
       private MusicStream musicStrm;
       private String [] listChoices = {"Football", "Music"};
       private JList streamSelect;
       private List list;

       private Button  clearButton;
       private Button  sendButton;

       private JTextArea messageInput;
       private JScrollPane messageScroll;

       private JTextArea streamDisplay;
       private JScrollPane streamPane;

       private JLabel middleLabel;
       private JLabel bottomLabel;

       public ClientGUI() {
            super("ClientGUI");
            JPanel topPanel = new JPanel();
            JPanel middlePanel = new JPanel();
            JPanel bottomPanel = new JPanel();

            list = new List();
            list.add("damian");
            list.add("conor");
            list.addActionListener(this);          

            streamSelect = new JList(listChoices);
            streamSelect.addListSelectionListener(
                    new ListSelectionListener(){
                        public void valueChanged(ListSelectionEvent e) {                            
                            if (! e.getValueIsAdjusting()){
                          //      System.out.println("here");
                                streamChoice = getStreamChoice();
                                }
                            }       
        });

            messageInput = new JTextArea(7, 20);
            messageInput.setLineWrap(true);         
            messageScroll = new JScrollPane(messageInput, 
                    ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
                    ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

            streamDisplay = new JTextArea(7, 20);
            streamDisplay.setLineWrap(true);            
            streamPane = new JScrollPane(streamDisplay, 
                    ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
                    ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

            clearButton = new Button("Clear");
            clearButton.setBackground(Color.white);
            clearButton.addActionListener(this);

            sendButton = new Button("Send");
            sendButton.addActionListener(this);

            middleLabel = new JLabel("Enter text: ");
            bottomLabel = new JLabel("Entered messages: ");

            topPanel.add(streamSelect);
            topPanel.add(list);
            topPanel.add(sendButton);           
            topPanel.add(clearButton);
            middlePanel.add(messageScroll);
            middlePanel.add(middleLabel, 0);            
            bottomPanel.add(streamPane);
            bottomPanel.add(bottomLabel, 0);

            this.add(topPanel, BorderLayout.NORTH);
            this.add(middlePanel, BorderLayout.CENTER);
            this.add(bottomPanel, BorderLayout.SOUTH);

            this.setSize(400, 400);
            this.setVisible(true);

            this.setDefaultCloseOperation(EXIT_ON_CLOSE);
       }


 public static void main(String[] args) {
    new ClientGUI();
}


@Override
 public void actionPerformed(ActionEvent e) {

    ClientTransmit ct = new ClientTransmit();
    String message = messageInput.getText();

    if(e.getSource()== sendButton){

        if(streamChoice.equals("football")){
            footyStrm = new FootballStream();
            footyStrm.footyVector.add(message);
    //      System.out.println("footy vector element 1 = " + 
    //              footyStrm.messageStream.firstElement());
    //      listElements(footyStrm);
            ct.messageTransmit(footyStrm);
        }

        else if(streamChoice.equals("music")){
            musicStrm = new MusicStream();
            musicStrm.musicVector.add(message);
    //      System.out.println("music vector element 1 = " + 
    //              musicStrm.musicVector.firstElement());  
            ct.messageTransmit(musicStrm);
        }
    }   
 }

 public String getStreamChoice(){

     String choice = null;

    if(streamSelect.getSelectedValue().equals("Football")){
        choice = "football";
        System.out.println("Football");
        return choice;
    }
    else{
        System.out.println("Music");
        choice = "music";
        return choice;
    }   
 }

************** ClientTransmit **************

import java.net.*;
import java.io.*;
import java.util.*;

public class ClientTransmit{

    private String localHost = "127.0.0.1" ;
    private Socket socket = null;
    private ObjectOutputStream os = null;
    private ObjectInputStream is = null;

    public ClientTransmit(){}


    public ClientTransmit(String serverIP) 
    {
    if (!connectToServer(serverIP)) 
        {
       System.out.println("Cannot open socket connection...");            
    }
    }

    private boolean connectToServer(String serverIP) 
    {
    try  // open a new socket to port: 5050 and create streams
        {
       this.socket = new Socket(serverIP,5050);
       this.os = new ObjectOutputStream(this.socket.getOutputStream());
       this.is = new ObjectInputStream(this.socket.getInputStream());
       System.out.print("Connected to Server\n");
       return true;
    } 
        catch (Exception ex) 
        {
      System.out.print("Failed to Connect to Server\n" + ex.toString());    
      System.out.println(ex.toString());
      ex.printStackTrace();
      return false;
    }
 }

    private void getServerReply() 
    {
       System.out.println("In get server reply");
       String theReply; 
       theReply = (String) receive();
       if (theReply != null)
       {
      System.out.println(theReply);
       }
    }

    public void messageTransmit(Object o){

        Object obj = o;

        if(connectToServer(localHost)){

        if(obj instanceof FootballStream){
            FootballStream fs = (FootballStream) obj;
             try{            
                    System.out.println("About to transmit FootballStream object");
                    os.writeObject(fs);
                    os.flush();
                    this.getServerReply();
                 }

                 catch (Exception ex){ 
                   ex.printStackTrace();
                 }
        }           
        else if(obj instanceof MusicStream){
            MusicStream ms = (MusicStream) obj;         
             try{            
                    System.out.println("About to transmit MusicStream object");
                    os.writeObject(ms);
                    os.flush();
                    this.getServerReply();
                 }

                 catch (Exception ex){ 
                   ex.printStackTrace();
                 }
            }
         }

    }

    public void sendMessage(Vector<String> m) {
        String localhost = "127.0.0.1";
        String serverIP = localhost ;
        Vector<String> message = m;   

        if(connectToServer(serverIP)){
    try 
        {
        System.out.println("About to transmit shape");
        os.writeObject(message);
        os.flush();
        this.getServerReply();}

        catch (Exception ex) 
        {
       ex.printStackTrace();}
        }
    }


    private Object receive() 
    {
    Object o = null;
    try 
        {
       o = is.readObject();
    } 
        catch (Exception ex) 
        {
       System.out.println(ex.toString());
    }
    return o;
    }

}

1 Ответ

0 голосов
/ 09 декабря 2011

Похоже, вы открываете новое соединение каждый раз в messageTransmit (через вызов connectToServer), но вы никогда не закрываете это соединение. Я не уверен, приведет ли это к блокированию, которое вы испытываете, но это то, что вы должны исправить.

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

Что касается блокировки, это также может произойти, если буфер отправки для вашего TCP-соединения заполнен. Вызов os.writeObject и / или os.flush может блокироваться, если буфер отправки ОС заполнен. Чтобы отменить это, вы должны использовать инфраструктуру NIO, такую ​​как Netty (или, по крайней мере, очередь и отдельный поток) для отправки вашего сообщения. Возможно, вы захотите проверить на своем сервере, какие данные он получает, чтобы увидеть, вызывает ли это вашу блокировку.

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