Тривиальным решением может быть то, что ваша переменная teXt будет нулевой или пустой в момент отправки ее в сокет. Пожалуйста, вставьте System.out.println (teXt) прямо перед вашим вызовом os.println (teXt), чтобы дважды проверить, действительно ли вы что-то отправляете клиенту.
Редактировать
Итак, хитрая клиент-серверная часть работает как надо. Я думаю, что у helios есть правильный ответ в его комментариях: когда вы запускаете клиента с чем-то вроде
java -cp <your classpath> your.pckg.here.MainClient
он немедленно вызовет getText (), который возвращает ноль, потому что так инициализируется текстовое поле. Таким образом, вы присваиваете это нулевое значение teXt, и это то, что вы отправляете.
Этот код не реагирует ни на что, что вы делаете или изменяете в рамке чата.
Таким образом, решение состоит в том, чтобы перепроектировать поток в приложении так, чтобы клиент действительно отправлял что-то, если и только если нажата кнопка на фрейме чата.
Редактировать
Это очень простой, но рабочий пример системы клиент / сервер с графическим интерфейсом. Код очень плохой (плохая обработка исключений, клиент и сервер не будут завершены и должны быть «убиты», уродливый графический интерфейс), но он демонстрирует основы.
Сервер:
public class Server {
public static void main(String[] args) throws Exception {
ServerSocket socket = new ServerSocket(12345);
while(true) {
Socket client = socket.accept();
InputStream in = client.getInputStream();
int i = in.read();
while (i != -1) {
System.out.print((char) i);
i = in.read();
}
System.out.println();
in.close();
}
}
}
Сервер прослушивает порт 12345 и просто выводит все входящие байты в виде символов на консоль. Это будет происходить вечно (реальный сервер может быть остановлен ...)
GUI:
public class GUI extends JFrame {
public GUI() {
setSize(100, 100);
Container contentPane = getContentPane();
Button button = new Button("Press me");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Client.send("Button pressed");
}
});
contentPane.add(button);
}
}
Ничего, кроме рамки без названия, показывающей одну кнопку. Если вы нажмете эту кнопку, она отправит текстовое сообщение классу Client (iaw - вызовите метод Client.send со статическим текстом)
Клиент:
public class Client {
public static void main(String[] args) throws Exception {
GUI gui = new GUI();
gui.setVisible(true);
}
public static void send(String msg) {
try {
Socket socket = new Socket("localhost", 12345);
OutputStream out = socket.getOutputStream();
out.write("Hello world".getBytes());
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Клиент создает и запускает великолепный графический интерфейс. И это содержит сервис отправки. По запросу (вызов метода send) он установит соединение с сервером и отправит строку в виде байтов.
Итак, смысл в том, чтобы отправить что-то, вы должны сказать клиенту сделать это. И то же самое с вашим кодом: просто установка поля в классе клиента не вызовет процедуру отправки. Реализуйте метод send и вызывайте его всякий раз, когда вам есть что отправить.
(я не включал названия пакетов и импорт в примеры, но я использовал только стандартные классы java (swing).)