文章目录

  • netstat 指令
    • 案例表示
  • TCP网络通讯不为人知的秘密
  • UDP网络通信编程[了解]
    • 基本介绍
    • 基本流程
    • 应用案例
  • 网络编程练习(课堂作业巩固)
    • TCP交互传输字节流回复
    • UDP交互传输字节流回复
    • TCP交互传输音乐文件

netstat 指令

  1. netstat - an 可以查看当前主机网络情况,包括端口监听情况和网络连接情况
  2. netstat - an | more 可以分页显示,光标显示后点回车下一页
  3. ctrl + c 退出指令

案例表示

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

  1. 当客户端连接到服务端后,实际上客户端也是通过一个端口和服务端进行通讯的,这个端口是TCP/IP来分配的

UDP网络通信编程[了解]

基本介绍

  1. 类DatagramSocket 和 DatagramPacket 实现了基于UDP协议网络程序。
  2. UDP数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达
  3. DatagramPacket 对象封装了UDP数据报,在数据中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号
  4. UDP协议中每个数据报都给出了完整的地址信息,因此无需建立发送方和接收方的连接

基本流程

  1. 核心的两个类/对象 DatagramSocket与DatagramPacket
  2. 建立发送端,接收端(没有服务端和客户端概念)
  3. 发送数据前,建立数据包/报 (DatagramPack对象)
  4. 调用DatagramSocket的发送,接收方法
  5. 关闭DatagramSocket

应用案例

  1. 编写一个接收端A,和一个发送端B
  2. 接收端A在9999端口等待接受数据(receive)
  3. 发送端B向接收端A 发送数据“hello,明天吃火锅~”
  4. 接收端A接收到 发送端B发送的数据,回复“好的,明天见”,再退出
  5. 发送端接收 回复的数据,再退出

接收端

package com.tao.udp;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;/*** Create By 刘鸿涛* 2022/2/8 9:55* UDP接收端*/
public class UDPReceiverA {public static void main(String[] args) throws IOException {//1.创建一个 DatagramSocket 对象 准备在9999接收数据DatagramSocket datagramSocket = new DatagramSocket(9999);//2.构建一个DatagramPacket对象,准备接收数据//    在前面学习UDP协议时,知道一个UDP数据包最大64kbyte[] buf = new byte[1024];DatagramPacket packet = new DatagramPacket(buf, buf.length);//3.调用接收方法receive(),将通过网络传输的 DatagramPacket对象//提示:当有数据包发送到 本机的9999端口时,就会阻塞等待System.out.println("接收端A,9999端口, 等待接收数据....");datagramSocket.receive(packet);System.out.println("1");//4.可以把packet 进行拆包,取出数据,并显示int length = packet.getLength();    //实际接收到的数据字节长度byte[] data = packet.getData(); //接收到数据String s = new String(data, 0, length);System.out.println(s);data = "好的,明天见".getBytes();//说明:封装的 DatagramPacket 对象 data 内容字节数组,data.length,主机(IP),端口
//        InetAddress.getLocalHost()        //获得主机ipDatagramPacket datagramPacket = new DatagramPacket(data, data.length,InetAddress.getLocalHost(), 9998);//这里的127.0.0.1指发送给本机datagramSocket.send(datagramPacket);//关闭流datagramSocket.close();System.out.println("===接收端已终止===");}
}

发送端

package com.tao.udp;import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;/*** Create By 刘鸿涛* 2022/2/8 9:57* 发送端B ====> 也可以接收数据*/
public class UDPSenderB {public static void main(String[] args)throws Exception {//创建 DatagramSocket对象,准备接收数据////因为是在本机举例接收端和发送端,所以这个端口号最好不要相同,因为会分不清谁是接收方,// 谁是发送方,导致程序错乱,当然,如果是两台主机,那么就可以使用相同端口号,就比如// 是两个楼层中两个相同id的门一样,虽然id相同,但并不是一个门DatagramSocket datagramSocket = new DatagramSocket(9998);//2.将需要发送的数据,封装到 DatagramPacket对象byte[] data = "hello 明天吃火锅".getBytes();//说明:封装的 DatagramPacket 对象 data 内容字节数组,data.length,主机(IP),端口
//        InetAddress.getLocalHost()        //获得主机ipDatagramPacket datagramPacket = new DatagramPacket(data, data.length,InetAddress.getLocalHost(), 9999);//这里的127.0.0.1指发送给本机datagramSocket.send(datagramPacket);byte[] buf = new byte[1024];datagramPacket = new DatagramPacket(buf, buf.length);datagramSocket.receive(datagramPacket);int length = datagramPacket.getLength();    //实际接收到的数据字节长度byte[] data2 = datagramPacket.getData(); //接收到数据String s = new String(data2, 0, length);System.out.println(s);//关闭资源datagramSocket.close();System.out.println("===发送端已终止===");}
}

网络编程练习(课堂作业巩固)

TCP交互传输字节流回复

