Я делаю финальный проект для своего класса 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 за указание на мою ошибку в коде сервера.Я обновил код, чтобы отразить это, и я также изменил код, чтобы исправить ошибку, которая открывала два окна одновременно.Я до сих пор не вижу, где код идет не так.Любая другая помощь будет принята с благодарностью.Еще раз спасибо.