我想通过套接字发送包含长值的消息。我想发送字符串消息。为了节省字节并使消息更短,我想以8个字符的字符串发送64位长的字节值。以下是我的代码,但我在套接字的另一端收到了错误的值:
这是服务器:
public class ClockSkewServer {
public static void main (String args[]){
try {
ServerSocket s = new ServerSocket(3000);
System.out.println("Server is listening!");
Socket connection = s.accept();
connection.setKeepAlive(true);
BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
PrintWriter pw = new PrintWriter(connection.getOutputStream(), true);
while (true) {
String message = br.readLine();
System.out.println(message);
Long receivedTime = ByteUtil.stringToLong(message);
System.out.println(receivedTime);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
这是客户:
public class ClockSkewClient {
public static void main (String args[]) throws UnknownHostException, IOException, InterruptedException{
Socket s1 = new Socket(args[0], 3000);
s1.setKeepAlive(true);
PrintWriter out1 = new PrintWriter(s1.getOutputStream(), true);
long l = new Long("1490917469228");
//System.out.println(l);
while (true){
Thread.sleep(1000);
String message = ByteUtil.longToString(l);
System.out.println("Client message: " + message);
System.out.println(ByteUtil.stringToLong(message));
out1.println(message);
}
}
}
这是我的字节转换类:
public class ByteUtil {
private static ByteBuffer longBuffer = ByteBuffer.allocate(Long.BYTES);
private static ByteBuffer shortBuffer = ByteBuffer.allocate(Short.BYTES);
private static ByteBuffer byteBuffer = ByteBuffer.allocate(Byte.BYTES);
public static byte[] longToBytes(long x) {
longBuffer.putLong(0, x);
return longBuffer.array();
}
public static long bytesToLong(byte[] bytes) {
return ByteBuffer.wrap(bytes).getLong();
}
public static String longToString (long x) throws UnsupportedEncodingException{
return new String (longToBytes(x), "ISO-8859-1");
}
public static long stringToLong (String s) throws UnsupportedEncodingException{
return bytesToLong(s.getBytes("ISO-8859-1"));
}
}
ByteUtil工作正常,因为客户端可以正确检索原始长值,但是当我通过套接字发送它时会失真。
我在客户端成功获得了长值1490917469228,但在服务器端我获得了1490911439916.
我知道我们可以发送字节并避免这个问题,但由于某种原因,我坚持要通过套接字发送字符串。
由于
答案 0 :(得分:3)
我想通过套接字发送包含长值的消息。我想发送字符串消息。为了节省字节并使消息更短,我想以8个字符的字符串发送64位长的字节值。
为什么呢?将64位作为8个字符发送可能需要 16 个字节。 128位。它当然不会保存任何字节,所有这些转换只会浪费时间和代码空间:特别是开发时间,特别是当您的代码不起作用时。
只需使用double quantity = double.Parse(txtQuantity.Text);
lblConversion.Text = string.Format("{0} {1} = {2} {3}",
quantity, currenFrom, iRate * quantity, currencyTo);
和DataOutputStream.writeLong()
即可。