一、基礎類型數據傳輸
byte、char、short
boolean、int、long
float、double、string
byte(8位)是最基礎的數據類型,是網絡傳輸中最基本的數據類型。
byte可以轉換爲char。
short(16位)可以轉換位2個byte數組。
boolean在c語音中就是0和1。不需要使用int值,直接使用byte值就可以了。
int(32位)佔4個byte。
long(64位)8個byte數組。
float(32位),4個byte數組。
double(64位),8個byte數組。
string(可變)轉換爲對應的byte數組就可以
二、大端和小端
比如,int是32位,轉換爲4個8位存儲在byte數組。如果把高位放在前,就成爲大端模式。反之,稱爲小端。在接收的時候也需要依次存回去。
三、ByteBuffer
是NIO庫中的一個類。
ByteBuffer裏面全部都是byte數組。
通過ByteBuffer發送基礎數據:
private static void todo(Socket client) throws IOException {
// 得到Socket輸出流
OutputStream outputStream = client.getOutputStream();
// 得到Socket輸入流
InputStream inputStream = client.getInputStream();
byte[] buffer = new byte[256];
ByteBuffer byteBuffer = ByteBuffer.wrap(buffer);
// byte
byteBuffer.put((byte) 126);
// char
char c = 'a';
byteBuffer.putChar(c);
// int
int i = 2323123;
byteBuffer.putInt(i);
// bool
boolean b = true;
byteBuffer.put(b ? (byte) 1 : (byte) 0);
// Long
long l = 298789739;
byteBuffer.putLong(l);
// float
float f = 12.345f;
byteBuffer.putFloat(f);
// double
double d = 13.31241248782973;
byteBuffer.putDouble(d);
// String
String str = "Hello你好!";
byteBuffer.put(str.getBytes());
// 發送到服務器
outputStream.write(buffer, 0, byteBuffer.position() + 1);
// 接收服務器返回
int read = inputStream.read(buffer);
System.out.println("收到數量:" + read);
// 資源釋放
outputStream.close();
inputStream.close();
}
通過ByteBuffer解析基礎數據:
private static class ClientHandler extends Thread {
private Socket socket;
ClientHandler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
super.run();
System.out.println("新客戶端連接:" + socket.getInetAddress() +
" P:" + socket.getPort());
try {
// 得到套接字流
OutputStream outputStream = socket.getOutputStream();
InputStream inputStream = socket.getInputStream();
byte[] buffer = new byte[256];
int readCount = inputStream.read(buffer);
ByteBuffer byteBuffer = ByteBuffer.wrap(buffer, 0, readCount);
// byte
byte be = byteBuffer.get();
// char
char c = byteBuffer.getChar();
// int
int i = byteBuffer.getInt();
// bool
boolean b = byteBuffer.get() == 1;
// Long
long l = byteBuffer.getLong();
// float
float f = byteBuffer.getFloat();
// double
double d = byteBuffer.getDouble();
// String
int pos = byteBuffer.position();
String str = new String(buffer, pos, readCount - pos - 1);
System.out.println("收到數量:" + readCount + " 數據:"
+ be + "\n"
+ c + "\n"
+ i + "\n"
+ b + "\n"
+ l + "\n"
+ f + "\n"
+ d + "\n"
+ str + "\n");
outputStream.write(buffer, 0, readCount);
outputStream.close();
inputStream.close();
} catch (Exception e) {
System.out.println("連接異常斷開");
} finally {
// 連接關閉
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("客戶端已退出:" + socket.getInetAddress() +
" P:" + socket.getPort());
}
}