Java 实现TCP网络编程

Java网络编程之Tcp实现多人聊天 网络编程 用Tcp实现多人聊天窗口 实现思路 具体思路: ​ 1、写一个server服务器,用于监听10001端口,以及处理接收和向客户端发出数据。 ​ 2、客户端寻找服务器的ip地址与服务器端口。建立连接。 ​ 3、每个客户端与服务器建立连接后,创建一个InputStream流和一个OutputStream流用于传输数据。 同时客户端将自己的用户信息对象通过ObejcetOutputStrea... 阅读详情

在TCP Socket编程中,客户端有多个,而服务器端只有一个,由客户端TCP向服务器端TCP发送连接请求,服务器端的ServerSocket实例则监听来自客户端的TCP连接请求,并为每个请求创建新的Socket实例
由于服务端在调用accept()等待客户端的连接请求时会阻塞,直到收到客户端发送的连接请求才会继续往下执行代码,因此要为每个Socket连接开启一个线程。服务器端要同时处理ServerSocket实例和Socket实例,而客户端只需要使用Socket实例。
另外,每个Socket实例会关联一个InputStream和OutputStream对象,通过OutputStream来发送数据,并通过从InputStream来接收数据。.
简单来说,使用TCP方式进行网络通讯时,需要建立专门的虚拟连接,然后进行可靠的数据传输,如果数据发送失败,则客户端会自动重发该数据
由于TCP需要建立专用的虚拟连接以及确认传输是否正确,所以使用TCP方式的速度稍微慢一些,而且传输时产生的数据量要比UDP稍微大一些。
在实际的网络编程中,一般重要的数据使用TCP方式进行数据传输,因为它能够确保接收方完全正确地获取发送方所发送的全部数据 。非重要的数据可以使用UDP方式传递。因为它是不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。

TCP建立链接的步骤

客户端向服务器端发送连接请求,被动地等待服务器的响应, 通过I/O流与服务端通信
服务端的建立一个通信终端,被动地等待客户端的连接。
当客户端向服务端发生连接请求后,服务端创建一个sockt实例,并为该实例创建一个新的线程,使用I/O 流与客户端进行通讯

TCP客户端创建步骤

  1. 创建一个Socket实例 指定远程主机的ip和端口,建立一个TCP连接
  2. 通过I/O流与服务端通信
  3. 当不需要连接的时候,使用Socket类的close来关闭连接

具体代码实现如下:

/**
     *
     * @param serverIp  服务端 IP
     * @param serverPort 服务端端口
     * @param msg 发生的消息
     * @throws IOException
     */
    public static void client(String serverIp, int serverPort, String msg) throws IOException {
        String response = null;
        //与端口进行连接
        Socket socket = new Socket(serverIp, serverPort);
        socket.setSoTimeout(5000);
        PrintStream out = new PrintStream(socket.getOutputStream());
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        out.println(msg);
        try {
            response = bufferedReader.readLine();
            System.out.println("接收到服务端消息:"+response);
        } catch (SocketTimeoutException e) {
            System.out.println("连接超时,无响应");
        }
        if (socket != null) {
            //如果构造函数建立起了连接,则关闭套接字,如果没有建立起连接,自然不用关闭
            socket.close(); //只关闭socket,其关联的输入输出流也会被关闭
        }
    }

TCP服务端创建步骤:

创建一个ServerSocket实例并指定本地端口,用来监听客户端在该端口发送的TCP连接请求
当接收客户端TCP 请求后

  1. 调用ServerSocket的accept()方法以获取客户端连接,并通过其返回值创建一个Socket实例
  2. 为返回的Socket实例开启新的线程,并使用Socket实例的I/O流与客户端通信
  3. 当通信结束,可以使用Socket的close()方法关闭该客户端连接

    当连接终止后,调用ServerSocket close 方法,关闭服务端
    具体实现代码:

/**
 * 这个类主要是为了用来创建Sockt 实例
 */
public class TcpServerThread implements Runnable {
    private Socket socketClient = null;
    String responseToClient = "你好客户端";

