JavaTCP通信程序

news2024/9/25 11:21:24

3 TCP通信程序

3.1 TCP通信原理

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

3.2 TCP发送数据

  • 发送数据的步骤
    • 1、创建客户端的Socket对象(Socket):Socket(String host, int port)
    • 2、获取输出流,写数据:OutputStream对象的getOutputStream()方法
    • 3、释放资源:void close()
  • 范例:
package test;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

public class ClientDemo {
    public static void main(String[] args) throws IOException {
        //1、创建客户端的Socket对象(Socket):Socket(String host, int port)
        Socket s = new Socket("127.0.0.1",1000);

        //2、获取输出流,写数据:OutputStream对象的getOutputStream()方法
        OutputStream os = s.getOutputStream();
        os.write("hello,java".getBytes());

        //3、释放资源:void close()
        s.close();
    }
}

3.3 TCP接收数据

  • 接收数据的步骤

    • 1、创建服务 器端的Socket对象(ServerSocket):ServerSocket(int port)
    • 2、监听客户端连接, 返回个Socket对象:Socket accept()
    • 3、获取输入流, 读数据,并把数据显示在控制台:InputStream对象的getInputStream()方法
    • 4、释放资源:void close()
  • 范例

package test;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class SeverDemo {
    public static void main(String[] args) throws IOException {
        //1、创建服务 器端的Socket对象(ServerSocket):ServerSocket(int port)
        ServerSocket ss = new ServerSocket(1000);

        //2、监听客户端连接, 返回个Socket对象:Socket accept()
        Socket s = ss.accept();

        //3、获取输入流, 读数据,并把数据显示在控制台:InputStream对象的getInputStream()方法
        InputStream is = s.getInputStream();
        byte[] bys = new byte[1014];
        int len = is.read(bys);
        String data = new String(bys,0,len);
        System.out.println(data);

        //4、释放资源:void close()
        s.close();
        ss.close();
    }
}

3.4 案例

3.4.1 练习一:服务器给出反馈

在这里插入图片描述

  • 客户端
package test;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class ClientDemo {
    public static void main(String[] args) throws IOException {
        //1、创建客户端的Socket对象(Socket):Socket(String host, int port)
        Socket s = new Socket("127.0.0.1",1000);

        //2、获取输出流,写数据:OutputStream对象的getOutputStream()方法
        OutputStream os = s.getOutputStream();
        os.write("hello,java".getBytes());

        //接收服务器反馈
        InputStream is = s.getInputStream();
        byte[] bys = new byte[1024];
        int len = is.read(bys);
        String data = new String(bys,0,len);
        System.out.println("客户端:"+data);

        //3、释放资源:void close()
        s.close();
        
        //客户端:数据已经收到
    }
}
  • 服务器
package test;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class SeverDemo {
    public static void main(String[] args) throws IOException {
        //1、创建服务 器端的Socket对象(ServerSocket):ServerSocket(int port)
        ServerSocket ss = new ServerSocket(1000);

        //2、监听客户端连接, 返回个Socket对象:Socket accept()
        Socket s = ss.accept();

        //3、获取输入流, 读数据,并把数据显示在控制台:InputStream对象的getInputStream()方法
        InputStream is = s.getInputStream();
        byte[] bys = new byte[1014];
        int len = is.read(bys);
        String data = new String(bys,0,len);
        System.out.println("服务器:"+data);

        //给出反馈
        OutputStream os = s.getOutputStream();
        os.write("数据已经收到".getBytes());

        //4、释放资源:void close()
        s.close();
        ss.close();

        //服务器:hello,java
    }
}

3.4.2 练习二:客户端数据来源于键盘录入

在这里插入图片描述

  • 客户端
package test;

import java.io.*;
import java.net.Socket;

public class ClientDemo {
    public static void main(String[] args) throws IOException {
        //创建客户端的Socket对象(Socket):Socket(String host, int port)
        Socket s = new Socket("127.0.0.1",1000);

        //数据来源于键盘录入,直到886停止
        System.out.println("请输入数据");
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        //封装输出流对象
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        String line;
        while((line= br.readLine())!=null) {
            if("886".equals(line)) {
                break;
            }

            //获取输出流对象
            bw.write(line);
            bw.newLine();
            bw.flush();
        }

        //释放资源
        s.close();

//        hello
//        886
    }
}
  • 服务器
