TCP在Java中的一般应用
来源:互联网 发布:怎么投诉淘宝店 编辑:程序博客网 时间:2024/06/13 06:00
java里的TCP有服务端+客户端一说,网上搜索Server+client,那是一打一打的,内容都大同小异。但是这个一般是对于短连接来说的,但是在实际工作中,服务端和客户端保持长连接还是比较常见的方式,这样可以减少短连接在创建连接时所消耗的时间,对提高服务器性能起到很大的提升,但是长连接中,因为多个数据的传输使用同一个通道,所以存在一个定长解析的过程(不知道是不是这么叫法)。
看图说话:
client和server之间的传输方式无须多言,是双向的。有接收就有发送。
主要要说的是所传输的数据结构。一般来说,数据都是通过字节流(可以理解为byte[])的方式来体现,实际运用中,其有2部分,一是header,一是body。
header:一般是一个4个字节的定长数组,代表的是body的字节长度。
body:代表数据本身。
当client–>server发送数据时,client先封装字节数组,包括header和body。当server接收到数据时,先读取数据流前4个字节,转换成整数(int类型占4个字节)即是body数据的字节长度,然后再继续向后读body字节长度的数据。这样就完成一次数据交互。
而server–>client响应数据,也是同样的原理。这里不再解析。
相关Java代码:
/** * Created by claireliu on 2017/5/6. */public class Server { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(9999); while (true) { Socket socket = null; InputStream in = null; OutputStream out = null; try { System.out.println("初始化。。。"); socket = serverSocket.accept();// 从连接队列中取出一个连接,如果没有则等待 System.out.println("收到请求。。。"); in = socket.getInputStream(); byte[] headerBuf = new byte[4]; in.read(headerBuf); int bodyLength = TypeUtil.bytesToInt(headerBuf, 0); System.out.println("bodyLength:" + bodyLength); byte[] bodyBuf = new byte[bodyLength]; in.read(bodyBuf); System.out.println("client said:" + new String(bodyBuf)); out = socket.getOutputStream(); String response = "Ok"; byte[] responseHeaderBuf = TypeUtil.int2Bytes(response.getBytes().length); byte[] responseBodyBuf = response.getBytes(); out.write(responseHeaderBuf); out.write(responseBodyBuf); out.flush(); } catch (IOException e) { e.printStackTrace(); } finally { if(in != null) { try { in.close(); } catch (IOException e1) { e1.printStackTrace(); } } if(out != null) { try { out.close(); } catch (IOException e1) { e1.printStackTrace(); } } if(socket != null){ try { socket.close(); } catch (IOException e1) { e1.printStackTrace(); } } } } }}
public class Client { public static void main(String[] args) { InputStream in = null; OutputStream out = null; Socket socket = null; try{ socket = new Socket("localhost",9999); out = socket.getOutputStream(); String response = "xxx"; System.out.println("reponse:" + response.getBytes().length); byte[] responseHeaderBuf = TypeUtil.int2Bytes(response.getBytes().length); byte[] responseBodyBuf = response.getBytes(); out.write(responseHeaderBuf); out.write(responseBodyBuf); out.flush(); in = socket.getInputStream(); // 读头信息,即Body长度 byte[] headerBuf = new byte[4]; in.read(headerBuf); int bodyLength = TypeUtil.bytesToInt(headerBuf, 0); System.out.println("bodyLenth.." + bodyLength); byte[] bodyBuf = new byte[bodyLength]; in.read(bodyBuf); // 输出 System.out.println("server said:" + (new String(bodyBuf))); }catch (Exception e){ e.printStackTrace(); } finally { if(in != null) { try { in.close(); } catch (IOException e1) { e1.printStackTrace(); } } if(out != null) { try { out.close(); } catch (IOException e1) { e1.printStackTrace(); } } if(socket != null){ try { socket.close(); } catch (IOException e1) { e1.printStackTrace(); } } } }}
public class TypeUtil { /** * int返回字节数组 * * @param num * @return */ public static byte[] int2Bytes(int num) { byte[] byteNum = new byte[4]; for (int ix = 0; ix < 4; ++ix) { int offset = 32 - (ix + 1) * 8; byteNum[ix] = (byte) ((num >> offset) & 0xff); } return byteNum; } /** * byte数组中取int数值,本方法适用于(低位在后,高位在前)的顺序。 */ public static int bytesToInt(byte[] src, int offset) { int value; value = (int) (((src[offset] & 0xFF) << 24) | ((src[offset + 1] & 0xFF) << 16) | ((src[offset + 2] & 0xFF) << 8) | (src[offset + 3] & 0xFF)); return value; }}
0 0
- TCP在Java中的一般应用
- 分治算法在一般选择问题中的应用
- Ping程序在TCP/IP中的应用
- Java应用一般架构
- java应用一般架构
- java应用一般架构
- JAVA一般应用架构
- Java 应用一般架构
- Java 应用一般架构
- Java应用一般架构
- java应用一般架构
- Java 应用一般架构
- Java中的一般概念
- final在java中的应用
- final在java中的应用
- final在java中的应用
- final在Java中的应用
- final在java中的应用
- int转换成NSData
- centos7 yum安装配置redis 并设置密码
- Git远程连接Github常见问题
- 卸载wdcp面板命令
- 集合框架
- TCP在Java中的一般应用
- 水果 pair练习
- Problem A: 时间类的构造和输出
- LeedCode 之 Count and Say
- JavaScript对象---dom技术,对象树的创建
- 震惊!小猪的设计模式初涉总结!纯干货~
- AT24CXX系列程序
- 机器学习初涉--贝叶斯分类
- 2017.5.6(看懂代码)