    public TcpServerThread(Socket socketClient) {
        this.socketClient = socketClient;
    }
    public void run() {
        try {
            //获取Socket的输出流,用来向客户端发送数据
            PrintStream out = new PrintStream(socketClient.getOutputStream());
            //获取Socket的输入流,用来接收从客户端发送过来的数据
            BufferedReader buf = new BufferedReader(new InputStreamReader(socketClient.getInputStream()));
            boolean flag = true;
            while (flag) {
                //接收从客户端发送过来的数据
                String str = buf.readLine();
                if (str == null || "".equals(str)) {
                    flag = false;
                } else {
                    //将接收到的字符串前面加上echo,发送到对应的客户端
                    System.out.println("接受到客户端消息客户端消息:" + str);
                    out.println(":" + responseToClient);
                }
            }
            out.close();
            socketClient.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 /**
     *
     * @param port 服务器端口
     * @throws Exception
     */
    public static void tcpServer(int port)throws  Exception{
        ServerSocket serverSocket =new ServerSocket(port);
        Socket socketClient=null;
        boolean flag=true;
        while (flag){
            socketClient=serverSocket.accept();
            System.out.println("与客户端连接成功");
            new Thread(new TcpServerThread(socketClient)).start();
        }
        serverSocket.close();
    }
手把手教你用Chrome DevTools逆向分析抖音a_bogus参数(附完整日志插桩方法) 本文详细介绍了如何使用Chrome DevTools逆向分析抖音a_bogus参数的生成逻辑,包括XHR断点定位、日志插桩追踪和加密核心逻辑解析。通过实战案例,帮助开发者掌握逆向工程技巧,应对抖音接口的动态加密变化,特别适合研究dy接口和a_bogus参数的技术人员。 阅读详情

相关推荐

R语言灰色关联分析法

输入数据并用DT包的datatable函数展示数据 ABDDEF分别对应第1到第6个供应商产品质量、技术水平、供应能力、经济效益、交货情况、市场影响度指标属于效益型指 产品价格、地理位置、售后服务指标属于成本型指标。现分别对上述指标进行规范化: 对于效益型指标(正项指标)标准化公式为: x∗=x−min(x)max(x)−min(x) x^{\ast}=\frac{x-min\left( x \right)}{max\left( x \right) -min\left( x \right)} x∗=max

qq_54423921的博客 7995

Java-Tcp通信,解决只能第一次接收到数据

今天老师让写一个服务端和客户端通信的小程序,本以为很快就能写完,但是在写的过程中却发现了自己很多的问题,所以写篇博客记录一下 写完测试的时候发现,客服端只能发第一次数据给服务端,后面发送的服务端都接受不到 //服务端 serverSocket=new ServerSocket(12900); socket=serverSocket.accept...

林北 6450

【Unity】Spine动态换装进阶:SkeletonGraphic插槽级皮肤切换与内存优化

本文深入探讨了Unity中Spine动态换装的进阶技术,重点解析了SkeletonGraphic插槽级皮肤切换的实现原理与内存优化策略。通过代码示例展示了如何高效管理皮肤实例、避免内存泄漏,并提供了对象池、纹理合并等性能优化方案,帮助开发者提升2D角色换装系统的运行效率与稳定性。

food6的博客 196

java 实现内网服务代理(mysql tcp请求)

使用Netty完成mysql、Tcp请求的代理

lswsmj的专栏 1383

Win10右键新建菜单丢了记事本?别慌!5分钟教你用注册表找回来(附权限设置避坑指南)

本文详细指导如何通过注册表编辑器恢复Win10右键新建菜单中丢失的记事本选项,包括重建键值结构、配置ShellNew项及设置权限等关键步骤。特别提供权限避坑指南,确保修改持久有效,帮助用户快速解决这一常见但困扰的问题。

weixin_31714129的博客 853

FPGA:UART串口接收(高干扰情况)

在上一篇文章中介绍过UART串口接收模块,其中一个需要优化的方向就是在高干扰情况下,如何实现可靠的UART串口接收任务。

weixin_50164178的博客 1671

---随笔--Java实现TCP通信(双端通信接收与发送)

设计一个基于最基本Socket的P2P“聊天软件”(文本互传),要求在同一个网关内可以通过任意常用端口建立会话并进行socket通讯、双向文本收发。

qq_41120902的博客 4714

Java对接快递鸟,查询快递物流信息

根据用户输入的订单号,我们的后台识别订单号并根据快递鸟查询快递API接口,实现自动查询的功能。下面是java版本的根据单号查询物流跟踪信息的详细示例代码。只需要下载就可以运行,(自己需要简单的修改)注:登录快递鸟用户管理后台后获得。登录快递鸟用户管理后台。

Roc的博客 956

java网络编程(一)使用TCP协议完成客户端与服务端的数据传递

java网络编程(一)使用TCP协议完成客户端与服务端的数据传递

不能说的秘密的博客 2万+

深入解析LinuxCNC源码:从界面开发到硬件交互

本文深入解析LinuxCNC开源数控系统的源码架构与二次开发实践。详细介绍了从GTK+界面定制、Python脚本绑定,到硬件抽象层(HAL)配置与核心运动控制模块的完整开发流程。通过实战案例,帮助开发者掌握如何基于LinuxCNC源码进行界面开发和硬件交互定制,实现个性化数控系统。

weixin_29164843的博客 540

咨询进阶——解读40页公司战略解码方法【附全文阅读】

战略解码是将企业战略转化为可执行计划的关键过程,强调垂直和水平一致性原则。通过KPI指标设计和目标分解,确保战略在各部门和岗位有效落地。解码过程包括战略澄清、目标牵引、绩效分解和承诺签订,输出战略解码图等文件。不同部门根据责任定位(如利润中心、绩效中心)采用差异化考核方式,实现战略有效执行。

cdfunlove的博客 148

[网络编程]通过java用TCP实现网络编程

1. ServerSocket ServerSocket是专门给服务器用的api 构造方法: 方法: 2. Socket 不管是客⼾端还是服务端Socket,都是双⽅建⽴连接以后,保存的对端信息,及⽤来与对⽅收发数据 的 构造方法: 方法: 服务器: 第一步: 创建对象 第二步: 实现start 2.1 首先要建立连接 这个ServerSocket的作用, 其实就是为了连接, 连接完成之后, 返回的是Socket对象, 接下来服务器进行的工作都是Socket完成的 调用start方法后, 如果没有客

m0_73992740的博客 1202

【网络与爬虫 44】Canvas指纹伪造技术:突破浏览器图形渲染检测的终极指南

Canvas和WebGL指纹是现代反爬虫系统中最难绕过的检测技术之一,它们通过分析浏览器图形渲染的细微差异来识别用户设备。本文将深入解析Canvas和WebGL指纹的工作原理,探讨其在反爬虫检测中的应用,并提供多种有效的伪造和绕过策略,帮助开发者理解并应对这些高级检测技术。

熵数实验室 1206

Java网络编程:TCP与UDP通信实现及网络编程基础

是Java中用于表示IP地址的类,提供了获取主机名、IP地址等网络信息的方法。UDP:无连接、速度快、不可靠,适用于实时通信(如视频、游戏);TCP:面向连接、可靠、速度较慢,适用于数据准确性要求高的场景(如文件传输、登录)。开发步骤上,UDP通过和实现数据报传输,TCP通过和Socket实现字节流传输。实际开发中,需根据业务需求选择协议,并注意资源释放(如关闭Socket)、并发处理(如线程池)等问题。

FUYY'S BLOG 1335

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

[网络编程]TCP和UDP的比较 及 通过java用UDP实现网络编程

前面我们知道, UDP是无连接的, 所以本身并没有存储对方的ip和端口信息, 但是上述我们用来接收数据的DatagramPacket中, 存放了客户端的ip和接口, 所以我们可以通过getSocketAddress()方法来获取到。我们现在只是进行一个简单的实现, 服务器收到客户端请求后, 无需做什么, 客户端请求啥, 直接响应啥, 这种程序, 就叫做"回显"(Echo)系统中的socket, 可以理解成是一种"文件", socket文件, 可以视为是"网卡"这种硬件设备的抽象表现形式。

m0_73992740的博客 1212

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【Java】网络编程TCP 实现聊天

网络编程TCP实现聊天的前提还需要掌握IO流,话不多说,直接上代码!!! 客户端: package com.kuang.lesson02; import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; //客户端 public class TcpClientDemo01 { public static void main(String[.

360°顺滑 803

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java网络编程,使用UDP实现TCP(一), 基本实现三次握手

首先我们需要知道TCP传输和UDP传输的区别,UDP相当于只管发送不管对方是否接收到了,而TCP相当于打电话,需要进行3次握手,4次挥手,所以我们就需要在应用层上做一些功能添加,如:增加ack机制增加seq机制增加超时重传机制增加MTU机制增加数据校验机制即可实现简单的用UDP实现TCP功能。

benaso的大学学习历程 1943

java网络编程——网络编程概述及UDP/TCP通信编程的实现

java网络编程——网络编程概述及UDP/TCP通信编程的实现

快乐学习,daydayup! 1082

Java实现TCP(socket)网络编程

Java实现TCP(socket)网络编程: 在Java中可以直接使用Socket实例化一个socket对象实现tcp协议,客户端和服务器端可通过Ip地址和端口在局域网中构建连接,并进行数据和文件的传输。 数据传输: //客户端 @Test public void client() { Socket socket = null; OutputStream os = null; try { //1.创建Socket对

m0_50654102的博客 1343

java 网络编程 聊天_Java 网络编程之 TCP 实现简单的聊天系统

客户端1、连接服务器 Socket2、发送消息package lesson02;import java.io.IOException;import java.io.OutputStream;import java.net.InetAddress;import java.net.Socket;/*** 客户端*/public class TcpClientDemo1 {public static v...

weixin_42211324的博客 419

java实现的基于TCP网络编程步骤

参考 java 程序设计教程(第二版)雍俊海老师编著的书12章 服务器端程序设计模型的建立通常由如下五个步骤组成: (1)在服务器端,首先要创建ServerSocket的实例对象,注册在服务器端进行连接的端口号以及允许连接的最大客户数目。 (2)调用ServerSocket的成员方法accept来等待并监听来自客户端的连接。当有客户端与改服务器端建立连接时,类ServerSocket的成员方

到底意难平 4500

Java网络编程:TCP实现群聊&私聊代码

Java网络编程:TCP实现群聊&私聊代码 和上一篇博客差不多,只不过是在群里的基础之上增加了私聊的功能,我们约定,私聊格式为:@xxx:msg 如何实现私聊呢,加入客户端c给服务器发送消息,服务器不再是把消息转发给所以除c以外的客户端,而是解析数据格式,转发给与name(“:”之前,“@”之后的字符串)有相同名字的客户端即可。 群聊功能与之前类似,这里不再说说明。 下面是所有类的代码: ...

qiaomm的个人博客 2517

Java实现网络编程(UDP,TCP协议)

简单在本机实现udp协议功能

m0_59278919的博客 932

Java网络编程(四) —— TCP实现数据传输

文章目录UDP和TCP进行java编程区别接口使用开启顺序数据形式TCP的通信流程与三次握手三次握手TCP连接客户端与服务端实现服务端代码客户端代码客户端发送给服务器并读取反馈数据总结 UDP和TCP进行java编程区别 接口使用 udp套接字使用DatagramSocket实现发送和接收。 而TCP中用socket套接字实现发送,用SeverSocket来接收,在TCP中叫客户端与服务端。 开启...

Charles Ren's Tech Blog 1421

网络编程 (UDP 和 TCP 介绍和代码实现) [Java EE]

本文主要介绍了网络编程中的 UDP 和 TCP 介绍, 比较和代码实现 [Java EE]

zjt_2002的博客 832

【Java网络编程】使用Tcp和Udp实现一个小型的回声客户端服务器程序

利用Java实现网络编程,编写一个小型的Udp和Tcp的回声客户端服务器程序。附带代码和详细的代码解释

yican2580的博客 2285
上一篇: UDP网络通讯(JAVA 实现)
下一篇: 基于线程池的TCP服务器(JAVA实现)
Sean_zzZ
博客等级 码龄10年 18粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值