Сначала краткий ответ: оба ваших кода Java работают почти нормально.
В любом случае, вы всегда должны проверять свое приложение на соответствие другой программе, о которой известно, что она в порядке. Протестировав одну написанную саму программу против другой, написанной самостоятельно, трудно сказать, какая из них не работает. Похоже, вы тестируете его с некоторыми GUI (Android?). Преобразование соответствующей части в простое консольное приложение, которое вы запускаете на обычном P C, значительно упрощает поиск неисправностей.
Итак, позвольте мне показать, как я проверял ваш код на моем Linux ноутбуке:
Сначала скопируйте ваш "клиентский" код в шаблон "Hello-World". Я добавил несколько сообщений отладки и al oop, который позволяет клиенту получать более одной строки текста:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
class Main
{
static class myServerThread implements Runnable
{
Socket socket;
ServerSocket serverSocket;
InputStreamReader inputStreamReader;
BufferedReader bufferedReader;
String message;
@Override
public void run()
{
try
{
serverSocket = new ServerSocket(5000);
while (true)
{
System.out.println("Accepting...");
socket = serverSocket.accept();
System.out.println("Connected...");
inputStreamReader = new InputStreamReader(socket.getInputStream());
bufferedReader = new BufferedReader(inputStreamReader);
String message = bufferedReader.readLine();
while (message!=null)
{
System.out.println("Received:" + message);
message = bufferedReader.readLine();
}
System.out.println("Closing...");
socket.close();
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
public static void main(String[] args)
{
Thread thread = new Thread(new myServerThread());
thread.start();
}
}
Я запустил «client» и открыл другое командное окно, чтобы открыть сетевое соединение с Netcat и отправьте две строки текста:
nc localhost 5000
Hallo
Test
Связанный вывод программы "client" был:
Accepting...
Connected...
Received:Hallo
Received:Test
Closing...
Accepting...
Таким образом, часть "client", очевидно, работает нормально.
Затем я скопировал ваш «серверный» код в шаблон «Hello World»:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
class Main
{
static class myServerThread implements Runnable
{
Socket socket;
ServerSocket serverSocket;
InputStreamReader inputStreamReader;
BufferedReader bufferedReader;
String message;
@Override
public void run()
{
String EMAIL = "Email";
try
{
serverSocket = new ServerSocket(6000);
while (true)
{
System.out.println("Accepting...");
socket = serverSocket.accept();
System.out.println("Connected...");
inputStreamReader = new InputStreamReader(socket.getInputStream());
bufferedReader = new BufferedReader(inputStreamReader);
String message = bufferedReader.readLine();
while (message != null)
{
System.out.println("Received:" + message);
if (message.equals(EMAIL))
{
System.out.println("Sending...");
try
{
socket = new Socket("localHost", 5000);
PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
printWriter.write(message);
printWriter.flush();
printWriter.close();
System.out.println("sending done");
}
catch (IOException e)
{
e.printStackTrace();
}
}
message = bufferedReader.readLine();
}
System.out.println("Closing...");
socket.close();
}
}
catch (IOException ex)
{
ex.printStackTrace();
}
}
}
public static void main(String[] args)
{
Thread thread = new Thread(new myServerThread());
thread.start();
}
}
Снова я добавил несколько сообщений отладки и все oop, чтобы сервер мог получать несколько строк текста , Поскольку эта Java программа обрабатывает два соединения, мне пришлось открыть две команды windows.
В первом командном окне я говорю NetCat принять (прослушать) соединение через порт 5000. Именно здесь ваш «сервер» отправит сообщение «Email» на:
nc -lp 5000
In во втором командном окне я говорю Netcat подключиться к вашему «серверу» через порт 6000, затем отправляю две строки текста и затем нажимаю Ctrl- C, чтобы остановить его:
nc localhost 6000
Test
Email
^C
Соответствующий вывод "серверной" программы:
Accepting...
Connected...
Received:Test
Received:Email
Sending...
sending done
Closing...
Accepting...
И мой прослушивающий Netcat в другой (первой) команде windows выдал такой вывод:
stefan@stefanpc:/hdd/stefan$ nc -lp 5000
Emailstefan@stefanpc:/hdd/stefan$
Так что на моем все выглядит нормально машина. Кроме одной маленькой детали: после «электронной почты», которую ваш «сервер» отправляет клиенту, нет разрыва строки (в данном случае NetCat). Итак, исправить это просто:
printWriter.write(message+"\n");
Этот окончательный разрыв строки необходим, потому что ваш клиент использует ввод от readLine()
.
NetCat - очень полезный инструмент для тестирования простого текстового сокета TCP коммуникации. Он включен во все Linux дистрибутивов. Если у вас возникли трудности с поиском Windows исполняемого файла, тогда возьмите его с моей домашней страницы: http://stefanfrings.de/avr_tools/netcat-win32-1.12.zip
Пожалуйста, прокомментируйте, было ли это полезно для вас.