  1. 使用字节流的方式,编写一个客户端程序和服务端程序
  2. 客户端发送“name”,服务器端接收到后,返回,“我是nova”,nova是你自己的名字
  3. 客户端发送“hobby”,服务器端接收到后,返回“编写java程序”
  4. 不是这样两个问题,回复“你说啥呢”
package com.tao.homework.homework01;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;/*** Create By 刘鸿涛* 2022/2/8 20:44*/
public class Server {public static void main(String[] args) throws IOException {while(true) {ServerSocket serverSocket = new ServerSocket(5000);//监听System.out.println("等待客户端连接连接");Socket socket = serverSocket.accept();System.out.println("正在接收数据...");InputStream inputStream = socket.getInputStream();  //接收数据通道的数据//IO读取byte[] buf = new byte[1024];int len = 0;String s = "";while ((len = inputStream.read(buf)) != -1) {s = new String(buf, 0, len);if (s.equals("name")) {s = "我是涛涛";} else if (s.equals("hobby")) {s = "编写java程序";} else {s = "你说啥";}}OutputStream outputStream = socket.getOutputStream();outputStream.write(s.getBytes());       //写入s到数据通道socket.shutdownOutput();                //结束语句,我说完了System.out.println("正在传输数据到数据通道...");//关闭流socket.close();inputStream.close();serverSocket.close();System.out.println("服务器端结束");}}
}
package com.tao.homework.homework01;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;/*** Create By 刘鸿涛* 2022/2/8 20:48*/
public class Client {public static void main(String[] args) throws IOException, InterruptedException {while(true) {Socket socket = new Socket(InetAddress.getLocalHost(), 5000);System.out.println("请输入问题");Scanner sc = new Scanner(System.in);String s = sc.next();OutputStream outputStream = socket.getOutputStream();outputStream.write(s.getBytes());socket.shutdownOutput();        //结束语句,证明我说完了InputStream inputStream = socket.getInputStream();byte[] buf = new byte[1024];int len = 0;while ((len = inputStream.read(buf)) != -1) {System.out.println(new String(buf, 0, len));}//关闭流socket.close();outputStream.close();System.out.println("客户端结束");}}
}

UDP交互传输字节流回复

  1. 编写一个接收端A,和一个发送端B,使用UDP协议完成
  2. 接收端在8888端口等待接收数据(receive)
  3. 发送端向接收端发送数据“四大名著是哪些”
  4. 接收端接收到发送端发送的问题后,返回“四大名著是<<红楼梦>>…",否则返回what?
  5. 接收端和发送端程序退出
package com.tao.homework.homework02;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;/*** Create By 刘鸿涛* 2022/2/8 9:55* UDP接收端*/
public class Homework02ReceiverA {public static void main(String[] args) throws IOException {//1.创建一个 DatagramSocket 对象 准备在9999接收数据DatagramSocket datagramSocket = new DatagramSocket(9999);//2.构建一个DatagramPacket对象,准备接收数据//    在前面学习UDP协议时,知道一个UDP数据包最大64kbyte[] buf = new byte[1024];DatagramPacket packet = new DatagramPacket(buf, buf.length);//3.调用接收方法receive(),将通过网络传输的 DatagramPacket对象//提示:当有数据包发送到 本机的9999端口时,就会阻塞等待System.out.println("接收端A,9999端口, 等待接收数据....");datagramSocket.receive(packet);//4.可以把packet 进行拆包,取出数据,并显示int length = packet.getLength();    //实际接收到的数据字节长度byte[] data = packet.getData(); //接收到数据String s = new String(data, 0, length);String answer = "";if ("四大名著有哪些".equals(s) ){answer = "四大名著 《红楼梦》《三国演义》《西游记》《水浒传》";}else {answer = "你说啥?";}
//        System.out.println(s);data = answer.getBytes();//说明:封装的 DatagramPacket 对象 data 内容字节数组,data.length,主机(IP),端口
//        InetAddress.getLocalHost()        //获得主机ipDatagramPacket datagramPacket = new DatagramPacket(data, data.length,InetAddress.getLocalHost(), 9998);//这里的127.0.0.1指发送给本机datagramSocket.send(datagramPacket);//关闭流datagramSocket.close();System.out.println("===接收端已终止===");}
}
package com.tao.homework.homework02;import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;/*** Create By 刘鸿涛* 2022/2/8 9:57* 发送端B ====> 也可以接收数据*/
public class Homework02SenderB {public static void main(String[] args)throws Exception {//创建 DatagramSocket对象,准备接收数据////因为是在本机举例接收端和发送端,所以这个端口号最好不要相同,因为会分不清谁是接收方,// 谁是发送方,导致程序错乱,当然,如果是两台主机,那么就可以使用相同端口号,就比如// 是两个楼层中两个相同id的门一样,虽然id相同,但并不是一个门DatagramSocket datagramSocket = new DatagramSocket(9998);//2.将需要发送的数据,封装到 DatagramPacket对象//把字符a包装送到数据通道System.out.println("请输入查询内容...");Scanner scanner = new Scanner(System.in);String a = scanner.next();byte[] data = a.getBytes();//说明:封装的 DatagramPacket 对象 data 内容字节数组,data.length,主机(IP),端口
//        InetAddress.getLocalHost()        //获得主机ipDatagramPacket datagramPacket = new DatagramPacket(data, data.length,InetAddress.getLocalHost(), 9999);//这里的127.0.0.1指发送给本机datagramSocket.send(datagramPacket);//接收数据通道传来内容byte[] buf = new byte[1024];datagramPacket = new DatagramPacket(buf, buf.length);datagramSocket.receive(datagramPacket);int length = datagramPacket.getLength();    //实际接收到的数据字节长度byte[] data2 = datagramPacket.getData(); //接收到数据String s = new String(data2, 0, length);System.out.println(s);//关闭资源datagramSocket.close();System.out.println("===发送端已终止===");}
}

TCP交互传输音乐文件

