2016-01-09 1 views
0

У меня очень простое назначение, в котором я должен отправить 2 целых числа в сокет, который отправляет их сумму обратно «клиенту».Java beginner (Client-Server): отправка нескольких целых чисел в сокет

это мой клиент:

int a,b,sum; 
    try 
    { 
     Socket Server_info = new Socket ("localhost", 15000); 
     BufferedReader FromServer = new BufferedReader (new InputStreamReader(Server_info.getInputStream())); 
     DataOutputStream ToServer = new DataOutputStream(Server_info.getOutputStream()); 
     while (true) 
     { 
      System.out.println("Type in '0' at any point to quit"); 
      System.out.println("Please input a number"); 
      a = User_in.nextInt(); 
      ToServer.writeInt(a); 
      System.out.println("Please input a second number"); 
      b = User_in.nextInt(); 
      ToServer.writeInt(b); 
      sum = FromServer.read(); 
      System.out.println("the sum of " +a+ " and " +b+ " is: " +sum); 
      if (a==0 || b==0) 
       break; 
     } 

это мой сокет обработчик:

int num1=0 ,num2=0, sum; 
    try 
    { 
     BufferedReader InFromClient = new BufferedReader (new InputStreamReader(soc_1.getInputStream())); 
     DataOutputStream OutToClient = new DataOutputStream(soc_1.getOutputStream()); 
     while (true) 
     { 
      num1 = InFromClient.read(); 
      num2 = InFromClient.read(); 
      sum = num1 + num2 ; 
      OutToClient.writeInt(sum); 
     } 
    } 
    catch (Exception E){} 

После первого ввода Integer при запуске клиента я получаю это:

Тип в '0' в любой момент для прекращения

Pl легкость ввода номера

сброса Подключение пэром: гнездо Ошибка записи

я думаю, что проблема лежит в гнезде приемной стороне, я должен делать что-то не так. какие-либо предложения?

+1

Может быть, это я, но я считаю, что трудно догадаться, что может быть не так, кроме я не вижу никакой необходимости нарезания резьбы происходит, и у вас есть один ужасающая строка кода здесь: 'catch (Exception E) {}', чего вы никогда не должны делать. –

+0

Кроме того, не следует ли использовать DataInputStream с входным потоком вашего сервера? Вы отправляете числовые данные, а не текст, и поэтому вы не должны использовать для этого читателей. –

+0

Эй! да, 'catch (Exception E) {}' довольно ужасен. я фактически бросил его там неполным для «более позднего» использования, чтобы сосредоточиться на моей проблеме, уже переключил его на «IOException». и да, «DataInputStream» в конечном итоге решил это для меня. благодаря! –

ответ

0

Проблема в том, что вы смешиваете потоки и читатели. Для того, чтобы успешно пройти целые числа от клиента к серверу, например, с данными [Input/Output] STREAM следует использовать:

// Server side 
    final DataInputStream InFromClient = new DataInputStream(soc_1.getInputStream()); 
    final DataOutputStream OutToClient = new DataOutputStream(soc_1.getOutputStream()); 
    // than use OutToClient.writeInt() and InFromClient.readInt() 

    // Client side 
    final DataInputStream FromServer = new DataInputStream(Server_info.getInputStream()); 
    final DataOutputStream ToServer = new DataOutputStream(Server_info.getOutputStream()); 
    // than use ToServer.writeInt() and FromServer.readInt() 

Если вы, скажем, отправить Int от клиента к серверу (в данном случае с помощью DataOutputStream .writeInt), очень важно прочитать данные с соответствующей логикой декодирования (в нашем случае DataInputStream.readInt).

+0

Это решило это. Большое спасибо! я заменил «BufferedReader» на «DataInputStream» так же, как вы сказали, а также я забыл «Int» в «readInt()». работает красиво. –

+0

Добро пожаловать. –

3

Вы можете использовать объекты DataInputStream и DataOupStream, но я нахожу более простым для пользователя пару объектов Scanner и PrintWriter как на стороне сервера, так и на стороне клиента. Так вот моя реализация решения задачи:

Сервер Side

import java.io.*; 
import java.net.*; 
import java.util.*; 

public class TCPEchoServer { 

    private static ServerSocket serverSocket; 
    private static final int PORT = 1234; 

    public static void main(String[] args) 
    { 
     System.out.println("Opening port...\n"); 
     try { 
      serverSocket = new ServerSocket(PORT); 
     } 
     catch (IOException ioex){ 
      System.out.println("Unable to attach to port!"); 
      System.exit(1); 
     } 
      handleClient(); 

    } 

    private static void handleClient() 
    { 
     Socket link = null; //Step 2 
     try { 
      link = serverSocket.accept(); //Step 2 
      //Step 3 
      Scanner input = new Scanner(link.getInputStream()); 
      PrintWriter output = new PrintWriter(link.getOutputStream(), true); 
      int firstInt = input.nextInt(); 
      int secondInt = input.nextInt(); 
      int answer; 

      while (firstInt != 0 || secondInt != 0) 
      { 
       answer = firstInt + secondInt; 
       output.println(answer); //Server returns the sum here 4 
       firstInt = input.nextInt(); 
       secondInt = input.nextInt(); 
      } 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     finally { 
      try { 
       System.out.println("Closing connection..."); 
       link.close(); 
      } 
      catch (IOException ie) 
      { 
       System.out.println("Unable to close connection"); 
       System.exit(1); 
      } 
     } 
    } 
} 

Клиентская сторона

import java.net.*; 
import java.io.*; 
import java.util.NoSuchElementException; 
import java.util.Scanner; 


public class TCPEchoClient { 

    private static InetAddress host; 
    private static final int PORT = 1234; 

    public static void main(String[] args) { 
     try { 
      host = InetAddress.getLocalHost(); 
     } catch (UnknownHostException uhEx) { 
      System.out.println("Host ID not found!"); 
      System.exit(1); 
     } 
     accessServer(); 
    } 

    private static void accessServer() { 
     Socket link = null; //Step 1 
     try { 
      link = new Socket(host, PORT); //Step 1 
      //Step 2 
      Scanner input = new Scanner(link.getInputStream()); 
      PrintWriter output = new PrintWriter(link.getOutputStream(), true); 

      //Set up stream for keyboard entry 
      Scanner userEntry = new Scanner(System.in); 

      int firstInt, secondInt, answer; 
      do { 
       System.out.print("Please input the first number: "); 
       firstInt = userEntry.nextInt(); 
       System.out.print("Please input the second number: "); 
       secondInt = userEntry.nextInt(); 

       //send the numbers 
       output.println(firstInt); 
       output.println(secondInt); 
       answer = input.nextInt(); //getting the answer from the server 
       System.out.println("\nSERVER> " + answer); 
      } while (firstInt != 0 || secondInt != 0); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     catch (NoSuchElementException ne){ //This exception may be raised when the server closes connection 
      System.out.println("Connection closed"); 
     } 
     finally { 
      try { 
       System.out.println("\n* Closing connection… *"); 
       link.close(); //Step 4. 
      } catch (IOException ioEx) { 
       System.out.println("Unable to disconnect!"); 
       System.exit(1); 
      } 
     } 
    } 
} 
+0

Большое вам спасибо! Я многое узнал из этого. я сохранил это для последующего использования. 'DataInputStream' вместо' BufferedReader' и добавление «Int» в 'ReadInt()' сделал трюк в конце концов. –

+0

@MichaelRoskin. Добро пожаловать. Рад помочь. – avidProgrammer

0

Я думаю, было бы проще, если использовать строки для отправки и разбора на стороне сервера на Integer.

Как:

ToServer.write(""+a); 

и

int a = Integer.parseInt(InFromClient.readLine()); 

также важно, чтобы очистить Writer после отправки что-то:

ToServer.write(""+a); 
ToServer.flush(); 

и закрыть его в конце:

... 
ToServer.close(); 

Я надеюсь, что смогу вам помочь!;)

у.е. Lukas

+0

Спасибо, я был фактически проинструктирован в классе точно, чтобы сделать именно это. В предыдущем задании я использовал Integer.parseInt. Я просто хотел узнать, как это делается с помощью целых чисел «чисто». Еще раз спасибо. –