1.TCP通信原理

TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象,从而在通信的两端形成网路虚拟链路,一旦建立虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信。
Java对基于TCP协议的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信!
Java为客户端提供了Socket类,为服务器端提供了ServerSocket类。也就是说,客户端是通过Socket类实现的,而服务端是通过ServerSocket实现的。

2.TCP发送数据的步骤

1.创建客户端的Socket对象(Socket);
2.获取输出流,写数据;
3.使用打印流装饰输出流;
4.释放资源。
按照上述步骤编写的代码如下所示:

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;public class TCPClient {public static void main(String[] args) throws IOException {//创建客户端Socket对象Socket socket = new Socket("127.0.0.1", 9999);//获取输出流写数据OutputStream outputStream = socket.getOutputStream();PrintStream ps=new PrintStream(outputStream);Scanner scanner = new Scanner(System.in);String line=null;while (true){System.out.println("请说");line=scanner.nextLine();if("end".equals(line))break;ps.println(line);}//释放资源scanner.close();ps.close();outputStream.close();}
}

3.TCP接收数据的步骤

1.创建服务器端的Socket对象(SocketServer);
2.监听客户端的连接;
3.获取输入流,读数据,并显示在控制台;
4.使用BufferReader装饰输入流对象;
5.释放资源。
按照上述步骤编写的代码如下所示:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;public class TCPServer {public static void main(String[] args) throws IOException {System.out.println("服务器已启动,正在监听客户端的连接");ServerSocket serverSocket = new ServerSocket(9999);//监听客户端的连接Socket socket = serverSocket.accept();//获取输入流InputStream inputStream = socket.getInputStream();//使用BufferedReader装饰输入流BufferedReader br=new BufferedReader(new InputStreamReader(inputStream));String line;while((line=br.readLine())!=null){System.out.println("服务器收到的信息:"+line);}//释放资源br.close();socket.close();serverSocket.close();}
}

4.效果展示

客户端执行效果演示:

服务器执行效果演示:

另外:需要注意的是,程序运行的时候需要先启动服务器端的程序,以便于服务器可以首先监听客户端的连接,否则运行程序会报服务器拒绝连接的错误
而由于一般Java程序运行的时候只有一个主线程和一个垃圾回收线程,因为我们程序的客户端的主线程一直在监听用户的输入数据,所以,如果想要实现客户端与服务器的双向聊天,需要使用到多线程来解决,有兴趣的小伙伴可以自己尝试一下。

5.实现双向聊天

通过前面的代码,我们已经使用TCP连接的三次握手建立了连接通道,所以,在上面代码的基础上实现双向的聊天就比较简单了。在这里,无论是客户端还是服务器,要想要接受消息,都需要一个线程不断的接受消息,所以,我们在这里需要使用到多线程来求解。具体代码如下所示:
客户端代码Client02.java

import java.io.*;
import java.net.Socket;
import java.util.Scanner;public class Client01 {public static void main(String[] args) throws IOException {Socket socket=new Socket("127.0.0.1",9999);//创建一个新线程,使客户端接受服务器的消息new Thread(()->{InputStream inputStream = null;try {inputStream = socket.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));String info=null;while((info=reader.readLine())!=null){System.out.println("客户端收到的消息为:"+info);}} catch (IOException e) {e.printStackTrace();}}).start();OutputStream outputStream = socket.getOutputStream();PrintStream ps=new PrintStream(outputStream);Scanner sc=new Scanner(System.in);while(true){String line = sc.nextLine();ps.println(line);}}
}

服务器代码Server02.java

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;public class Server01 {public static void main(String[] args) throws IOException {ServerSocket serverSocket=new ServerSocket(9999);//监听Socket socket = serverSocket.accept();System.out.println("服务器监听已启动");//创建一个新线程,让服务器向客户端发送消息new Thread(()->{try {OutputStream outputStream = socket.getOutputStream();PrintStream ps = new PrintStream(outputStream);Scanner sc=new Scanner(System.in);while(true){String info = sc.nextLine();ps.println(info);}} catch (IOException e) {e.printStackTrace();}}).start();InputStream inputStream = socket.getInputStream();BufferedReader br=new BufferedReader(new InputStreamReader(inputStream));String line;while((line=br.readLine())!=null){System.out.println("服务器收到信息:"+line);}}
}

注意,这里我采用的多线程是直接new Thread(),在里面编写Lambda 表达式来实现功能!

效果展示:

计算机网络:TCP实现聊天功能相关推荐

  1. python实现淘宝客服自动回复语_Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例...

    本文实例讲述了Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能.分享给大家供大家参考,具体如下: [吐槽] 网上的代码害死人,看着都写的言之凿凿,可运行就是有问题. 有些 ...

  2. 计算机网络-TCP协议

    目录 1 概述 2 TCP的主要特点 3 TCP的连接 4 可靠传输的工作原理 4.1 停止等待协议 4.1.1 无差错情况 4.1.2 出现差错 4.2 自动重传请求ARQ 4.3 连续 ARQ 协 ...

  3. Netty 4.x Netty 实现聊天功能

    Netty 实现聊天功能 Netty 是一个 Java NIO 客户端服务器框架,使用它可以快速简单地开发网络应用程序,比如服务器和客户端的协议.Netty 大大简化了网络程序的开发过程比如 TCP ...

  4. JavaWeb--使用Websocket实现在线聊天功能

    首先简单介绍下WebSocket,WebSocket是HTML5中内容,是基于TCP的一种新的网络协议,它支持全双工.长连接的通信.在它出现之前,实时消息发送与接收通过轮询实现,但是频繁与服务器建立连 ...

  5. 计算机网络TCP拥塞控制窗口大小变化、重传、滑动窗口、流量控制等

    转载自:[计算机网络] - TCP 重传.滑动窗口.流量控制.拥塞控制_3000~3500的数据早已被接收了,因为 ack 都到了 4000 了,已经意味着 4000 之前__浮生_的博客-CSDN博 ...

  6. 计算机网络实验八——聊天程序

    :比较费工夫的一次实验,因为不熟悉VS的MFC程序开发流程:以此简单记录一下. :仅为个人总结:如有错误,还望指教! 计算机网络实验八--聊天程序 HNU CS Computer Network La ...

  7. 计算机网络的便件功能

    计算机网络的功能 计算机网络的功能主要体现在三个方面:信息交换.资源共享.分布式处理. ⑴信息交换 这是计算机网络最基本的功能,主要完成计算机网络中各个节点之间的系统通信.用户可以在网上传送电子邮件. ...

  8. Socket编程一实现简易的聊天功能以及文件传输

    干程序是一件枯燥重复的事,每当感到内心浮躁的时候,我就会找小说来看.我从小就喜爱看武侠小说,一直有着武侠梦.从金庸,古龙,梁羽生系列到凤歌(昆仑),孙晓(英雄志)以及萧鼎的(诛仙)让我领略着不一样的江 ...

  9. WebSocket消息推送和聊天功能实现

    WebSocket消息推送 SpringBoot集成WebSocket实现消息推送和聊天Demo gradle引入依赖 测试用的Controller 两个测试页面 WebSocket的Endpoint ...

最新文章

  1. python计算四元素组合算法_python – 算法,列表元素之间的最近点
  2. 一个有趣的实验:用0.1f 替换 0,性能提升 7 倍!
  3. 解决程序与mysql的乱码问题
  4. Oracle去除表中重复记录
  5. SSM整合框架实现ajax校验
  6. SpringBoot @Cacheable缓存注解的使用
  7. matlab m语言,我要编写matlab一个公式的m语言,请问错在哪里?,M语言的MATLAB的M语言...
  8. es dsl多条件组合查询(转)
  9. Java的Kafka:构建安全,可扩展的消息传递应用程序
  10. 95-235-065-源码-task-SourceStreamTask
  11. LAMP、LNMP实战之九搭建cms、blog、bbs(持续更新)
  12. python多进程关闭socket_Python并发编程-多进程socketserver简易版
  13. 8.docker search
  14. java反序列化为空_Java序列化/反序列化,提供空对象引用
  15. python小说爬虫练习
  16. 点击reset按钮失效 input 和 button元素 作为提交、重置、按钮功用的区别
  17. postgres查询序列_PostgreSQL 序列使用
  18. DDD不够好用,你需要学习如何进行弹性软件系统设计
  19. 不规则四边形的平行四边形化
  20. Blender着色器:使用手绘遮罩进行材质叠加

热门文章

  1. 肠道微生物群与心血管疾病:机遇与挑战
  2. [单片机框架][bsp层][cx32l003][bsp_adc] ADC配置和使用
  3. xmanager 5下载安装
  4. 虚拟机 xp 3d加速问题
  5. 倪光南院士:构建安全可控的信息技术体系,云宏高安全的云计算关键核心技术先行
  6. java 实现 ppt或pptx文件转换PDF文件 -- poi
  7. BZOJ 2565 最长双回文串
  8. 图像处理中,在图片上写字,包括中文与英文!
  9. 什么蓝牙耳机适合打游戏?打游戏不延迟的蓝牙耳机推荐
  10. Docker定制化Python基础镜像