TCP基礎數據傳輸

一、基礎類型數據傳輸

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());

        }
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章