Эта простая программа сервер-клиент не будет отправлять / получать данные, кроме первоначального подтверждения.Зачем? - PullRequest
0 голосов
/ 01 июня 2018

Я делаю финальный проект для своего класса Comp Sci (Java), и идея в том, что это простая чат-комната сервер-клиент.Конечно, мой учитель, который действительно очень хорошо разбирается в аспектах учебной программы AP, практически ничего не знает ни о каких компонентах, необходимых для создания такой программы, поэтому я более или менее сам по себе.Я использовал различные сообщения StackOverflow и другие примеры программ для сокетов, чтобы перепроектировать сокеты и выяснить, как их использовать, но, очевидно, GUI не может обновляться с помощью бесконечного цикла, необходимого для проверки полученных сообщений, поэтому я вернулся кGoogle, чтобы найти лучший способ следить за сообщениями.Я придумала попытку использовать слушатель свойства Change, который, по-видимому, является тем, что вы используете при многопоточности, еще одна вещь, чтобы добавить в список вещей, о которых ни мой учитель, ни я ничего не знали.Я нашел довольно простой и понятный (или я так думал) пример, основанный на моем собственном коде, и запустил его.К сожалению, кроме первоначального подтверждения того, что сервер и клиент установили контакт, по-видимому, между двумя программами данные не передаются.Вот код клиента:

import javax.swing.JFrame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JTextField;
import javax.swing.SwingUtilities;

import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JButton;
import java.awt.Color;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;

class ClientRunnable extends newClient implements Runnable {
    public Socket sock = new Socket("127.0.0.1", 2702);
    public BufferedReader receiveRead = new BufferedReader(new InputStreamReader(istream));
    public String receptive = new String();
    public String sendToMessage = new String();
    public ClientRunnable() throws IOException, InterruptedException {
    }
    @SuppressWarnings("deprecation")
    protected void initUI(ClientRunnable runnable) throws IOException, InterruptedException {
        String wrongSizeMSG = "Your username is not the right size.  It must be at least 4 characters and \nno larger than 20 characters.";
        frame = new JFrame();
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);
        frame.show();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JLabel lblUsername = new JLabel("Please insert your username:");
        lblUsername.setBounds(131, 100, 172, 14);
        frame.getContentPane().add(lblUsername);
        lblUsername.show();
        UNInput = new JTextField();
        UNInput.setBounds(139, 125, 146, 20);
        frame.getContentPane().add(UNInput);
        UNInput.setColumns(10);
        UNInput.show();
        JButton btnGo = new JButton("GO!");
        btnGo.setBounds(170, 156, 89, 23);
        frame.getContentPane().add(btnGo);
        btnGo.show();

        JScrollPane scroll = new JScrollPane(msgDisplay);
        scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS );
        frame.getContentPane().add(scroll);
        JLabel lblWrongSize = new JLabel(wrongSizeMSG);
        lblWrongSize.setForeground(Color.RED);
        lblWrongSize.setBounds(10, 172, 414, 50);
        lblWrongSize.hide();
        frame.getContentPane().add(lblWrongSize);
        msgDisplay = new JTextArea();
        msgDisplay.setBounds(10, 11, 414, 168);
        frame.getContentPane().add(msgDisplay);
        msgDisplay.setColumns(10);
        msgDisplay.hide();
        msgDisplay.setEditable(false);
        msgDisplay.setText("");
        JLabel lblPrompt = new JLabel("Type:");
        lblPrompt.setBounds(10, 190, 46, 14);
        frame.getContentPane().add(lblPrompt);
        lblPrompt.hide();
        txtEditor = new JTextField();
        txtEditor.setBounds(10, 215, 414, 35);
        frame.getContentPane().add(txtEditor);
        txtEditor.setColumns(10);
        txtEditor.hide();
        BufferedReader keyRead = new BufferedReader(new InputStreamReader(System.in));
        OutputStream ostream = sock.getOutputStream();
        PrintWriter pwrite = new PrintWriter(ostream, true);
        msgDisplay.setText("Start the chat, type and press Enter key.\n");
        pwrite.println("Success");
        btnGo.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                username = UNInput.getText();
                System.out.println(username);
                UNInput.setText("");
                if(!(username.toCharArray().length < 4 || username.toCharArray().length > 20)){
                    btnGo.hide();
                    lblUsername.hide();
                    UNInput.hide();
                    lblWrongSize.hide();
                    msgDisplay.show();
                    lblPrompt.show();
                    txtEditor.show();
                } // if
                else {
                    lblWrongSize.show();    
                }
            }   
        });
        txtEditor.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                sendMessage = username + "> " + txtEditor.getText() + "\n";
                txtEditor.setText("");
                pwrite.print(sendMessage);
                msgDisplay.setText(msgDisplay.getText() + sendMessage);
                pwrite.flush();
            }
        });
    }

    private PropertyChangeSupport PCS = new PropertyChangeSupport(this);

    public void addPropertyChangeListener(PropertyChangeListener listener) {
        PCS.addPropertyChangeListener(listener);
    }

    @Override
    public void run() {
        try {
            Thread.sleep(500);
        } catch (InterruptedException e){
            e.printStackTrace();    
        } // try-catch
        try {
            setReceiveRead();
        } catch (IOException e) {
            e.printStackTrace();
        } // try-catch
    } // run

    public void setReceiveRead() throws IOException {
        receptive = receiveRead.readLine();
        PCS.firePropertyChange("In", receptive == null, receptive != null);
    }

    public void propertyChange(PropertyChangeEvent e) {
        newClient.msgDisplay.setText(newClient.msgDisplay.getText() + receptive + "\n");
    }
} // Runnable

