2015-03-09 1 views
0

Здравствуйте, Мне нужна быстрая помощь в этой программе сокетов Server/Client, которую я пишу на Java. Все работает по назначению при вводе стандартного ввода на стороне клиента. Каждый раз сервер отвечает правильными данными. Но когда я отправляю данные на Сервер с помощью actionListener, ничего не возвращается. Данные передаются и считываются сервером и могут быть распечатаны на стороне сервера, они просто не возвращаются Клиенту.Сокеты Java: клиент и сервер. Сервер не отвечает при получении данных с помощью переключателя

Так что это должно быть проблема с форматированием или типом данных, отправляемых с помощью actionListener (к сожалению, я недостаточно знаю о потоках), или это проблема с потоком на стороне сервера?

Любая помощь очень ценится!

public class Serv { 
 
    public static void main(String[] args) throws IOException { 
 
\t \t ServerSocket serverSocket = null; 
 
     try { 
 
      serverSocket = new ServerSocket(8889); 
 
      System.out.println("Waiting for client..."); 
 
     } catch (IOException e) { 
 
      System.err.println("Could not listen on port: 8889."); 
 
      System.exit(1); 
 
     } 
 
      Socket clientSocket = serverSocket.accept(); 
 
\t \t \t BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
 
\t \t \t PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); 
 
\t \t \t String inputLine, outputLine; 
 
\t \t \t Protocol p = new Protocol(); 
 
\t \t \t out.println("welcome"); 
 
     while ((inputLine = in.readLine()) != null) { 
 
\t \t  outputLine = p.processInput(inputLine);  
 
\t \t \t System.out.println("Input: "+inputLine + "\nOutput: "+outputLine); 
 
      out.println(outputLine); 
 
\t \t \t if (outputLine.equals("Exit")) { break; } 
 
\t \t } 
 
\t \t out.close(); 
 
     in.close(); 
 
     clientSocket.close(); 
 
     serverSocket.close(); 
 
    } 
 
} 
 

 

 

 

 

 
public class Cl extends JFrame { 
 
\t 
 
\t public static PrintWriter out = null; \t 
 
\t public static String fromUser; 
 
\t \t 
 
\t public static void Client() { \t \t 
 
\t \t saveAnswer.addActionListener(new ActionListener() { 
 
\t \t \t public void actionPerformed(ActionEvent e) { 
 
\t \t \t \t \t ButtonModel b = group.getSelection(); 
 
\t \t \t \t \t if (b.getActionCommand() == "A") { sendAnswer = radioA.getText(); } 
 
\t \t \t \t \t if (b.getActionCommand() == "B") { sendAnswer = radioB.getText(); } 
 
\t \t \t \t \t if (b.getActionCommand() == "C") { sendAnswer = radioC.getText(); } 
 
\t \t \t \t \t String data = "÷" + sendAnswer; 
 
\t \t \t \t \t out.println(data); 
 
\t \t \t \t } 
 
\t \t }); 
 
\t } 
 

 
\t public static void main(String[] args) throws IOException { 
 

 
     Socket Socket = null; 
 
     BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); 
 
\t \t boolean checkOpen = false; 
 
\t \t Socket clientS = new Socket("localhost", 8889); 
 
     out = new PrintWriter(clientS.getOutputStream(), true); 
 
\t \t BufferedReader in = new BufferedReader(new InputStreamReader(clientS.getInputStream())); 
 
\t \t String fromServer; 
 
\t \t 
 
     while ((fromServer = in.readLine()) != null) { 
 
\t \t \t if (fromServer.startsWith("®")) { 
 
\t \t \t \t if (checkOpen == false) { Cl.Client(); checkOpen = true; } 
 
\t \t \t \t qA.splitter(fromServer); 
 
\t \t \t } 
 
      if (fromServer.equals("Exit")) { break; } 
 
\t \t  fromUser = stdIn.readLine(); 
 
\t \t \t if (fromUser != null) { 
 
       System.out.println("Client: " + fromUser); 
 
       out.println(fromUser); 
 
\t \t \t \t } 
 
\t \t \t \t else { System.out.println("trouble"); } 
 
     } 
 
     out.close(); 
 
     in.close(); 
 
     stdIn.close(); 
 
     Socket.close(); 
 
\t  } 
 
}

+0

Извините, что я забыл добавить, я удалил все несущественные данные, так как я на 99% уверен, что я сузил проблему до чего-то внутри этого кода. Я могу опубликовать все это, если это поможет! – Maguire

+0

Код, который не хорошо отформатирован, часто является кодом, который люди не будут читать. Подумайте о попытке опубликовать хорошо отформатированный читаемый код. Лучше всего, если вы можете создать и опубликовать [mcve] (http://stackoverflow.com/help/mcve). –

+1

Почему вы читаете программу stdin в программе Swing? – EJP

ответ

-1

Вам может понадобиться сделать out.flush() после написания ответа на стороне сервера.

+0

Нет. У него есть 'autoflush' при построении' PrintWriter.' – EJP

1

На сервере вы отправляете одну строку, а затем читаете ее с клиентом до EOS.

На клиенте вы читаете с сервера до EOS и затем отправляете все типы пользователей.

Ваш протокол не имеет смысла. Все, что у вас здесь, - это тупик.

+0

Спасибо за совет, я думаю, мне нужно сделать еще немного чтения об основах потоков. – Maguire

+0

EOS (конец потока) означает, что одноранговый узел отключен. 'readLine()' возвращает null в EOS. Не только тогда, когда временно нет данных. Если вы хотите одну строку, прочитайте одну строку. – EJP