package test;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class SeverDemo {
    public static void main(String[] args) throws IOException {
        //1、创建服务 器端的Socket对象(ServerSocket):ServerSocket(int port)
        ServerSocket ss = new ServerSocket(1000);

        //2、监听客户端连接, 返回个Socket对象:Socket accept()
        Socket s = ss.accept();

        //3、获取输入流, 读数据,并把数据显示在控制台:InputStream对象的getInputStream()方法
//        InputStream is = s.getInputStream();
//        InputStreamReader isr = new InputStreamReader(is);
//        BufferedReader br = new BufferedReader(isr);
        BufferedReader br  = new BufferedReader(new InputStreamReader(s.getInputStream()));
        String line;
        while((line=br.readLine())!=null) {
            System.out.println(line);
        }


        //4、释放资源:void close()
        s.close();
        //hello
    }
}

3.4.3 练习三:服务器数据写入文本文件

在这里插入图片描述

  • 服务器
package test;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class SeverDemo {
    public static void main(String[] args) throws IOException {
        //1、创建服务 器端的Socket对象(ServerSocket):ServerSocket(int port)
        ServerSocket ss = new ServerSocket(1000);

        //2、监听客户端连接, 返回个Socket对象:Socket accept()
        Socket s = ss.accept();

        //3、获取输入流, 读数据,并把数据显示在控制台:InputStream对象的getInputStream()方法
        BufferedReader br  = new BufferedReader(new InputStreamReader(s.getInputStream()));
        //把数据写入文本文件
        BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\test\\java.txt"));

        String line;
        while((line=br.readLine())!=null) {
            bw.write(line);
            bw.newLine();
            bw.flush();
        }


        //4、释放资源:void close()
        bw.close();
        ss.close();
        //文件中数据:hello
    }
}

3.4.4 练习四:客户端数据来源于文本文件

在这里插入图片描述

  • 客户端
package test;

import java.io.*;
import java.net.Socket;

public class ClientDemo {
    public static void main(String[] args) throws IOException {
        //创建客户端的Socket对象(Socket):Socket(String host, int port)
        Socket s = new Socket("127.0.0.1",1000);

        //封装文本文件数据
        BufferedReader br  =new BufferedReader(new FileReader("E:\\test\\fos.txt"));
        //封装输出流对象
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        String line;
        while((line= br.readLine())!=null) {
            //获取输出流对象
            bw.write(line);
            bw.newLine();
            bw.flush();
        }

        //释放资源
        br.close();
        s.close();
    }
}

3.4.5 练习五:上传文件服务器给出反馈