public class newClient{

    protected JFrame frame;
    protected JTextField UNInput;
    public static JTextArea msgDisplay;
    protected JTextField txtEditor;
    public Socket sock;
    public InputStream istream;

    public newClient() throws UnknownHostException, IOException {
        sock = new Socket("127.0.0.1", 2702);
        istream = sock.getInputStream();
    }
    public BufferedReader receiveRead = new BufferedReader(InputStreamReader(istream));
    public String receptive = new String();

    public JTextArea getMsgDisplay() {
        return msgDisplay;
    }

    public static void main(String[] args) throws IOException,     
        InterruptedException {
            final ClientRunnable runnable = new ClientRunnable();
            SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    runnable.initUI(runnable);
                    System.out.println("check there");
                } catch (IOException | InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        new Thread(runnable).start();
        System.out.println("Check here");
    }
    public static String username = new String();
    public static String receiveMessage, sendMessage = null;  
}

Вот код сервера:

package serverPKGE;
import java.io.*;
import java.net.*;
public class Server {
    public static void main(String[] args) throws Exception {
      ServerSocket sersock = new ServerSocket(2702);
      System.out.println("Server  ready for chatting");

      Socket sock = sersock.accept( );                          
      BufferedReader keyRead = new BufferedReader(new         
      InputStreamReader(System.in));
      OutputStream ostream = sock.getOutputStream(); 
      PrintWriter pwrite = new PrintWriter(ostream, true);

      InputStream istream = sock.getInputStream();
      BufferedReader receiveRead = new BufferedReader(new             
      InputStreamReader(istream));

      String receiveMessage, sendMessage;               
      while(true) {
        if((receiveMessage = receiveRead.readLine()) != null)  {
           System.out.println(receiveMessage);         
        } // if        
        sendMessage = "Server> "
                + "" + receiveMessage; 
        pwrite.println(sendMessage);             
        pwrite.flush();
      } // while              
    } // main                    
} // server          

Я работал только над одним графическим интерфейсом за раз, поэтому код сервера гораздо более ориентированна передачу данных.Можете ли вы увидеть какую-либо очевидную причину, по которой данные не будут получены или отправлены клиентом?В предыдущей версии клиента существовала неправильная форма разговора, в которой по какой-то причине обеим сторонам соединения приходилось вводить что-либо, прежде чем они будут получены и записаны, поэтому я предполагаю, что проблема заключается (по крайней мере,в основном) в коде клиента.Спасибо за вашу помощь.

Обновление Спасибо Scary Wombat за указание на мою ошибку в коде сервера.Я обновил код, чтобы отразить это, и я также изменил код, чтобы исправить ошибку, которая открывала два окна одновременно.Я до сих пор не вижу, где код идет не так.Любая другая помощь будет принята с благодарностью.Еще раз спасибо.

1 Ответ

0 голосов
/ 01 июня 2018

Вы снова блокируете, ожидая ввода

Один раз

receiveMessage = receiveRead.readLine()

Дважды

sendMessage = "Server> "
        + "" + keyRead.readLine(); 

Изменить на

sendMessage = "Server> "
        + "" + receiveMessage; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...