热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Java实现基于TCP的通讯程序实例解析

这篇文章主要介绍了Java实现基于TCP的通讯程序实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Java中的TCP通信程序

TCP可以实现两台计算机之间的数据交互通信的两端,要严格区分客户端与服务端
两端通信时的步骤:
1.服务端程序,需要事先启动,等待客户端连接
2.客户端主动连接服务器端,才能成功通信,服务器端不可以主动链接客户端

在java中两个类用于实现TCP通信程序:

  1. 客户端: java.net.Socket 类表示。创建 Socket 对象,向服务端发出连接请求,服务端响应请求,两者建 立连接开始通信。
  2. 服务端: java.net.ServerSocket 类表示。创建 ServerSocket 对象,相当于开启一个服务,并等待客户端 的连接。

Socket类

socket类:该类实现客户端套接字,套接字是指两台设备之间的端点

构造方法:
public Socket(String host,int port):创建套接字对象并将其连接到指定对象的主机上,如果指定的host为NULL,则相当于指定的地址为回送地址
回送地址
回送地址(127.x.x.x) 是本机回送地址(Loopback Address),主要用于网络软件测试以及本 地机进程间通信,无论什么程序,一旦使用回送地址发送数据,立即返回,不进行任何网络传输。
构造举例

Socket client=new Socket(“127.0.0.1”,666)

成员方法:
public InputStream getInputStream() : 返回此套接字的输入流。 如果此Scoket具有相关联的通道,则生成的InputStream 的所有操作也关联该通道。 关闭生成的InputStream也将关闭相关的Socket。

public OutputStream getOutputStream() : 返回此套接字的输出流。 如果此Scoket具有相关联的通道,则生成的OutputStream 的所有操作也关联该通道。 关闭生成的OutputStream也将关闭相关的Socket

public void close() :关闭此套接字。 一旦一个socket被关闭,它不可再使用。 关闭此socket也将关闭相关的InputStream和OutputStream 。
public void shutdownOutput() : 禁用此套接字的输出流。 任何先前写出的数据将被发送,随后终止输出流。

ServerSocket类

public ServerSocket(int port) :使用该构造方法在创建ServerSocket对象时,就可以将其绑定到一个指 定的端口号上,参数port就是端口号
构造举例代码如下:

ServerSocket server=new ServerSocket(666)

成员方法 public Socket accept() :侦听并接受连接,返回一个新的Socket对象,用于和客户端实现通信。
两个需要明确的事情
1多个服务器端与客户进行交互,服务器必须明确是和哪个客户端进行交互,这个accept()方法用与获取请求的客户端对象
2.多个客户端同时与服务器进行交互就需要使用多个io流对象
服务器是没有io流的,服务器可以获取到请求的客户端对象的scoket,使用每一个客户端Socket中提供的io流对象进行交互。
服务器端使用客户端的字节输入流读取客户端发送的数据,
服务器端使用客户端的字节输出流给客户端回写数据
即服务器端使用客户端流与客户端交互
好比生活中的我请客你买单

简单的TCP网络程序图解

  1. 【服务端】启动,创建ServerSocket对象,等待连接。 Socket client = new Socket("127.0.0.1", 6666); ServerSocket server = new ServerSocket(6666);
  2. 【客户端】启动,创建Socket对象,请求连接。
  3. 【服务端】接收连接,调用accept方法,并返回一个Socket对象
  4. 【客户端】Socket对象,获取OutputStream,向服务端写出数据
  5. 【服务端】Scoket对象,获取InputStream,读取客户端发送的数据。
  6. 【服务端】Socket对象,获取OutputStream,向客户端回写数据。
  7. 【客户端】Scoket对象,获取InputStream,解析回写数据
  8. 【客户端】释放资源,断开连接。

该方法 会一直阻塞直到建立连接。

下面写一段简单的客户端与服务器端交互的代码

服务器端代码

package Socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
 public static void main(String[] args) throws IOException {
  System.out.println("服务器启动等待连接:");
  //创建服务器端对象
  ServerSocket serverSocket = new ServerSocket(8888);
  //使用accept方法接受socket对象
  Socket accept = serverSocket.accept();
  //通过socket获取输入流
  InputStream inputStream = accept.getInputStream();
  //会不会阻塞
  System.out.println("XXXXXXXXXXXXXXXXX");
  byte[] bytes = new byte[1024];
  int read = inputStream.read(bytes);
  //通过字节数组生成字符串
  String s = new String(bytes,0,read);
  //输出
  System.out.println(s);
  //向客户端返回信息
  OutputStream outputStream = accept.getOutputStream();
  //返回内容
  outputStream.write("内容已经收到".getBytes());
  //关闭资源
  inputStream.close();
  serverSocket.close();
 }
}

客户端代码

package Socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Client {
 public static void main(String[] args) throws IOException {
  //创建Socket对象
  Socket socket = new Socket("127.0.0.1", 8888);
  //获取输出流
  OutputStream outputStream = socket.getOutputStream();
  //给服务端发送消息
  outputStream.write("你好".getBytes());
  //创建输入流对象
  InputStream inputStream = socket.getInputStream();
  //创建读取的数组
  byte[] bytes = new byte[1024];
  //获取字节数组的长度
  int read = inputStream.read(bytes);
  //输出结果
  System.out.println(new String(bytes,0,read));
  //关闭流
  outputStream.close();
  //关闭Socket对象
  socket.close();
 }
}

结果

服务器端

客户端

以上就是Java中的TCP通信程序的一些基本操作,喜欢我的可以点赞收藏一波,我会不定期跟新文章,喜欢我的可以关注呀

到此这篇关于Java实现基于TCP的通讯程序实例解析的文章就介绍到这了,更多相关Java TCP通信程序内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • 本文详细介绍了如何使用PHP检测AJAX请求,通过分析预定义服务器变量来判断请求是否来自XMLHttpRequest。此方法简单实用,适用于各种Web开发场景。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • MQTT技术周报:硬件连接与协议解析
    本周开发笔记重点介绍了在新项目中使用MQTT协议进行硬件连接的技术细节,涵盖其特性、原理及实现步骤。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 邮件(带附件,模拟文件上传,跨服务器)发送核心代码1.测试邮件发送附件接口***测试邮件发送附件*@parammultipartFile*@return*@RequestMappi ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 本文探讨了在不使用服务器控件的情况下,如何通过多种方法获取并修改页面中的HTML元素值。除了常见的AJAX方式,还介绍了其他可行的技术方案。 ... [详细]
  • 解读MySQL查询执行计划的详细指南
    本文旨在帮助开发者和数据库管理员深入了解如何解读MySQL查询执行计划。通过详细的解析,您将掌握优化查询性能的关键技巧,了解各种访问类型和额外信息的含义。 ... [详细]
  • 掌握远程执行Linux脚本和命令的技巧
    本文将详细介绍如何利用Python的Paramiko库实现远程执行Linux脚本和命令,帮助读者快速掌握这一实用技能。通过具体的示例和详尽的解释,让初学者也能轻松上手。 ... [详细]
  • 本文详细分析了Hive在启动过程中遇到的权限拒绝错误,并提供了多种解决方案,包括调整文件权限、用户组设置以及环境变量配置等。 ... [详细]
  • 本文探讨了如何优化和正确配置Kafka Streams应用程序以确保准确的状态存储查询。通过调整配置参数和代码逻辑,可以有效解决数据不一致的问题。 ... [详细]
  • 解决MongoDB Compass远程连接问题
    本文记录了在使用阿里云服务器部署MongoDB后,通过MongoDB Compass进行远程连接时遇到的问题及解决方案。详细介绍了从防火墙配置到安全组设置的各个步骤,帮助读者顺利解决问题。 ... [详细]
author-avatar
承诺你的慌言_153
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有