我一直在网站上搜索并搜索,但我找不到任何能回答我问题的内容,如果有一个你认为可以回答我的问题,那么我很抱歉,请把它连接起来=) 无论如何,这里是:
我正在尝试将套接字上的鼠标坐标从客户端发送到服务器。现在我可以通过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());
}
}
}
如果有人可以解释或重新指导我到可以帮助我的地方,我会非常感激!
度过愉快的一天=)
答案 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保证字节序列。