  1. 编写客户端程序和服务器端程序
  2. 客户端可以输入一个音乐文件名,比如高山流水,服务端收到音乐名后,可以给客户端返回这个音乐文件,如果服务器没有这个文件,返回一个默认的音乐即可.
  3. 客户端收到文件后,保存到本地d:\
  4. 该程序可以使用 StreamUtils.java

package com.tao.homework.homework03;import com.tao.upload.StreamUtils;import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;/*** Create By 刘鸿涛* 2022/2/9 12:21*/
public class Homework03Client {public static void main(String[] args) throws Exception {//找到服务器端口Socket socket = new Socket(InetAddress.getLocalHost(), 9999);OutputStream outputStream = socket.getOutputStream();System.out.println("请输入需要下载的音乐...");Scanner scanner = new Scanner(System.in);String downLoadFileName = scanner.next();outputStream.write(downLoadFileName.getBytes());socket.shutdownOutput();//接受数据BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());byte[] bytes = StreamUtils.streamtoByteArray(bis);//得到一个输出流,准备将bytes写入到磁盘文件String filePath = "d:\\" + downLoadFileName + ".mp3";BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath));bos.write(bytes);//关闭流outputStream.close();socket.close();scanner.close();bis.close();bos.close();System.out.println("客户端关闭");}
}
package com.tao.homework.homework03;import com.tao.homework.homework01.Server;
import com.tao.upload.StreamUtils;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;/*** Create By 刘鸿涛* 2022/2/9 12:20*/
public class Homework03Server {public static void main(String[] args) throws Exception {//1.监听 9999端口,等待客户端连接,并发送下载文件的名字ServerSocket serverSocket = new ServerSocket(9999);//2.等待客户端连接Socket socket = serverSocket.accept();//3.读取 客户端发送要下载的文件名//这里老师使用了while读取文件名,是考虑将来客户端发送的数据较大的情况InputStream inputStream = socket.getInputStream();byte[] b = new byte[1024];int len = 0;String downLoadFileName = "";while ((len = inputStream.read(b)) != -1){downLoadFileName = new String (b,0,len);}System.out.println("客户端希望下载文件名" + downLoadFileName);//src下有两个文件,一个是“青山”,一个“高山流水.MP3”//如果客户下载的是 “高山流水” 我们就返回该文件,否则默认返回“青山”String resFileName = "";//4.创建一个输入流,读取文件if ("高山流水".equals(downLoadFileName)){resFileName = "src\\高山流水.mp3";} else {resFileName = "src\\青山.mp3";}BufferedInputStream bis = new BufferedInputStream(new FileInputStream(resFileName));//5.实用工具类StreamUtils,读取文件到一个字节数组byte[] bytes = StreamUtils.streamtoByteArray(bis);//6.得到Socket关联的输出流BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());//7.写入到数据通道,返回给客户端bos.write(bytes);socket.shutdownOutput();//8.关闭流serverSocket.close();socket.close();inputStream.close();bis.close();bos.close();System.out.println("服务端退出");}
}

Java基础 - 网络编程 - netstat指令,UDP通信编程和网络编程总练习相关推荐

  1. 21天学会Java之(Java SE第十三篇):网络编程、TCP/UDP通信

    如今,计算机已经成为人们学习.工作.生活必不可少的工具.人们利用计算机可以和亲朋好友在网上聊天,玩网游或发邮件等,这些功能的实现都离不开计算机网络.计算机网络实现了不同计算机之间的通信,而这些必须依靠 ...

