使用DataOutputStream存放基本数据类型

### Java Socket 发送自定义协议示例 在Java中,通过`Socket`类可以方便地实现客户端和服务端之间的TCP通信。为了发送自定义协议的数据包,通常需要先定义好数据包的结构,包括但不限于头部信息(如长度、命令码)、负载部分(即实际传输的内容),以及可能存在的校验位等。 对于自定义协议的设计,假设采用如下简单的格式: - 数据头:4字节表示整个报文的总长度; - 类型字段:1字节用于区分不同类型的请求或响应; - 负载区:变长区域,存放具体要传递的信息; 下面是一个基于上述约定编写的简易例子[^3]。 #### 创建服务端Server.java ```java import java.io.*; import java.net.*; public class Server { public static void main(String[] args) throws IOException { int port = 8080; try (ServerSocket serverSocket = new ServerSocket(port)) { System.out.println("等待客户连接..."); while(true){ Socket clientSocket = null; try{ clientSocket = serverSocket.accept(); handleClient(clientSocket); }catch(IOException e){ if(null != clientSocket) clientSocket.close(); } } } } private static void handleClient(Socket socket)throws IOException{ DataInputStream inputFromClient = new DataInputStream(socket.getInputStream()); byte[] buffer = new byte[inputFromClient.readInt()]; //读取消息体前先获取其大小 inputFromClient.readFully(buffer); //按照指定长度读取完整的消息体 String messageBody = new String(buffer,"UTF-8"); char messageType = inputFromClient.readChar(); //读取类型标记符 System.out.printf("接收到%s类型消息:%s\n",messageType,messageBody); //此处可加入更多逻辑处理... socket.shutdownInput(); PrintWriter outToClient = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(),"UTF-8"),true); outToClient.print('A'); //向客户端返回确认字符'A' socket.close(); } } ``` #### 编写客户端Client.java ```java import java.io.*; import java.net.*; public class Client { public static void main(String[] args) throws UnknownHostException, IOException { InetAddress address = InetAddress.getByName("localhost"); int port = 8080; try(Socket socket = new Socket(address,port)){ String msgToSend="你好"; ByteArrayOutputStream baos=new ByteArrayOutputStream(); DataOutputStream dos=new DataOutputStream(baos); dos.writeUTF(msgToSend); //将字符串编码成byte数组并存入流 byte[] data=baos.toByteArray(); ByteArrayInputStream bais=new ByteArrayInputStream(data); DataInputStream dis=new DataInputStream(bais); PrintStream outputToServer = new PrintStream( new BufferedOutputStream(socket.getOutputStream()),false,"UTF-8" ); outputToServer.writeInt(dis.available()); //告知对方即将发送的数据量 outputToServer.writeBytes(dis.toString()); //发送实际内容 outputToServer.write('B'); //附加一个类型标识'B' BufferedReader inFromServer = new BufferedReader(new InputStreamReader(socket.getInputStream())); char response=inFromServer.readLine().charAt(0); //接收来自服务器的一条反馈 System.out.printf("服务器回应:%c\n",response); } } } ``` 此案例展示了基本框架下如何构建支持特定格式通讯的应用程序。当然,在真实项目里还需要考虑诸如异常捕获、线程管理等因素,并且可能会涉及到更加复杂的协议解析过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值