爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      TCP网络通信编程+netstat

      首页 知识中心 软件开发 文章详情页

      TCP网络通信编程+netstat

      2023-06-07 07:32:02 阅读次数:458

      TCP,服务端,网络编程

      1. TCP网络通信编程 例题接上

      2. 应用案例 4   671-672-673

      1.编写一个服务端,和一个客户端

      2.服务器端在8888端口监听

      3.客户端连接到服务端,发送一张图片e:\\guidao.jpg

      4.服务器端接收到客户端发送的图片,保存到src下,发送"收到图片"再退出

      5.客户端接收到服务端发送的"收到图片”,再退出

      6.该程序要求使用StreamUtils.java,我们直接使用

      TCP网络通信编程+netstat

      代码在com.stulzl.socket_04.包中

      服务端TCPFileUploadServer

      package com.stulzl.socket_04;
      
      import java.io.*;
      import java.net.ServerSocket;
      import java.net.Socket;
      
      //文件上传服务端  672-673
      //1.编写一个服务端,和一个客户端
      //2.服务器端在8888端口监听
      //3.客户端连接到服务端,发送一张图片e:\\guidao2.jpg
      //4.服务器端接收到客户端发送的图片,保存到src下,发送"收到图片"再退出
      //5.客户端接收到服务端发送的"收到图片”,再退出
      //6.该程序要求使用StreamUtils.java,我们直接使用
      public class TCPFileUploadServer {
          public static void main(String[] args) throws Exception {
              //服务端在监听8888端口
              ServerSocket serverSocket = new ServerSocket(8888);
              System.out.println("服务端在8888端口监听……");
              //等待连接
              Socket socket = serverSocket.accept();
      
              //3. 读取客户端发送的数据
              //   通过Socket得到输入流
              BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
              //使用工具类得到客户端发来的数组数据信息
              byte[] bytes = StreamUtils.streamToByteArray(bis);
      
              //4. 将得到 bytes 数组,写入到指定的路径,就得到一个文件了
              String destFilePath = "src\\guidao2.jpg";
              BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFilePath));
              bos.write(bytes);
      
              //向客户端回复收到图片
              //通过Socket获取输出流(使用字符流)
              BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
              bfw.write("收到图片");
              bfw.flush();//将数据刷新到数据通道
              socket.shutdownOutput();//结束标记
      
              //关闭
              bfw.close();
              bos.close();
              bis.close();
              serverSocket.close();
              socket.close();
          }
      }

      客户端TCPFileUploadClient

      package com.stulzl.socket_04;
      
      import java.io.*;
      import java.net.InetAddress;
      import java.net.Socket;
      
      //文件上传的客户端  672-673
      public class TCPFileUploadClient {
          public static void main(String[] args) throws Exception {
              //客户端连接服务端8888,的到Socket对象
              Socket socket = new Socket(InetAddress.getLocalHost(),8888);
              //创建读取磁盘文件的输入流
              String filePath = "e:\\guidao.jpg";
              BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filePath));
      
              //使用提供好的工具类
              //将图片数据放入bytes数组中
              byte[] bytes = StreamUtils.streamToByteArray(bis);
      
              //通过socket获取到输出流, 将bytes数据发送给服务端
              //将outputStream输出流转成BufferedOutputStream,目的是为了方便点
              BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
              bos.write(bytes);//将文件对应的字节数据数组内容,写入数据通道
              bis.close();//关闭
              socket.shutdownOutput();//设置结束标记
      
              //接收从服务端回复的消息
              InputStream inputStream = socket.getInputStream();
              //使用工具类StreamUtils 的方法,直接将 inputStream 读取到的内容 转成字符串
              String s = StreamUtils.streamToString(inputStream);
              System.out.println(s);//输出
      
              bos.close();
              socket.close();
          }
      }

      工具类StreamUtils

      package com.stulzl.socket_04;
      
      import java.io.BufferedReader;
      import java.io.ByteArrayOutputStream;
      import java.io.IOException;
      import java.io.InputStream;
      import java.io.InputStreamReader;
      
      /**
       * 此类用于演示关于流的读写方法
       *
       */
      public class StreamUtils {
      	/**
      	 * 功能:将输入流转换成byte[], 即可以把文件的内容读入到byte[]
      	 * @param is
      	 * @return
      	 * @throws Exception
      	 */
      	public static byte[] streamToByteArray(InputStream is) throws Exception{
      		ByteArrayOutputStream bos = new ByteArrayOutputStream();//创建输出流对象
      		byte[] b = new byte[1024];//字节数组
      		int len;
      		while((len=is.read(b))!=-1){//循环读取
      			bos.write(b, 0, len);//把读取到的数据,写入bos	
      		}
      		byte[] array = bos.toByteArray();//然后将bos 转成字节数组
      		bos.close();
      		return array;
      	}
      	/**
      	 * 功能:将InputStream转换成String
      	 * @param is
      	 * @return
      	 * @throws Exception
      	 */
      	
      	public static String streamToString(InputStream is) throws Exception{
      		BufferedReader reader = new BufferedReader(new InputStreamReader(is));
      		StringBuilder builder= new StringBuilder();
      		String line;
      		while((line=reader.readLine())!=null){//当读取到孔氏就表示结束
      			builder.append(line+"\r\n");
      		}
      		return builder.toString();
      		
      	}
      
      }

      3. netstat 指令  674

      1. netstat -an可以查看当前主机网络情况,包括端口监听情况和网络连接情况

      2. netstat -an | more可以分页显示

      3.要求在dos控制台下执行快捷键win+r

      说明: 

      (1) Listening表示某个端口在监听

      (2)如果有一个外部程序(客户端)连接到该端口,就会显示一条连接信息

      (3)可以输入ctrl + C退出指令

      TCP网络通信编程+netstat

      4. TCP 网络通讯不为人知的秘密  675

      1.当客户端连接到服务端后,实际上客户端也是通过一个端口和服务端进行通讯的,这个端口是TCP/IP来分配的,是不确定的,是随机的.(这句话的意思是在客户端和服务端通信时不光服务端会有端口,在客户端其实也会产生一个端口用来通信)

      5. UDP 网络通信编程[了解]  676

      5.1 基本介绍  676

      1.类DatagramSocket和DatagramPacket[数据包/数据报]实现了基于UDP协议网络程序。

      2. UDP数据报通过数据报套接字DatagramSocket发送和接收,系统不保证UDP数据报一定能够安全送到目的地, 也不能确定什么时候可以抵达。

      3. DatagramPacket对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号。

      4. UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的连接

      5.2 基本流程  676

      1.核心的两个类/对象DatagramSocket与DatagramPacket

      2.建立发送端,接收端(没有服务端和客户端概念)

      3.发送数据前,建立数据包/报DatagramPacket对象

      4.调用DatagramSocket的发送、 接收方法

      5.关闭DatagramSocket 

      TCP网络通信编程+netstat

      TCP网络通信编程+netstat

      5.3 应用案例 

      1.编写一个接收端A,和一个发送端B

      2.接收端A在9999端口等待接收数据(receive)

      3.发送端B向接收端A发送数据"hello,明天吃火锅~”

      4.接收端A接收到发送端B发送的数据,回复"好的,明天见",再退出

      5.发送端接收回复的数据,再退出

      TCP网络通信编程+netstat

      代码在com.stulzl.udp_.包中

      发送端UDPSenderB

      package com.stulzl.udp_;
      
      import java.io.IOException;
      import java.net.*;
      
      //发送端       677-678
      //1.编写一个接收端A,和一个发送端B
      //2.接收端A在9999端口等待接收数据(receive)
      //3.发送端B向接收端A发送数据"hello,明天吃火锅~”
      //4.接收端A接收到发送端B发送的数据,回复"好的,明天见",再退出
      //5.发送端接收回复的数据,再退出
      public class UDPSenderB {
          public static void main(String[] args) throws IOException {
              //创建DatagramSocket对象,准备9998端口发送和接收数据
              DatagramSocket socket = new DatagramSocket(9998);
      
              //将需要发送的数据,封装到DatagramPacket对象
              byte[] data = "hello 明天吃火锅".getBytes();//getBytes()将字符串转成字节数组
              //解释为什么不使用InetAddress.getLocalHost()找主机地址,因为InetAddress.getLocalHost()
              //主要是给自己的电脑发,但是一般情况下我们是给别的主机发送数据所以
              // 使用InetAddress.getByName("192.168.1.8")方法  192.168.1.8主机ip
              //这里调用的是发送构造器
              DatagramPacket packet = new
                      DatagramPacket(data, data.length,InetAddress.getByName("192.168.1.8") , 9999);
              //发送
              socket.send(packet);
      
              //接收A发来的数据
              byte[] br = new byte[1024];//缓冲数组
              DatagramPacket packet1 = new DatagramPacket(br, br.length);//这里调用的是接收构造器
              socket.receive(packet1);//接收
              //对接收的数据进行拆包
              int length = packet1.getLength();//实际接收的数据长度
              byte[] data2 = packet1.getData();//取出数据
              String s = new String(data2,0,length);//将字节数组编程字符串
              System.out.println(s);//输出
      
      
              //关闭
              socket.close();
              System.out.println("B端退出……");
          }
      }

      接收端UDPReceiverA

      package com.stulzl.udp_;
      
      import javax.swing.*;
      import java.io.IOException;
      import java.net.DatagramPacket;
      import java.net.DatagramSocket;
      import java.net.InetAddress;
      import java.net.SocketException;
      
      //接收端  677-678
      public class UDPReceiverA {
          public static void main(String[] args) throws IOException {
              //创建一个DatagramSocket对象,准备在9999端口接收数据
              DatagramSocket socket = new DatagramSocket(9999);
              //构建一个DatagramPacket对象,准备接收数据,UDP协议数据包最大64k
              byte[] buf = new byte[1024];//缓冲数组
              DatagramPacket packet = new DatagramPacket(buf,buf.length);//这里调用的是接收构造器
      
              //调用接收方法,通过网络传输的DatagramPacket对象填充到packet对象
              //提示: 当有数据包发送到 本机的 9999 端口时,就会接收到数据
              //如果没有数据包发送到 本机的 9999 端口, 就会阻塞等待
              System.out.println("接收端 A 等待接收数据..");
              socket.receive(packet);
      
              //可是把packet进行拆包,取出数据并显示
              int length = packet.getLength();//实际接收到的数据字节长度
              byte[] data = packet.getData();//取出数据
              String s = new String(data,0,length);//将字节数组编程字符串
              System.out.println(s);//输出
      
      
              //给B发送”好的,明天见“
              byte[] brr ="好的,明天见".getBytes();
              //这里调用的是发送构造器
              DatagramPacket packet1 = new
                      DatagramPacket(brr, brr.length, InetAddress.getByName("192.168.1.8"), 9998);
              socket.send(packet1);//发送数据
      
              //关闭
              socket.close();
              System.out.println("A端退出……");
          }
      }

      6. 练习1  679

      (1) 使用字符流的方式, 编写一个客户端程序和服务器端程序,

      (2)客户端发送"name",服务器端接收到后,返回"我是nova ",nova是你自己的名字.

      (3) 客户端发送 "hobby",服务器端接收到后,返回”编写java程序

      (4)不是这两个问题,回复"你说啥呢"

      代码在com.stulzl.exercise01.包中

      服务端Exercise01Server

      package com.stulzl.exercise01;
      
      
      import java.io.*;
      import java.net.ServerSocket;
      import java.net.Socket;
      
      //服务端  679
      //(1) 使用字符流的方式, 编写一个客户端程序和服务器端程序,
      //(2) 客户端发送"name",服务器端接收到后,返回"我是nova ",nova是你自己的名字.
      //(3) 客户端发送 "hobby",服务器端接收到后,返回”编写java程序
      //(4) 不是这两个问题,回复"你说啥呢"
      public class Exercise01Server {
          public static void main(String[] args) throws IOException {
              //找到9999端口
              ServerSocket serverSocket = new ServerSocket(9999);
              System.out.println("在9999端口监听,等待连接……");
              //等待连接
              Socket socket = serverSocket.accept();
              //IO读取客户端发来的信息,读取客户端写入数据通道的数据
              InputStream inputStream = socket.getInputStream();
              //使用字符流读取  InputStreamReader转换流将字节流转为字符流
              BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
              String s = bufferedReader.readLine();//读到数据
              String answer ="";
              if("name".equals(s)){
                  answer = "我是nova";
              }else if("hobby".equals(s)){
                  answer = "编写java程序";
              }else{
                  answer = "你在说什么";
              }
              OutputStream outputStream = socket.getOutputStream();
              //使用字符流的方式恢复信息
              BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
              bufferedWriter.write(answer);
              bufferedWriter.newLine();//插入一个换行符表示写入内容结束
              bufferedWriter.flush();//刷新
      
              System.out.println("服务端退出……");
      
              //关闭
              serverSocket.close();
              socket.close();
              bufferedReader.close();
              bufferedWriter.close();
          }
      }

      客户端Exercise01Client 

      package com.stulzl.exercise01;
      
      
      import java.io.*;
      import java.net.InetAddress;
      import java.net.Socket;
      import java.util.Scanner;
      
      //客户端 679
      public class Exercise01Client {
          public static void main(String[] args) throws IOException {
              //连接9999端口
              Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
              OutputStream outputStream = socket.getOutputStream();
              //通过输出流,写入数据到 数据通道  使用字符流  OutputStreamWriter字节流转换为字符流
              BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
              //从键盘或用户的问题
              Scanner scanner = new Scanner(System.in);
              System.out.println("请输入你的问题");
              String question = scanner.next();
              bufferedWriter.write(question);
              bufferedWriter.newLine();//插入一个换行符表示写入内容结束,使用newLine()也要求对方使用readLine()来读
              bufferedWriter.flush();//使用字符流必须手动刷新,否则数据不会写入数据通道
              //接收服务端的返回信息
              InputStream inputStream = socket.getInputStream();
              //使用字符流读取数据
              BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
              String s = bufferedReader.readLine();
              System.out.println(s);
      
              System.out.println("客户端关闭……");
      
              //关闭
              socket.close();
              bufferedReader.close();
              bufferedWriter.close();
      
          }
      }

      7. 练习2  680

      (1)编写一个接收端A,和一个发送端B, 使用UDP协议完成

      (2)接收端在8888端口等待接收数据(receive)

      (3)发送端向接收端发送数据"四大名著是哪些”

      (4)接收端接收到发送端发送的问题后,返回"四大名著是<<红楼梦>> ..否则返回what?

      (5)接收端和发送端程序退出

      代码在com.stulzl.exercise02.包中

      发送端Exercise02SenderB

      package com.stulzl.exercise02;
      
      import java.io.IOException;
      import java.net.*;
      import java.util.Scanner;
      
      //发送端  680
      public class Exercise02SenderB {
          public static void main(String[] args) throws IOException {
              //创建一个DatagramSocket对象,在8889端口发送
              DatagramSocket socket = new DatagramSocket(8889);
              Scanner scanner = new Scanner(System.in);
              System.out.println("请输入问题:");
              String question = scanner.next();
              byte[] buf =question.getBytes();//转成字节数组
              //调用发送数据构造器
              DatagramPacket packet = new
                      DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.1.8"), 8888);
              socket.send(packet);//发送
      
              //接收返回信息
              //调用接收构造器
              byte[] banswer = new byte[1024];//缓冲
              DatagramPacket packet2 = new DatagramPacket(banswer, banswer.length);
              socket.receive(packet2);//接收数据
              //将接收的数据拆包
              int length = packet2.getLength();//实际得到的数据长度
              byte[] data = packet2.getData();//实际得到的数据
              String s = new String(data, 0, length);//转成字符串
              System.out.println(s);//输出
      
              //关闭
              socket.close();
              System.out.println("发送端退出……");
          }
      }

      接收端Exercise02ReceiverA

      package com.stulzl.exercise02;
      
      
      import java.io.IOException;
      import java.net.DatagramPacket;
      import java.net.DatagramSocket;
      import java.net.InetAddress;
      import java.net.SocketException;
      
      //接收端  680
      //(1)编写一个接收端A,和一个发送端B, 使用UDP协议完成
      //(2)接收端在8888端口等待接收数据(receive)
      //(3)发送端向接收端发送数据"四大名著是哪些”
      //(4)接收端接收到发送端发送的问题后,返回"四大名著是<<红楼梦>> ..否则返回what?
      //(5)接收端和发送端程序退出
      public class Exercise02ReceiverA {
          public static void main(String[] args) throws IOException {
              //创建一个DatagramSocket对象,在8888端口接收
              DatagramSocket socket = new DatagramSocket(8888);
              byte[] buf = new byte[1024];//缓冲数组
              //调用接收构造器
              DatagramPacket packet = new DatagramPacket(buf, buf.length);
              socket.receive(packet);//接收数据
              //将接收的数据拆包
              int length = packet.getLength();//实际得到的数据长度
              byte[] data = packet.getData();//实际得到的数据
              String s = new String(data, 0, length);//转成字符串
              String answer = "";
              if("四大名著是哪些".equals(s)){
                  answer = "四大名著是:三国演义,西游记,水浒传,红楼梦";
              }else{
                  answer = "what?";
              }
              //将数据答案发送出去
              byte[] bAnswer = answer.getBytes();//将字符串转成字节数组
              //调用发送数据的构造器
              DatagramPacket packet1 = new
                      DatagramPacket(bAnswer, bAnswer.length, InetAddress.getByName("192.168.1.8"), 8889);
              socket.send(packet1);
      
              //关闭
              socket.close();
              System.out.println("接收端退出……");
      
          }
      }

      8. 练习3   681-682

      (1)编写客户端程序和服务器端程序

      (2)客户端可以输入一个音乐文件名,比如高山流水,服务端收到音乐名后,可以给客户端返回这个音乐文件,如果服务器没有这个文件,返回一个默认的音乐即可.

      (3)客户端收到文件后,保存到本地e:\\

      (4)提示:该程序可以使用StreamUtils.java

      TCP网络通信编程+netstat

      代码在com.stulzl.exercise03.包中

      服务端Exercise03Server

      package com.stulzl.exercise03;
      
      import java.io.*;
      import java.net.ServerSocket;
      import java.net.Socket;
      
      //服务端   681-682
      //(1)编写客户端程序和服务器端程序
      //(2)客户端可以输入一个音乐文件名,比如高山流水,服务端收到音乐名后,
      // 可以给客户端返回这个音乐文件,如果服务器没有这个文件,返回一个默认的音乐即可.
      //(3)客户端收到文件后,保存到本地e:\\
      //(4)提示:该程序可以使用StreamUtils.java
      public class Exercise03Server {
          public static void main(String[] args) throws Exception {
              //监听9999端口
              ServerSocket serverSocket = new ServerSocket(9999);
              System.out.println("服务端在9999端口监听,等待下载文件……");
              //等待连接
              Socket socket = serverSocket.accept();
              //读取客户端发来的文件名
              InputStream inputStream = socket.getInputStream();
              byte[] b = new byte[1024];//缓冲字节数组
              int readLen = 0;
              String downLoadFile = "";//保存文件名
              //循环读取
              while((readLen = inputStream.read(b))!=-1){
                  downLoadFile += new String(b,0,readLen);//+=是为了防止文件名过长,起到拼接文件名的作用
              }
              System.out.println("客户端希望下载的文件名="+downLoadFile);
      
              //在服务器上有两个文件, 无名.mp3 高山流水.mp3
              //如果客户下载的是 高山流水 我们就返回该文件,否则一律返回 无名.mp3
              String resFileName = "";
              if("高山流水".equals(downLoadFile)){
                  resFileName = "src\\高山流水.mp3";
              }else{
                  resFileName = "src\\无名.mp3";
              }
              //创建一个输入流,读取文件
              BufferedInputStream bis =
                      new BufferedInputStream(new FileInputStream(resFileName));
              //使用工具类,读取文件到一个字节数组中
              byte[] bytes = StreamUtils.streamToByteArray(bis);
      
              //得到Socket关联的输出流
              BufferedOutputStream bos =
                      new BufferedOutputStream(socket.getOutputStream());
              //将数据写入数据通道,返回给客户端
              bos.write(bytes);
              socket.shutdownOutput();//结束标记
              //关闭流
              bis.close();
              bos.close();
              inputStream.close();
              socket.close();
              serverSocket.close();
      
              System.out.println("服务端退出……");
          }
      }

      客户端Exercise03Client

      package com.stulzl.exercise03;
      
      import java.io.*;
      import java.net.InetAddress;
      import java.net.Socket;
      import java.net.UnknownHostException;
      import java.time.chrono.IsoChronology;
      import java.util.Scanner;
      
      //文件下载的客户端   681-682
      public class Exercise03Client {
          public static void main(String[] args) throws Exception {
              //接收用户输入,指定下载文件名
              Scanner scanner = new Scanner(System.in);
              System.out.println("请输入要下载的文件:");
              String downloadFileName = scanner.next();
              //连接服务端端口准备发送
              Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
              //创建socket相关联的输出流
              OutputStream outputStream = socket.getOutputStream();
              outputStream.write(downloadFileName.getBytes());//转换为字节数组发送
              //设置结束标记
              socket.shutdownOutput();
      
              //读取服务端返回的文件(字节数组)
              BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
              byte[] bytes = StreamUtils.streamToByteArray(bis);
              //创建一个输出流,准备将bytes写入磁盘
              String filePath = "e:\\"+downloadFileName+".mp3";
              BufferedOutputStream bos =
                      new BufferedOutputStream(new FileOutputStream(filePath));
              bos.write(bytes);
              //关闭
              bos.close();
              bis.close();
              outputStream.close();
              socket.close();
      
              System.out.println("客户端下载完毕,退出……");
      
          }
      }

      工具类StreamUtils

      package com.stulzl.exercise03;
      
      import java.io.BufferedReader;
      import java.io.ByteArrayOutputStream;
      import java.io.IOException;
      import java.io.InputStream;
      import java.io.InputStreamReader;
      
      /**
       * 此类用于演示关于流的读写方法
       *
       */
      public class StreamUtils {
      	/**
      	 * 功能:将输入流转换成byte[], 即可以把文件的内容读入到byte[]
      	 * @param is
      	 * @return
      	 * @throws Exception
      	 */
      	public static byte[] streamToByteArray(InputStream is) throws Exception{
      		ByteArrayOutputStream bos = new ByteArrayOutputStream();//创建输出流对象
      		byte[] b = new byte[1024];//字节数组
      		int len;
      		while((len=is.read(b))!=-1){//循环读取
      			bos.write(b, 0, len);//把读取到的数据,写入bos	
      		}
      		byte[] array = bos.toByteArray();//然后将bos 转成字节数组
      		bos.close();
      		return array;
      	}
      	/**
      	 * 功能:将InputStream转换成String
      	 * @param is
      	 * @return
      	 * @throws Exception
      	 */
      	
      	public static String streamToString(InputStream is) throws Exception{
      		BufferedReader reader = new BufferedReader(new InputStreamReader(is));
      		StringBuilder builder= new StringBuilder();
      		String line;
      		while((line=reader.readLine())!=null){
      			builder.append(line+"\r\n");
      		}
      		return builder.toString();
      		
      	}
      
      }
      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.51cto.com/u_15784725/6323307,作者:进击的菜鸟子,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:AJAX基于XML的数据交换格式

      下一篇:Kafka学习笔记3【黑马程序员】

      相关文章

      2025-05-14 10:33:25

      30天拿下Rust之网络编程

      在现代软件开发中,网络编程无处不在。无论是构建高性能的服务器、实时通信应用,还是实现复杂的分布式系统,对网络编程技术的掌握都至关重要。Rust语言以其卓越的安全性、高性能和优秀的并发模型,为网络编程提供了坚实的基础。

      2025-05-14 10:33:25
      Rust , TCP , 使用 , 客户端 , 异步 , 编程
      2025-05-14 10:33:16

      30天拿下Python之使用网络

      Python网络编程覆盖的范围非常广,包括:套接字编程、socketserver、HTTP和Web开发、异步编程和asyncio等。

      2025-05-14 10:33:16
      Json , TCP , 客户端 , 接字 , 服务器 , 示例 , 连接
      2025-05-14 09:51:21

      python向IP地址发送字符串

      在Python中,向IP地址发送字符串通常意味着你需要通过某种协议来实现通信。最常见的协议包括TCP和UDP。这里,我将分别给出使用TCP和UDP协议向指定IP地址发送字符串的示例代码。

      2025-05-14 09:51:21
      TCP , UDP , 协议 , 地址 , 示例 , 端口
      2025-05-09 09:30:19

      Socket类的用法

      Socket类的用法

      2025-05-09 09:30:19
      IP , Socket , 客户端 , 服务端 , 端口
      2025-05-06 09:19:39

      【30天玩转python】网络编程基础

      网络编程是指编写能够在网络上进行通信的程序,通过网络进行数据的发送与接收。Python 提供了许多库和工具来进行网络编程,如 socket、urllib 和 requests。

      2025-05-06 09:19:39
      TCP , 地址 , 端口 , 编程 , 网络
      2025-04-22 09:40:08

      【网络】传输层TCP协议 | 三次握手 | 四次挥手

      【网络】传输层TCP协议 | 三次握手 | 四次挥手

      2025-04-22 09:40:08
      TCP , 客户端 , 报文 , 服务端 , 连接
      2025-04-01 10:28:48

      TCP头部信息有哪些?

      TCP头部信息有哪些?

      2025-04-01 10:28:48
      TCP , 数据 , 端口号
      2025-04-01 10:28:07

      图解 | 你管这破玩意儿叫TCP?

      图解 | 你管这破玩意儿叫TCP?

      2025-04-01 10:28:07
      TCP , 数据包 , 窗口
      2025-03-12 09:31:27

      网络编程基础(二):TCP/IP协议基础:TCP信息头、TCP状态机与握手/挥手、TCP的粘包和粘包、SYN超时与SYN Flood攻击、TIME_WAIT

      网络编程基础(二):TCP/IP协议基础:TCP信息头、TCP状态机与握手/挥手、TCP的粘包和粘包、SYN超时与SYN Flood攻击、TIME_WAIT

      2025-03-12 09:31:27
      client , server , TCP , 报文 , 连接
      2025-03-10 09:50:08

      【JavaEE初阶】深入理解TCP协议特性之延时应答,捎带应答,面向字节流以及异常处理

      【JavaEE初阶】深入理解TCP协议特性之延时应答,捎带应答,面向字节流以及异常处理

      2025-03-10 09:50:08
      ack , TCP , 发送
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5249004

      查看更多

      最新文章

      【30天玩转python】网络编程基础

      2025-05-06 09:19:39

      网络编程基础(二):TCP/IP协议基础:TCP信息头、TCP状态机与握手/挥手、TCP的粘包和粘包、SYN超时与SYN Flood攻击、TIME_WAIT

      2025-03-12 09:31:27

      【JavaEE初阶】深入理解TCP协议特性之延时应答,捎带应答,面向字节流以及异常处理

      2025-03-10 09:50:08

      【RDMA】RDMA编程和TCP编程的区别|bRPC

      2025-02-21 08:56:43

      初始JavaEE篇 —— 网络原理---传输层协议:深入理解UDP/TCP

      2025-02-13 08:27:04

      Java后端服务端推送技术:WebSocket与Server-Sent Events

      2024-11-27 03:28:07

      查看更多

      热门文章

      Ajax服务端响应JSON数据

      2023-07-28 08:26:06

      kubectl源码分析之replace

      2023-02-16 08:59:22

      我的网络编程之旅

      2023-05-11 06:06:25

      驱动开发:内核封装WSK网络通信接口

      2024-07-01 01:32:23

      第十五章《网络编程》第3节:基于TCP协议的网络编程

      2023-05-11 06:07:01

      用master-worker模型比对团队管理

      2023-05-18 06:37:36

      查看更多

      热门标签

      java Java python 编程开发 代码 开发语言 算法 线程 Python html 数组 C++ 元素 javascript c++
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      网络编程基础(二):TCP/IP协议基础:TCP信息头、TCP状态机与握手/挥手、TCP的粘包和粘包、SYN超时与SYN Flood攻击、TIME_WAIT

      初始JavaEE篇 —— 网络原理---传输层协议:深入理解UDP/TCP

      用master-worker模型比对团队管理

      网络编程释疑之:单台服务器上的并发TCP连接数可以有多少

      谈谈网络编程

      kubectl源码分析之replace

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号