  2. JavaEE 网络编程示例1 UDP套接字数据报编程 == 一发一收

    鲁吼呀,胶己人! 文章目录 JavaEE & 网络编程示例1 & UDP套接字数据报编程 ==> 一发一收 1. 协议分层(回顾) 2. 套接字 Socket 2.1 UDP与T ...

  3. Java核心类库之(网络编程:网络编程入门、UDP通信程序、TCP通信程序)

    目录 1 网络编程入门 1.1 网络编程概述 1.2 网络编程三要素 1.3 IP地址 1.4 InetAddress的使用 1.5 端口 1.6 协议 2 UDP通信程序 2.1 UDP通信原理 2 ...

  4. Java网络编程之简单UDP通信

    UDP是一种基于不可靠连接的协议,它无法保证传输的数据能不丢失不重复到达,尽自己努力传输,但是不会重传,不需要建立连接,则它所需要的时间会很快.它是基于数据报为单位进行传输的,不想TCP是一种基于流进 ...

  5. Java基础复习-八大基本数据类型-内存模型-基本算法-网络编程

    Java基础 数据类型: 基本数据类型: 整数型:byte short int long(数值型) 浮点型: float double(数值型) 字符型:char 布尔型:boolean 引用数据类型 ...

  6. 网络编程传输层——UDP通信

    何为传输层?         在物理层.数据链路层.网络层解决了主机和主机之间能够发送接收数据,但是在计算机网络中,主机的通信主体还是进程,而传输层则解决应用进程的通信,所谓传输层协议也是端对端协议. ...

  7. 博途PLC开放式以太网通信TRCV_C指令应用编程(运动传感器UDP通信)

    博途PLC开放式以太网通信TSENG_C指令应用,请参看下面的文章链接: 博途PLC 1200/1500PLC开放式以太网通信TSEND_C通信(UDP)_plc的udp通信_RXXW_Dor的博客- ...

  8. Qt网络编程之搭建Udp通信【单播、组播、广播】

    由于项目的环境实在局域网内进行传输,所以采用了UDP通信.为此记录一下. UDP概念 UDP(用户数据报协议)是一个简单的面向数据报的传输层协议.提供的是非面向连接的.不可靠的数据流传输.UDP不提供 ...

  9. Java基础学习——多线程(线程间通信-生产者消费者代码示例)

    JDK 1.5提供了多线程升级方案 将同步synchronized替换成了显示的Lock操作.可以实现唤醒.冻结指定的线程. Lock接口 Lock 实现提供了比使用 synchronized 方法和 ...

  10. Java基础班学习笔记(15)GUI图形界面编程

    1:如何让Netbeans的东西Eclipse能访问. 在Eclipse中创建项目,把Netbeans项目的src下的东西给拿过来即可. 注意:修改项目编码为UTF-8 2:GUI(了解) (1)用户 ...

最新文章

  1. 自动驾驶出租车竞争激烈,国内百度占得先机!
  2. 使用Windows live Writer 2012发布ChinaUnix博客
  3. 【转】从源码分析Handler的postDelayed为什么可以延时?
  4. 揪出“凶手”——实战WinDbg分析电脑蓝屏原因
  5. Scalaz(32)- Free :lift - Monad生产线
  6. Spring Boot 2.0 新特性和发展方向
  7. Springboot本地缓存和redis缓存
  8. Linux基础命令---fold
  9. 跳出当前_活在当下,跳出当下
  10. CF1548A Web of Lies
  11. 利用pushState开发无刷页面切换
  12. mysql复制部署_MYSQL-主从复制部署
  13. textarea光标处插入文字
  14. MPEG-2 TS学习(一)MPEG-2 TS格式解析
  15. 轨迹跟踪——二维轨迹跟踪
  16. mumu模拟器切换android,MuMu模拟器“键位设置”功能详解!如有问题请联系在线客服~...
  17. 项目【QT5.13频谱分析软件】(一)——开篇介绍
  18. 党政信创建设进入新发展阶段的三大趋势
  19. 51cto python数据分析系列课程 55g_Python 3 数据分析与挖掘系列课程完整版
  20. 达梦dm8可视化工具_DM8(达梦8)数据库安装和使用

热门文章

  1. 爬去当当热销图书信息
  2. 营业执照15位注册号码含义和查询规则
  3. python画图设置字体_python Matplotlib画图之调整字体大小的示例
  4. 2021酒店便捷型IPTV系统云桌面
  5. 5种电脑定时关机的方法分享
  6. 程序员软件工程常用的画图软件推荐
  7. 用BILSTM+CRF模型进行命名实体识别
  8. 如何用OD的跟踪功能分析虚拟机保护
  9. Ant design的Table组件报错TypeError: rawData.some is not a function
  10. kettle下载windows共享文件夹到本地