TCP链接简介

TCP在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立通过三次握手,释放则需要四次握手,所以说每个连接的建立都是需要资源消耗和时间消耗的。

长连接

模拟一种长连接的情况:

  1. client 向 server 发起连接
  2. server 接到请求,双方建立连接
  3. client 向 server 发送消息
  4. server 回应 client
  5. 一次读写完成,连接不关闭
  6. 后续读写操作…
  7. 长时间操作之后client发起关闭请求

长连接的操作步骤是:
建立连接——数据传输…(保持连接)…数据传输——关闭连接

服务器

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Hashtable;public class TCPTransport {private static final int SERVER_PORT=8883;private static Hashtable<String, Socket> ht = new Hashtable();public static void main(String[] args) throws IOException {// TODO Auto-generated method stubSystem.out.println("VNTCenter.main()===TCP SERVER==============");//新建ServerSocket vntServer = null;try{//监听本机的端口的地址是否有链接vntServer= new ServerSocket(SERVER_PORT);System.out.println("监听的端口 "+vntServer.getLocalPort()+"...");while(true){//在服务端调用accept()方法接受客户端的连接对象Socket vntClient=vntServer.accept();System.out.println("客户IP "+vntClient.getInetAddress()+"...");System.out.println("客户端口 "+vntClient.getPort()+"...");//新建线程new GetGpsThreadFun(vntClient).start();//进客户端ip转为String字符串,存到map中ht.put(vntClient.getInetAddress().toString(),vntClient);}}catch (Exception e) {// TODO: handle exceptione.printStackTrace();vntServer.close();}}
}import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;public class GetGpsThreadFun extends Thread{private Socket vntThreadClient;public GetGpsThreadFun(Socket vntThreadSocket){vntThreadClient=vntThreadSocket;}public void run(){try{//显示时间Date day=new Date();SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println(df.format(day));byte[] data = new byte[1024];while(true){int len = vntThreadClient.getInputStream().read(data);if (len > 0){//打印客户端IP:端口:接收的数据(字符串的转化方法)System.out.println(vntThreadClient.getInetAddress()+":"+vntThreadClient.getPort()+":"+new String(data,0,len));//给客户端返回TCPvntThreadClient.getOutputStream().write("TCP".getBytes());if("shutdown".equals(vntThreadClient)){//停止本次循环break;}}}}catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}
}

短链接

模拟一种TCP短连接的情况:

  1. client 向 server 发起连接请求
  2. server 接到请求,双方建立连接
  3. client 向 server 发送消息
  4. server 回应 client
  5. 一次读写完成,此时双方任何一个都可以发起 close 操作

短连接的操作步骤是:
建立连接——数据传输——关闭连接…建立连接——数据传输——关闭连接

服务器

import java.net.ServerSocket;
import java.net.Socket;
import java.sql.Connection;public class TCPThreadServer {private static final int PORT = 8883;public static void main(String[] args) {int count = 1;try {/*** 创建一个ServerSocket对象,并给它制定一个端口号,* 通过这个端口号来监听客户端的连接,服务端接受客户端连接的请求是* 不间断地接受的,所以服务端的编程一般都永无休止的运行*/ServerSocket ss = new ServerSocket(PORT);System.out.println("服务器已经启动。。。");while (true) {/*** 在服务端调用accept()方法接受客户端的连接对象,accept()方法是* 一个阻塞式的方法,一直傻傻地等待着是否有客户端申请连接*/Socket s = ss.accept();System.out.println("共" + count + "次链接");System.out.println("现连接IP地址是:"+s.getInetAddress());count++;/** 获取当前的系统时间,与初始时间相减就是程序运行的毫秒数,除以1000就是秒数*//*** 服务端使用多线程方便多客户端的连接* 这里将服务端的socket传给内部类,方便每个客户端都创建一个线程*/Thread t = new Thread(new TCPThreadServerSocket(s));t.start();}} catch (Exception e) {e.printStackTrace();}}}import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.sql.Connection;
import java.text.SimpleDateFormat;
import java.util.Date;class TCPThreadServerSocket implements Runnable {private Socket socket = null;private InputStream in = null;private OutputStream out = null;public TCPThreadServerSocket(Socket s) {this.socket = s;}@Overridepublic void run() {try {//获取服务端输入的消息in = socket.getInputStream();//显示时间Date day=new Date();SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println(df.format(day));//服务端返回的消息out = socket.getOutputStream();//用一个字节数字来存放消息,提高效率byte[] recData = new byte[1024];int length = in.read(recData);String hc = new String(recData, 0, length);System.out.println("读取到客户端发送来的数据:" + hc);//返回给客户端的消息out.write("REG".getBytes());} catch (IOException e) {e.printStackTrace();} finally {try {//关闭资源in.close();out.close();socket.close();} catch (IOException e) {e.printStackTrace();}}}

客户端

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;public class Test {public static void main(String[] args) throws IOException {// 建立tcp服务Socket socket = new Socket(InetAddress.getLocalHost(), 8883);//Socket socket = new Socket("120.53.236.19", 8883);// 获取socket输出流对象OutputStream outputStream = socket.getOutputStream();// 写数据String data = "HY:456,-123,000";outputStream.write(data.getBytes());// 与服务器端交互InputStream inputStream = socket.getInputStream();byte[] buf = new byte[1024];int length = inputStream.read(buf);System.out.println("客户端收到" + new String(buf, 0, length));// 关闭资源socket.close();}
}

Java实现TCP的长短链接相关推荐

  1. 【三次握手、四次挥手流程】及【长短链接区别】

    常见名词解释: SYN(synchronous,建立联机) .ACK(acknowledgement,确认).PSH(push,传送).FIN(finish,结束).RST(reset,重置).URG ...

  2. Java基于TCP(Socket)协议的网络语音聊天

    Java基于TCP协议的网络语音聊天 本聊天是基于tcp协议进行的,其本质为:本地录音->将录音通过网络编程转发给他人->他人进行录音的播放. 所需知识:多线程,基于tcp协议的网络编程 ...

  3. 基于Java的TCP Socket通信详解(计算机端/Android手机端)

    TCP Socket通信是一种比较常用的基于连接的网络通信方式.本文通过Java实现TCP Socket通信,并将其用于计算机端.Android手机端,同时做到代码规范化,实现代码最大化复用. 本文代 ...

  4. Wireshark抓包分析TCP建立/释放链接的过程以及状态变迁分析

    Wireshark抓包分析TCP建立/释放链接的过程以及状态变迁分析 一.介绍计算机网络体系结构 1.计算机的网络体系结构 在抓包分析TCP建立链接之前首先了解下计算机的网络通信的模型,我相信学习过计 ...

  5. php数据库可转java数据库,php转java 系列2 Spring boo 链接数据库jdbc

    php转java 系列2 Spring boo 链接数据库jdbc JDBC 首先创建一个新项目,在创建项目时要注意导入依赖, 在项目创建成功后就会看到在 pom.xml 文件中找到,但是如果在创建项 ...

  6. 【零基础学Java】—TCP通信(五十四)

    [零基础学Java]-TCP通信(五十四) TCP通信:面向连接的通信,客户端和服务器端必须经过三次握手,建立逻辑连接,才能通信(安全). 通信的步骤: 服务器端先启动 服务器端不会主动的请求客户端, ...

  7. java tcp demo_详解Java使用TCP实现数据传输实例

    这篇文章主要介绍了Java使用TCP实现数据传输实例详解的相关资料,需要的朋友可以参考下 Java使用TCP实现数据传输实例详解 TCP所提供服务的主要特点: 1.面向连接的传输: 2.端到端的通信: ...

  8. java实现tcp服务器(单线程、多线程)、客户端

    全栈工程师开发手册 (作者:栾鹏) java教程全解 java实现tcp服务器(单线程.多线程).客户端. 服务器端接收客户申请,响应时间戳和用户源字符串. 客户端使用控制台作为输入输出流 tcp服务 ...

  9. 【JAVA】TCP通信——发弹幕案例

    Java实现TCP通信--发弹幕案例 TCP通信可以实现双方相互接收发送消息,初学TCP通信,从简入难,先实现一方可以接收多方消息(一方作为服务端,多方作为客户端),即类似于观看视频的用户发送多条弹幕 ...

最新文章

  1. git ssh key创建和github使用
  2. 【Shell脚本】逐行处理文本文件
  3. vuejs linux windows,vue.js环境在window和linux安装
  4. 大数据查询——HBase读写设计与实践--转
  5. 企业怎样做好计算机应急响应工作
  6. 201612-5 卡牌游戏
  7. python的river安装
  8. M3DGIS三维电子沙盘大数据人工智能元宇宙地理信息系统第5课
  9. 《大数据之路:阿里巴巴大数据实践》-第2篇 数据模型篇 -第9章 阿里巴巴数据整合及管理体系
  10. 解决:登录失败,用户账号限制。可能的原因包括不允许空密码,登录时间限制,或强制的策略限制
  11. 通过搜狗蜘蛛池,让网站收录排名提升
  12. 计算机毕业设计——基于Spring Boot框架的在线导游预约系统
  13. python爬取58同城租房信息_分页爬取58同城租房信息.py
  14. 大数据和云计算是如何结合
  15. C++ Primer Plus(嵌入式公开课)---第5,6章 循环和关系表达式 分支语句和逻辑运算符
  16. 人脸与关键点检测:YOLO5Face实战
  17. 还我一个奇迹——记僵尸3的遗憾和美丽
  18. 【期权课堂】第4课 期权的内在价值和时间价值(网格交易之家)
  19. 计算机控制技术的前景,计算机控制技术专业就业前景如何?
  20. 万物互联机遇 物联网步入迅速发展期

热门文章

  1. 2021年中国化肥行业产量及重点企业对比分析:云天化vs金正大vs新洋丰[图]
  2. 领导对你说这3句“小话”,表面关心,实则敲打,不改将被弃用
  3. Btree 数据结构
  4. 怎样关闭任务栏的Microsoft资讯
  5. Linux系统下nohup日志文件按日期分割展示
  6. 【Trie图】Hiho4_Hihocoder
  7. css之-单行文本溢出显示省略号,多行文本溢出显示省略号
  8. 删除SQL表中的某一列
  9. 写给后端开发看的安卓入门
  10. 一个好的web前端开发者,是怎么学习的?前端开发培训机构哪个比较好