通过Java中的Socket发送鼠标坐标

时间:2015-04-21 09:33:42

标签: java sockets networking

我一直在网站上搜索并搜索,但我找不到任何能回答我问题的内容,如果有一个你认为可以回答我的问题,那么我很抱歉,请把它连接起来=) 无论如何,这里是:

我正在尝试将套接字上的鼠标坐标从客户端发送到服务器。现在我可以通过DataOutPutStream发送一个整数,并不断更新它,但当然鼠标坐标有两组数据,x和y。

所以我的问题是,如何发送多个数据,以及服务器如何知道哪个是x,哪个是y?

正如您在我的客户端中看到的,我发送的值为5的int,但是我需要能够发送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());
        }
    }
}

如果有人可以解释或重新指导我到可以帮助我的地方,我会非常感激!

度过愉快的一天=)

3 个答案:

答案 0 :(得分: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...
}

编辑: 您的MouseCoordinate类需要实现Serializable接口。

编辑#2: 如果你加密OutOfMemoryException,你可能需要每隔一段时间重置一次OutputStream(如this article中所述),或者使用writeUnsharedObject()及其相应的readUnsharedObject()方法的ObjectStreams。

答案 1 :(得分:0)

您是否尝试过使用对象?

以下是一个例子:

public class Coordinates implements Serializable {

private int x,y;

// include setter and getters
}

并将其发送到服务器而不是int。

答案 2 :(得分:0)

在这种简单的情况下你可以写x坐标然后y。并相应地阅读它们。 TCP保证字节序列。