2015-04-21 2 views
1

Я искал на сайте и искал, но я не мог найти ничего, что отвечало бы на мой вопрос, если есть тот, который, по вашему мнению, отвечает на мой вопрос, тогда мне жаль и, пожалуйста, связывайте его =) Anyways, здесь идет:Отправьте координаты мышки по Socket в Java

Я пытаюсь отправить координату мыши через сокет от клиента к серверу. Прямо сейчас я могу отправить, например, целое число через DataOutPutStream, и продолжать его обновлять, но, конечно, координаты мыши имеют 2 набора данных - x и y.

Итак, мой вопрос в том, как отправить несколько данных и как сервер знает, какой из них является x, а какой - y?

Как вы можете видеть на моем клиенте, я отправляю int со значением 5, но мне нужно иметь возможность отправлять x и y, а затем иметь возможность различать 2 с серверной стороны , и использовать их.

Это то, что мой клиент посылает атм:

package com.company; 

import java.io.*; 
import java.net.Socket; 

/** 
* Created by John on 20/04/2015. 
*/ 
public class Client implements Serializable{ 


public static void main(String[] args) throws IOException { 
    Socket s = new Socket("localhost",1234); 
    int testX = 5; 


    DataOutputStream out; 

    out = new DataOutputStream(s.getOutputStream()); 

    while(true) { 
     out.writeInt(testX); 

    } 

} 

} 

и это сервер:

package com.company; 

import java.io.DataInputStream; 
import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class Server{ 

    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { 

     ServerSocket server = new ServerSocket(1234); 
     Socket s = server.accept(); 
     DataInputStream in; 
     in = new DataInputStream(s.getInputStream()); 




     while(true) { 
      Thread.sleep(10); 
      System.out.println(in.readInt()); 
     } 
    } 
} 

Если кто-то может объяснить или повторно направить меня куда-то, что может помочь мне с этим , Я был бы признателен за это!

Иметь хороший день =)

+0

Использовать System.put.print или отправить новый символ линии: int – MadProgrammer

+0

Вы считаете отправку * двух целых чисел? 'x' и' y'? – EJP

ответ

3

Вы можете использовать ObjectOutputStream вместо этого и использовать его на стороне клиента. Создайте класс MouseCoordinate, содержащий две целые координаты, и отправьте экземпляр этого класса через ObjectOutputStream.

На стороне сервера вам понадобится ObjectInputStream для получения объектов, а также того же класса, который вы создали.

Так что на вашей стороне клиента, замените

public static void main(String[] args) throws IOException { 
    Socket s = new Socket("localhost",1234); 
    int testX = 5; 


    ObjectOutputStream out; 

    out = new ObjectOutputStream(s.getOutputStream()); 

    while(true) { 
     out.writeObject(new MouseCoordinates(testX,testY)); 
     // Unshared prevents OutOfMemoryException 
     //out.writeUnsharedObject(new MouseCoordinates(testX,testY)); 


    } 

} 

и основным методом вашего сервера:

ServerSocket server = new ServerSocket(1234); 
Socket s = server.accept(); 
ObjectInputStream in = new ObjectInputStream(s.getInputStream()); 

while(true) { 
    MouseCoordiate coord = (MouseCoordinate) in.readObject(); 
    // Or use unshared variant as in client: 
    // MouseCoordinate coord = (MouseCoordinate) in.readUnsharedObject(); 
    System.out.println(coord); 
    // do something with coordinate... 
} 

Edit: Ваш класс MouseCoordinate нуждается в реализации интерфейса Serializable.

Edit # 2: Если вы encouter OutOfMemoryException с, возможно, потребуется переустановить OutputStream каждый раз в то время (как описано в this article), или использовать writeUnsharedObject() и его соответствующие readUnsharedObject() методы в ObjectStreams.

+0

Что я не понимаю здесь, если это будет работать на разных компьютерах (obv сокет не будет локальным хостом), то как я инициализирую класс MouseCoordinate на сервере? Будет ли доступ к этому классу не только для клиента? –

+0

Вам понадобится такая же версия (скомпилированный класс) на пути к классам серверов (т. Е. Создать класс один раз и использовать его как на сервере, так и на стороне клиента). ObjectInputStream автоматически распознает входящие данные. – octronos

+0

Итак, компьютер 1 имеет класс сервера и класс MouseData, и компьютер 2 имеет класс клиента и класс MouseData? это правильно? –

0

Вы пытались использовать объект?

Вот пример:

public class Coordinates implements Serializable { 

private int x,y; 

// include setter and getters 
} 

И отправить на сервер вместо междунар.

+0

Я пробовал что-то вроде этого, но тогда я не мог заставить его работать, если я поместил сервер в другой проект из клиента и mouseData, я мог бы заставить его работать, только если сервер имел доступ к классу mouseData, но если это будет работать на двух разных компьютерах, у сервера не будет доступа к классу, а только для клиента. У меня было что-то вроде этого: ObjectInputStream in = new ObjectInputStream (s.getInputStream()); MouseData mouseReceive = (MouseData) in.readObject(); System.out.println (mouseReceive.mouseX); –

+2

@EbolaInspector И все же вы отметили идентичный ответ как правильный. Любопытно. – EJP

0

В таком простом случае вы можете просто написать координату x, а затем y. И читайте их соответственно. TCP гарантирует последовательность байтов.

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