2016-09-15 4 views
0

Мой клиентский класс должен принимать 10 целых данных от пользователя и отправлять их на сервер. Сервер должен принять эти 10 номеров и отсортировать их. Затем он должен отправить массив обратно клиенту, и клиент должен распечатать их. Мой клиент код:Чтение и запись массива программирования сокетов int, java

public class TCPClient { 
public static void main(String[] args) throws UnknownHostException, IOException { 
    int arr[]=new int[10]; 
    int arrFromServer[]=new int[10]; 
    BufferedReader inFromUser= new BufferedReader(new InputStreamReader(System.in)); 
    Socket clientSocket = new Socket("localhost",6786); 
    DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); 
    BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
    for(int i=0;i<10;i++) 
     arr[i]=Integer.parseInt(inFromUser.readLine()); 

    for(int i=0;i<10;i++) 
     outToServer.writeInt(arr[i]); 

    for(int i=0;i<10;i++) 
     arrFromServer[i]=Integer.parseInt(inFromServer.readLine()); 

    for (int i = 0; i < arrFromServer.length; i++) { 
     System.out.println("From Server::"+arrFromServer[i]); 
    } 
    clientSocket.close(); 
} 
} 

Мой код сервера:

public class TCPServer { 
public static void main(String[] args) throws IOException { 
    int arrFromClient[]=new int[10]; 
    ServerSocket welcomeSocket = new ServerSocket(6786); 
    while(true){ 
     Socket connectionSocket = welcomeSocket.accept(); 
     BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); 
     DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); 
     for(int i=0;i<10;i++) 
     { 
      arrFromClient[i]=Integer.parseInt(inFromClient.readLine()); 
     } 
     Arrays.sort(arrFromClient); 
     for (int i = 0; i < arrFromClient.length; i++) { 
      outToClient.writeInt(arrFromClient[i]); 
     } 
    } 
} 
} 

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

Что не так с вышеуказанным кодом. Любая помощь будет оценена по достоинству. Заранее спасибо.

+0

Подсказка: write'Int' против read'Line'. – Kayaman

+0

Я получаю это :(Какой из них я должен использовать? Я использую readLine для чтения ввода от пользователя и writeInt, чтобы записать его на сервер. Это неправильно? – Pepper

+0

'writeInt' не пишет строку. Оба метода объясняются в javadocs я рекомендую их читать. – Kayaman

ответ

1

Вы просто не можете смешивать Integer.parseInt(inFromClient.readLine()) с writeInt(), вам нужно использовать DataOutputStream для написания целых чисел и DataInputStream читать их, чтобы убедиться, что ваши числа будут правильно сериализации и десериализации, используя тот же протокол/алгоритм.

Сервер:

int arrFromClient[]=new int[10]; 
ServerSocket welcomeSocket = new ServerSocket(6786); 
while(true){ 
    Socket connectionSocket = welcomeSocket.accept(); 
    DataInputStream inFromClient = new DataInputStream(connectionSocket.getInputStream()); 
    DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); 
    for(int i=0;i<10;i++) { 
     arrFromClient[i] = inFromClient.readInt(); 
    } 
    Arrays.sort(arrFromClient); 
    for (int i = 0; i < arrFromClient.length; i++) { 
     outToClient.writeInt(arrFromClient[i]); 
    } 
} 

Клиент:

int arr[]=new int[10]; 
int arrFromServer[]=new int[10]; 
Scanner inFromUser= new Scanner(System.in); 
try (Socket clientSocket = new Socket("localhost",6786)) { 
    DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); 
    DataInputStream inFromServer = new DataInputStream(clientSocket.getInputStream()); 
    for(int i=0;i<10;i++) 
     arr[i]=inFromUser.nextInt(); 

    for(int i=0;i<10;i++) 
     outToServer.writeInt(arr[i]); 

    for(int i=0;i<10;i++) 
     arrFromServer[i]=inFromServer.readInt(); 

    for (int i = 0; i < arrFromServer.length; i++) { 
     System.out.println("From Server::"+arrFromServer[i]); 
    } 
} 

В качестве альтернативы вы можете использовать ObjectOutputStream и ObjectInputStream писать и читать массив как объект, используя методы writeObject и readObject следующим образом:

Сервер:

ServerSocket welcomeSocket = new ServerSocket(6786); 
while(true){ 
    Socket connectionSocket = welcomeSocket.accept(); 
    ObjectInputStream inFromClient = new ObjectInputStream(connectionSocket.getInputStream()); 
    ObjectOutputStream outToClient = new ObjectOutputStream(connectionSocket.getOutputStream()); 
    int[] arrFromClient = (int[]) inFromClient.readObject(); 
    Arrays.sort(arrFromClient); 
    outToClient.writeObject(arrFromClient); 
} 

Клиент:

int arr[]=new int[10]; 
Scanner inFromUser= new Scanner(System.in); 
try (Socket clientSocket = new Socket("localhost",6786)) { 
    ObjectOutputStream outToServer = new ObjectOutputStream(clientSocket.getOutputStream()); 
    ObjectInputStream inFromServer = new ObjectInputStream(clientSocket.getInputStream()); 
    for(int i=0;i<10;i++) 
     arr[i]=inFromUser.nextInt(); 

    outToServer.writeObject(arr); 
    int[] arrFromServer = (int[])inFromServer.readObject(); 
    for (int i = 0; i < arrFromServer.length; i++) { 
     System.out.println("From Server::"+arrFromServer[i]); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^