![在这里插入图片描述](https://img-blog.csdnimg.cn/5505

  • 客户端
package test;

import java.io.*;
import java.net.Socket;

public class ClientDemo {
    public static void main(String[] args) throws IOException {
        //创建客户端的Socket对象(Socket):Socket(String host, int port)
        Socket s = new Socket("127.0.0.1",1000);

        //封装文本文件数据
        BufferedReader br  =new BufferedReader(new FileReader("E:\\test\\fos.txt"));
        //封装输出流对象
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        String line;
        while((line= br.readLine())!=null) {
            //获取输出流对象
            bw.write(line);
            bw.newLine();
            bw.flush();
        }

//        //自定义结束标记
//        bw.write("886");
//        bw.newLine();
//        bw.flush();
        s.shutdownOutput();//Socket类中方法:表示输出结束

        //接收反馈
        BufferedReader brClient = new BufferedReader(new InputStreamReader(s.getInputStream()));
        String data = brClient.readLine(); //等待读取数据
        System.out.println("服务器的反馈:"+data); //服务器的反馈:文件上传成功

        //释放资源
        br.close();
        s.close();
    }
}
  • 服务端
package test;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class SeverDemo {
    public static void main(String[] args) throws IOException {
        //1、创建服务 器端的Socket对象(ServerSocket):ServerSocket(int port)
        ServerSocket ss = new ServerSocket(1000);

        //2、监听客户端连接, 返回个Socket对象:Socket accept()
        Socket s = ss.accept();

        //3、获取输入流, 读数据,并把数据显示在控制台:InputStream对象的getInputStream()方法
        BufferedReader br  = new BufferedReader(new InputStreamReader(s.getInputStream()));
        //把数据写入文本文件
        BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\test\\java.txt"));

        String line;
        while((line=br.readLine())!=null) { //等待读取数据
//            if("886".equals(line)) {
//                break;
//            }
            bw.write(line);
            bw.newLine();
            bw.flush();
        }

        //给出反馈
        BufferedWriter bwServer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        bwServer.write("文件上传成功");
        bwServer.newLine();
        bwServer.flush();

        //4、释放资源:void close()
        bw.close();
        ss.close();
    }
}

3.4.6 练习六:多线程实现文件上传

在这里插入图片描述

  • 服务端
package test;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class SeverDemo {
    public static void main(String[] args) throws IOException {
        //创建服务 器端的Socket对象(ServerSocket):ServerSocket(int port)
        ServerSocket ss = new ServerSocket(1000);

        while(true) {
            //监听客户端连接, 返回个Socket对象:Socket accept()
            Socket s = ss.accept();
            //为每一个客户端开启一个线程
            new Thread(new ServerThread(s)).start();
        }
    }
}
  • 服务端多线程
package test;

import java.io.*;
import java.net.Socket;

public class ServerThread implements Runnable {
    private Socket s;
    public ServerThread(Socket s) {
        this.s = s;
    }

    @Override
    public void run() {
        try {
            //接收数据写入文本文件
            BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
//            BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\test\\java.txt"));
            //解决名称冲突问题,上传到不同文件中
            int count = 0;
            File file = new File("E:\\test\\["+count+"]java.txt");
            while(file.exists()) {
                count++;
                file = new File("E:\\test\\["+count+"]java.txt");
            }
            BufferedWriter bw = new BufferedWriter(new FileWriter(file));
            
            String line;
            while ((line=br.readLine()) != null) {
                bw.write(line);
                bw.newLine();
                bw.flush();
            }

            //给出反馈
            BufferedWriter bwSever  =new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
            bwSever.write("文件上传成功");
            bwSever.newLine();
            bwSever.flush();

            //释放资源
            s.close();

        }catch (IOException e) {
            e.printStackTrace();
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/367421.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python3.11.2安装 + pycharm安装

下载 :https://www.python.org/ 2.双击下载的软件: 3.进入安装界面 下一步,点击 是 上一步点击后就看到如下: 安装成功了,接下来检测一下:cmd 安装pycharm PyCharm是一种Python IDE(Integr…

office三件套与mathtype的安装和导入word

0. 前言 网上大部分说的不够具体,说的比较具体的就是下面这篇文章,但关键他路径还是错的。 MathType如何导入word 可能因为他是32位系统,所以office中某些路径和设置不一样,下文中一一指出。 mathtype导入word0. 前言1. 安装1.…

springboot整合springdata jpa全能书

一:spring data jpa介绍 spring data:其实spring data就是spring提供了一个操作数据的框架。而spirng data jpa只是spring data框架下的一个基于jpa标准操作数据的模块。 spring data jpa:基于jpa的标准对数据进行操作。简化操作持久层的代码。只需要编…

GEE学习笔记 五十二:Google Earth Studio初体验

Google Earth Studio出来一段时间了,自己也体验了一番。这里做一个简单的体验总结,为那些还没有体验过的小伙伴展示一下Google Earth Sutdio究竟长什么样子,能做什么? 注:这篇文章营养价值不大,纯粹是展示…

京东测开岗3+1面经+经验分享,拿到offer,月薪34k....

现在,招聘黄金时间已经来临,在网上看了很多大佬的面经,也加了很多交流群,受到了很多朋友的提点,今天终于轮到我来分享面经啦,之前面试了几家公司,最后拿到了京东测试岗的 offer,这里…

【机器学习、深度学习】损失函数

1.什么是损失函数 ​ 损失函数(Loss Function)又叫做误差函数,用来衡量算法拟合数据的好坏程度,评价模型的预测值与真实值的不一致程度,是一个非负实值函数,通常使用L(Y, f(x))​来表示&#xff0…

canvas初学1

前端数据可视化方案&#xff1a; 一、canvas绘制直线 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewpor…

CentOS 8利用Apache安装部署文件服务器

1&#xff1a;部署的目的是做一个类似下面开源镜像网站&#xff0c;把一些软件或者资料上传到服务器上面&#xff0c;减少用户在互联网上下载资料&#xff0c;提高效率&#xff0c;减少病毒。 2&#xff1a;使用下面的命令配置本机的IP地址主机名等信息。后期使用IP地址进行访问…

任意网络环境实现外网访问分销ERP

随着企业业务的不断扩展&#xff0c;经营网点遍布全国不同的区域&#xff0c;传统的管理手段存在诸多问题&#xff0c;无法实时监控各地分公司、办事处及营业网点的经营状况&#xff1b;订货、销售、库存等数据和信息反馈不及时&#xff0c;商品积压、缺货情况经常出现&#xf…

软件项目管理知识回顾---软件项目进度管理

软件项目进度管理 4.进度管理 4.1进度管理 1.概念&#xff1a;按时保质的完成任务 2.目的&#xff1a;按时完成任务&#xff0c;合理分配资源&#xff0c;发挥最佳的工作效率 3.活动&#xff1a;工作包分解出的进度活动 4.内容&#xff1a;项目进度计划的指定和项目进度计划的执…

一篇了解分布式id生成方案

系统唯一ID是我们在设计一个系统的时候常常会遇见的问题&#xff0c;也常常为这个问题而纠结。生成ID的方法有很多&#xff0c;适应不同的场景、需求以及性能要求。所以有些比较复杂的系统会有多个ID生成的策略。下面就介绍一些常见的ID生成策略。 1.数据库自增长序列或字段 …

BabylonJS之放烟花

BabylonJS烟花效果视频一&#xff1a; 技术调研 1. 方案一&#xff1a;ParticleSystem 用ParticleSystem来实现每一束的烟花效果&#xff0c;如果浏览器支持WebGL2功能&#xff0c;使用GPUParticleSystem性能会有极大的提升。 优点&#xff1a; 烟花效果易实现且效果好。 缺点…

什么是品牌营销?学会正确推广您的业务

什么是品牌营销&#xff1f; 品牌营销涉及长期战略规划&#xff0c;以推广整个品牌&#xff0c;而不是营销单个产品或服务。它分享了一个引人入胜的故事&#xff0c;以在潜在客户中产生品牌知名度并建立声誉。 面向消费者的品牌使用品牌智能软件来了解人们对其品牌的看法&#…

磨金石教育摄影技能干货分享|极简艺术与人文摄影相结合(一)

柏林街头&#xff08;德国&#xff09;照片中无论是景物元素还是色彩元素都很少&#xff0c;主体人物与道路外加一个箱子。极简艺术照片的减法做到了。一名女子端坐在路边&#xff0c;白色的衣服一尘不染&#xff0c;手持镜子补妆。虽然时间场地比较的随意&#xff0c;但是依然…

R统计绘图 | 物种组成冲积图(绝对/相对丰度,ggalluvial)

一、数据准备 数据使用的不同处理土壤样品的微生物组成数据&#xff0c;包含物种丰度&#xff0c;分类单元和样本分组数据。此数据为虚构&#xff0c;可用于练习&#xff0c;请不要作他用。 # 1.1 设置工作路径 #knitr::opts_knit$set(root.dir"D:\\EnvStat\\PCA")#…

A/B 测试成为企业“新窗口”:增长盈利告别经验主义,数据科学才是未来

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 如何能够预知一个产品的未来&#xff1f;最好的办法当然是穿越到未来看一看。 这种“模拟未来、窥探底牌”的设想似乎只是一种天方夜谭。尤其在数字化浪潮冲击下&a…

磨金石教育摄影技能干货分享|杨元惺佳作欣赏——诗意人文

一般来说&#xff0c;人文摄影总会体现现实性多些。但杨老师是个摄影诗人&#xff0c;他的内心总能将刻板的现实融入美好的光芒。你在他的照片里&#xff0c;看着现实的摄影素材&#xff0c;所感受到的是诗意的绵绵未尽。春网&#xff08;中国&#xff09;正所谓春水碧于天&…

Word控件Spire.Doc 【Table】教程(19):在 C# 中的 Word 中添加/获取表格的替代文本

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

7、STM32 FSMC驱动SRAM

本次使用CubeMx配置FSMC驱动SRAM,XM8A51216 IS62WV51216 原理图&#xff1a; 注意&#xff1a;FSMC_A0必须对应外部设备A0引脚 一、FSMC和FMC区别 FSMC&#xff1a;灵活的静态存储控制器 FMC:灵活存储控制器 区别&#xff1a;FSMC只能驱动静态存储控制器&#xff08;如&…

软考中级有用吗

当然有用了&#xff01; 软考“简历”&#xff1a;计算机软件资格考试在全国范围内已经实施了二十多年&#xff0c;近十年来,考试规模持续增长&#xff0c;截止目前,累计报考人数约有五百万人。该考试由于其权威性和严肃性&#xff0c;得到了社会各界及用人单位的广泛认同&…