Все добрый день. Столкнулся с необходимость построение приложения клиент севрера на Яве. В сети, вообщем, полно примеров. Использую такое:
Сервер:
Код | package com.server.main; import java.net.*; import java.util.ArrayList; import java.util.HashMap; import java.io.*;
import com.my.function.MyFunc; import com.my.function.ReadXMLFile; import com.my.vars.VARIABLE;
public class main { public static void main(String[] args) throws IOException { System.out.println("Welcome to Server side"); BufferedReader in = null; PrintWriter out= null;
ServerSocket servers = null; Socket fromclient = null;
// create server socket try { servers = new ServerSocket(1900); } catch (IOException e) { System.out.println("Couldn't listen to port 1900"); System.exit(-1); }
try { System.out.print("Waiting for a client..."); fromclient= servers.accept(); System.out.println("Client connected"); } catch (IOException e) { System.out.println("Can't accept"); System.exit(-1); }
in = new BufferedReader(new InputStreamReader(fromclient.getInputStream())); out = new PrintWriter(fromclient.getOutputStream(),true); String input,output;
System.out.println("Wait for messages"); while ((input = in.readLine()) != null) { if (input.equalsIgnoreCase("exit")) break; out.println("S ::: "+input); System.out.println(input); } out.close(); in.close(); fromclient.close(); servers.close(); }
}
|
Клиент:
Код | package com.socket.client;
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetAddress; import java.net.Socket;
public class SocketClient { public static void main() throws Exception { // Определяем номер порта, на котором нас ожидает сервер для ответа int portNumber = 1900;
String str = "Тестовая строка для передачи";
System.out.println("Client is started");
Socket socket1 = new Socket("127.0.0.1", portNumber); BufferedReader br = new BufferedReader(new InputStreamReader(socket1.getInputStream()));
PrintWriter pw = new PrintWriter(socket1.getOutputStream(), true);
pw.println(str);
while ((str = br.readLine()) != null) {
System.out.println(str); } br.close(); pw.close(); socket1.close(); } }
|
Далее в графической форме, при нажатии на кнопку вызываю
SocketClient SocketClients = new SocketClient (); try { SocketClients.main(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }
Все проходит нормально, сервер получил сообщение и вернул его клиенту, но кнопка "залипла" нажатой.
я так понимаю виснет на процессе чтения while ((str = br.readLine()) != null) {
System.out.println(str); }
Пока идея реализации: запуск в отдельном потоке, но тогда возникает вопрос как оно будет работать на старых одно-ядерных компах?....
Подскажите, как правильно реализовать подобное? Заранее всемс пасибо! |