首页 > 编程语言 >java之Socket通信,Socket服务端返回数据,基本数据类型占用字节数。

java之Socket通信,Socket服务端返回数据,基本数据类型占用字节数。

时间:2023-08-09 18:14:39浏览次数:32  
标签:java Socket 字节 数据类型 socket new byte 服务端 客户端

参考:https://blog.csdn.net/qq_43842093/article/details/129964892
https://blog.csdn.net/weixin_42408447/article/details/126437276
数据类型占用字节数:

    // Java一共有8种基本数据类型:
    // 1、int占4字节,取值范围为“-2147483648~2147483647”;
    // 2、short占2字节,取值范围为“-32768~32767”;
    // 3、long占8字节;
    // 4、byte占1字节,取值范围为“-128~127”;
    // 5、float是单浮点类型,占4字节;
    // 6、double是双浮点类型,占8字节;
    // 7、char占2字节;
    // 8、boolean占1字节。

服务端:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author jay
 * @create 2023-04-12 14:59
 * 多线程下socket,服务端
 */
public class ServerSocketTest2 {
    public static void ServerStart() {
        try {
            // 初始化服务端socket并且绑定9999端口
            ServerSocket serverSocket = new ServerSocket(9999);
            // 创建一个线程池,开100个线程等待客户端连接。
            ExecutorService executorService = Executors.newFixedThreadPool(100);
            while (true) {
                // 监听socket创建的连接并接受到它,此为阻塞方法,直到连接创建。
                // 不能放到Runnable中,得到连接后才启用新线程,不然会立刻把线程池占满,一直在循环产生新线程。
                Socket socketClient = serverSocket.accept();
                Runnable runnable = () -> {
                    // 通过包类型+包长度+消息内容定义一个socket通信对象。
                    // 数据类型为byte类型,包长度为int类型,消息内容为byte类型。
                    try {
                        // 获取socket客户端输入流
                        InputStream inputStream = socketClient.getInputStream();
                        DataInputStream dataInputStream = new DataInputStream(inputStream);
                        // server端输出流,输出数据给客户端。
                        OutputStream outputStream = socketClient.getOutputStream();
                        DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
                        // 连接状态,客户端执行socket.shutdownOutput();后连接会被关闭。
                        while (socketClient.isConnected()) {
                            // 读取数据类型标识
                            byte b = dataInputStream.readByte();
                            // 读取数据总长度
                            int lenAccept = dataInputStream.readInt();
                            // 读取数据内容,此处要移除5个长度,是和客户端发送的内容约定好的。
                            byte[] dataAccept = new byte[lenAccept - 5];
                            dataInputStream.readFully(dataAccept);
                            // 把读取到的数据转为String
                            String strAccept = new String(dataAccept);
                            System.out.println("Server获取的数据类型为:" + b);
                            System.out.println("Server获取的数据长度为:" + lenAccept);
                            System.out.println("Server获取的数据内容为:" + strAccept);

                            // 写入,输出给客户端。
                            String strOut = "Server已接收到数据!";
                            int typeOut = 1;
                            byte[] dataOut = strOut.getBytes();
                            int lenOut = dataOut.length + 5;
                            dataOutputStream.writeByte(typeOut);// writeByte 长度1字节
                            dataOutputStream.writeInt(lenOut);// writeInt 长度4字节
                            dataOutputStream.write(dataOut);// write 长度为data[]的length长度
                            dataOutputStream.flush();// 提交输出数据
                            break;
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                };
                executorService.submit(runnable);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

客户端:

import java.io.*;
import java.net.Socket;

/**
 * @author jay
 * @create 2023-04-12 15:05
 * https://blog.csdn.net/weixin_42408447/article/details/126437276
 */
public class ClientSocket2 {
    public static void ClientStart() {
        try {
            Socket socket = new Socket("127.0.0.1", 9999);
            // 客户端输出流,输出数据给服务端。
            OutputStream outputStream = socket.getOutputStream();
            DataOutputStream dataOutputStream = new DataOutputStream(outputStream);

            // 客户端输入流,获取服务端返回的数据。
            InputStream inputStream = socket.getInputStream();
            DataInputStream dataInputStream = new DataInputStream(inputStream);

            String str = "Client发送的数据!";
            int type = 1;
            byte[] data = str.getBytes();
            int len = data.length + 5;
            // len = len + type + data 的长度。
            // 客户端按顺序write,服务端同样按顺序读取。
            dataOutputStream.writeByte(type);// writeByte 长度1字节
            dataOutputStream.writeInt(len);// writeInt 长度4字节
            dataOutputStream.write(data);// write 长度为data[]的length长度
            //刷新输出流,把write提交进去,不然服务端没接收到内容。
            dataOutputStream.flush();

            // 接收Server端返回的数据
            // 读取数据类型标识
            byte b = dataInputStream.readByte();
            // 读取数据总长度
            int lenAccept = dataInputStream.readInt();
            // 读取数据内容,此处要移除5个长度,是和客户端发送的内容约定好的。
            byte[] dataAccept = new byte[lenAccept - 5];
            dataInputStream.readFully(dataAccept);
            // 把读取到的数据转为String
            String strAccept = new String(dataAccept);
            System.out.println("Client接收到返回数据:" + strAccept);
            // 关闭和释放资源
            socket.shutdownOutput();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

调用socket.close()或者socket.shutdownOutput()方法,通知服务端数据输出已经完成。
调用这两个方法,都会结束客户端socket,但是有本质的区别。
socket.close() 将socket关闭连接,那边如果有服务端给客户端反馈信息,此时客户端是收不到的。
而socket.shutdownOutput()是将输出流关闭,此时,如果服务端有信息返回,则客户端是可以正常接收的。

标签:java,Socket,字节,数据类型,socket,new,byte,服务端,客户端
From: https://www.cnblogs.com/xsj1989/p/17617614.html

相关文章

  • Java微服务项目【动力商城】企业级实战项目直击大厂
    2023年动力节点全新版微服务项目【动力商城】震撼来袭!企业级实战项目,直击大厂!动力商城是以B2C模式运营的在线商城,总览企业及公司产品于一体,主打自主研发品牌以推广的互联网化新商城。系统采用的微服务架构模式。技术选型:Springboot+SpringCloud、Mybatis-plus、MySQL、Redis、阿里......
  • MySQL和Java中的货币字段类型选择
    引言在互联网应用中,处理货币是一项常见的任务。为了确保准确性和精度,我们需要选择适当的字段类型来存储货币数据。本文将讨论在MySQL和Java中记录货币时应选择的字段类型,并提供相应的代码示例。MySQL中的货币字段类型在MySQL中,我们可以使用DECIMAL数据类型来存储货币数据。DECIM......
  • 【校招VIP】java语言考点之基本数据类型
    考点介绍:基本数据类型的长度、自动升级、JVM存储和封装类的相关考点,是校招常见考点。基础考点不能出错一、考点题目1、JAVA中的几种基本数据类型是什么,各自占用多少字节解答:先了解2个单词先:1、bit--位:位是计算机中......2、byte--字节:字节是......2、JAVA是不是完全的面向......
  • 基于Java开发的企业级数字化采购系统(SRM)
    一、项目介绍一款全源码可二开,可基于云部署、私有部署的企业级数字化采购管理系统,供应商全生命周期管控,公开询价管理,招标,定标,评审,生成订单,送货,收货全流程管理,让企业采购全程数字化管控,助力企业全面提升效率与效益。电子化采购全闭环管理,打造企业高效透明采购平台。二、项目技......
  • 快速了解JavaScript的JSON
    JSON是用于存储和传输数据的格式。JSON通常用于服务端向网页传递数据。1什么是JSON?JSON英文全称 JavaScript Object NotationJSON是一种轻量级的数据交换格式。JSON是独立的语言 *JSON易于理解。2JSON语法基本上JSON对象就是基于JavaScript对象,因......
  • 老杜 JavaWeb 讲解(二十) ——Listener监听器
    (十八)Listener监听器引子:静态代码块packagecom.zwm.javaweb.servlet;/***@author猪无名*@date2023/8/81347*discription:*/publicclasstest2{//静态代码块在类加载时执行,并且只执行一次。//这个语法很简单,但什么时候用?很疑惑//假如,你希......
  • JavaScript用法
    JavaScript用法HTML中的JavaScript脚本代码必须位于<script>和</script>标签之间。Javascript脚本代码可被放置在HTML页面的<body>和<head>部分中。<script>标签<script>和</script>之间的代码包含了JavaScript<!DOCTYPEhtml><htmllang="en">......
  • JavaScript:表单生成器
    JavaScript:表单生成器一条小橘猫于2021-12-0116:10:56发布3393收藏38分类专栏:JavaScript文章标签:经验分享javajavascripthtml前端版权华为云开发者联盟该内容已被华为云开发者联盟社区收录加入社区JavaScript专栏收录该内容45篇文章55订阅已订阅表单属性有姓......
  • Java源代码是如何编译,加载到内存中的?
    1.前言相信许多开发同学看过《深入理解java虚拟机》,也阅读过java虚拟机规范,书籍和文档给人的感觉不够直观,本文从一个简单的例子来看看jvm是如何工作的吧。本文所有操作均在mac上进行。2.示例代码示例代码采用最常见的双重检索单例模式:packageinterview.desginpattern.single......
  • Java遍历集合(List,Map)
    遍历ListpublicvoiditeratorList(){List<String>list=newArrayList<>();list.add("a");list.add("b");//方法1使用iterator遍历Iterator<String>iterator=list.iterator();w......