网络编程三要素

1.IP地址
IP地址就相当于茫茫信息大海中的灯塔,需要识别到这个标志才可以和对应的计算机进行网络通讯
2.端口
网络通讯其实就是两个应用程序的通讯,每台计算机上有很多程序,端口就是为了区分这些程序
3.协议
计算机网络中也要遵守一系列规则协议,这里主要介绍的是UDP协议和TCP协议

UDP网络协议

概述:UDP是无连接的通讯,当一台计算机向另一台计算机发送数据的时候,发送端不会确认接收端是否存在,就会发送数据,也不需要任何反馈该数据是否已经发送
UDP协议消耗资源小,通讯效率高,常常用作音频,视频和普通数据的传输,例如视频会议通常采用UDP协议,即便偶然丢失一两个数据包,也不会有太大的影响

接受和发送数据大致方法
UDP发送数据

  1. 创建发送端的Socket对象
  2. 创建数据,并且把数据打包
  3. 调用DatagramSocket对象的方法发送数据
  4. 关闭发送端

UDP接受数据

  1. 创建接收端的Socket对象
  2. 创建一个数据包,用于接受数据
  3. 调用DatagramSocket对象的方法接受数据
  4. 解析数据包,并把数据在控制台显示
  5. 关闭接收端

获取主机IP地址代码

public static void main(String[] args) throws UnknownHostException {//public static InetAddress getByName(String host):确定主机名称的IP地址,可以是机器名称,也可以是IP地址InetAddress address=InetAddress.getByName("IP地址");//public String getHostName():获取此IP地址的主机名String name=address.getHostName();//public String getHostAddress():返回文本显示中的IP地址字符串String ip=address.getHostAddress();System.out.println("主机名:"+name);System.out.println("IP地址:"+ip);}
}

发送和接受数据

无论使用哪种协议,程序都要有一个客户端,一个服务器,客户端发送数据,服务器接受数据。在UDP中不存在服务器,但是也需要一个发送端和一个接受端,而且运行时要保证先打开接受端(服务器),再开启发送端(客户端)

发送端

public static void main(String[] args) throws IOException {//创建发送端的Socket对象//DatagramSocket()构造数据报套接字并将其绑定到本地主机的任何可用端口DatagramSocket ds=new DatagramSocket();//创建数据,并把数据打包//DatagramPacket(byte[] buf,int length, InetAddress address, int port)//构造一个数据包,发送长度为Length的数据包到指定主机上的指定端口号byte[] bys="hh".getBytes();DatagramPacket dp=new DatagramPacket(bys,bys.length, InetAddress.getByName("IP地址"),30085);//调用DatagramSocket对象的方法发送数据ds.send(dp);//关闭发送端ds.close();}

接受端

public static void main(String[] args) throws IOException {//创建接收端的Socket对象//DatagramSocket(int port)构造数据报套接字并将其绑定到本地主机上的指定端口DatagramSocket ds=new DatagramSocket(30085);//创建一个数据包,用于接受数据//DatagramPacket(byte[] buf,int length)构造一个DatagramPacket用于接受长度为length的数据包byte[] bys=new byte[1024];DatagramPacket dp=new DatagramPacket(bys,bys.length);//调用DatagramSocket对象的方法接受数据ds.receive(dp);//解析数据包,并且把数据在控制台上显示//byte[] getData()返回数据缓冲区byte[] datas=dp.getData();System.out.println("数据是:"+new String(datas,0,dp.getLength()));//关闭接收端ds.close();}

通讯程序

作为一个简短的网络聊天室
发送端

public static void main(String[] args) throws IOException {//创建发送端的Socket对象DatagramSocket ds=new DatagramSocket();//自己封装键盘录入数据BufferedReader br=new BufferedReader(new InputStreamReader(System.in));String line;while((line=br.readLine())!=null){//输入886,结束if ("886".equals(line)){break;}//创建数据,把数据打包byte[] bys=line.getBytes();DatagramPacket dp=new DatagramPacket(bys,bys.length, InetAddress.getByName("IP地址"),12345);ds.send(dp);}ds.close();}

接收端
接受端使用while死循环就是为了保证接受端可以保持一直开启的状态

public static void main(String[] args) throws IOException {//创建接收端的Socket对象DatagramSocket ds=new DatagramSocket(12345);while (true){//创建一个数据包,用于接受数据byte[] bys=new byte[1024];DatagramPacket dp=new DatagramPacket(bys,bys.length);//调用DatagramSocket对象的方法接受数据ds.receive(dp);//解析数据包System.out.println("数据是:"+new String(dp.getData(),0,dp.getLength()));}}

TCP网络协议

概述:TCP协议是面向连接的通讯协议,传输数据之前,在发送端和接收端建立逻辑链接,他提供了可靠无差错的数据传输,每次连接的创建都需要“三次握手”
第一次:客户端想服务器发出连接请求,等待服务器确认
第二次:服务器向客户端回送一个响应,通知客户端收到了连接请求
第三次:客户端再次向服务器发送确认信息,确认链接

接受和发送数据的大致方法
发送数据

  1. 创建客户端的Socket对象
  2. 获取输出流,写数据
  3. 释放资源

接受数据

  1. 创建服务器端的Socket对象
  2. 监听客户端连接,返回一个Socket读一下
  3. 获取输入流,读数据,并把数据显示在控制台
  4. 释放资源

发送和接受数据(有反馈)

客户端

public static void main(String[] args) throws IOException {//创建客户端的Socket对象(Socket)Socket s=new Socket("IP",11222);//获取输出流,写数据OutputStream os=s.getOutputStream();os.write("hello,tcp".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);s.close();}

服务器

public static void main(String[] args) throws IOException {//创建服务器端的Socket对象(ServerSocket)//ServerSocket(int port)创建绑定到指定端口的服务器套接字ServerSocket ss=new ServerSocket(11222);//Socket accept()侦听要连接到此套接字并接受它Socket s=ss.accept();//获取输入流,读数据,并把数据显示在控制台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);//给出反馈OutputStream os=s.getOutputStream();os.write("数据已经收到".getBytes());//释放资源s.close();ss.close();}

传输数据

键盘录入上传

客户端

public static void main(String[] args) throws IOException {//创建客户端Socket对象Socket s=new Socket("IP",13333);//数据来自于键盘录入,直到输入的数据是886,发送数据结束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();}

服务器

 public static void main(String[] args) throws IOException {//创建服务器Socket对象ServerSocket ss=new ServerSocket(13333);//监听客户端连接,返回一个对应的Socket对象Socket s=ss.accept();//获取输入流BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));String line;while ((line=br.readLine())!=null){System.out.println(line);}//释放资源ss.close();}

客户端数据来自文本文件

客户端

 public static void main(String[] args) throws IOException {//创建客户端Socket对象Socket s=new Socket("IP",12340);//封装文本文件数据BufferedReader br=new BufferedReader(new FileReader("D:\\Java\\笔记\\java网络编程\\bw.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();}

服务器

 public static void main(String[] args) throws IOException {//创建服务器Socket对象ServerSocket ss=new ServerSocket(12340);//监听客户端连接,返回一个对应的Socket对象Socket s=ss.accept();//获取输入流BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));String line;while ((line=br.readLine())!=null){System.out.println(line);}//释放资源ss.close();}

服务器数据写入文件

客户端

 public static void main(String[] args) throws IOException {//创建客户端Socket对象Socket s=new Socket("IP",12345);//数据来自于键盘录入,直到输入的数据是886,发送数据结束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();}

服务器

 public static void main(String[] args) throws IOException {//创建服务器Socket对象ServerSocket ss=new ServerSocket(12345);//监听客户端连接,返回一个对应的Socket对象Socket s=ss.accept();//接受数据BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));//把数据写入文件BufferedWriter bw=new BufferedWriter(new FileWriter("D:\\Java\\笔记\\java网络编程\\bw.txt"));String line;while ((line=br.readLine())!=null){bw.write(line);bw.newLine();bw.flush();}//释放资源bw.close();ss.close();}

上传文件给服务器

客户端

public static void main(String[] args) throws IOException {//创建客户端Socket对象Socket s=new Socket("IP",32341);//封装文本文件数据BufferedReader br=new BufferedReader(new FileReader("D:\\Java\\笔记\\java网络编程\\src\\UDP获取主机IP地址\\InnetAddressDemo.java"));//封装输出流写数据BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));String line;while ((line=br.readLine())!=null){bw.write(line);bw.newLine();bw.flush();}//释放信号给服务器,我写完了s.shutdownOutput();//接受反馈BufferedReader brClient=new BufferedReader(new InputStreamReader(s.getInputStream()));String data=brClient.readLine();//等待读取数据System.out.println("服务器的反馈:"+data);//释放资源br.close();s.close();}

接收端

 public static void main(String[] args) throws IOException {//创建服务器Socket对象ServerSocket ss=new ServerSocket(32341);//监听客户端连接,返回一个对应的Socket对象Socket s=ss.accept();//接受数据BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));//把数据写入文本文件BufferedWriter bw=new BufferedWriter(new FileWriter("D:\\Java\\笔记\\java网络编程\\bw1.java"));String line;while ((line=br.readLine())!=null){bw.write(line);bw.newLine();bw.flush();}BufferedWriter bwServer=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));bwServer.write("文件上传成功");bwServer.newLine();bwServer.flush();bw.close();ss.close();}

多线程上传文件

核心思想在于模拟多个客户端给服务器上传文件,每开启一个接口相当于开启一个新的线程
客户端

 public static void main(String[] args) throws IOException {//创建客户端Socket对象Socket s=new Socket("127.0.0.1",33445);//封装文本文件数据BufferedReader br=new BufferedReader(new FileReader("D:\\Java\\笔记\\java网络编程\\bw.java"));//封装输出流写数据BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));String line;while((line=br.readLine())!=null){bw.write(line);bw.newLine();bw.flush();}s.shutdownOutput();//接受反馈BufferedReader brClient=new BufferedReader(new InputStreamReader(s.getInputStream()));String data=brClient.readLine();//等待读取数据System.out.println("服务器的反馈"+data);//释放资源br.close();s.close();}

服务器

public static void main(String[] args) throws IOException {//创建服务器Socket对象ServerSocket ss=new ServerSocket(33445);while (true){//监听客户端连接,返回一个Socket对象Socket s= ss.accept();//为每一个客户端开启一个线程new Thread(new ServerThread(s)).start();}}

线程
实现Runnable接口,创建新的线程

public class ServerThread implements Runnable{private Socket s;public ServerThread(Socket s){this.s=s;}@Overridepublic void run() {try{//接受数据写到文本文件BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
//            BufferedWriter bw=new BufferedWriter(new FileWriter("D:\\Java\\笔记\\java网络编程\\bw.java"));//解决重名问题int count=0;File file=new File("D:\\Java\\笔记\\java网络编程\\bw["+count+"].java");while (file.exists()){count++;file=new File("D:\\Java\\笔记\\java网络编程\\bw["+count+"].java");}BufferedWriter bw=new BufferedWriter(new FileWriter(file));String line;while ((line=br.readLine())!=null){bw.write(line);bw.newLine();bw.flush();}//给出反馈BufferedWriter bwServer=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));bwServer.write("文件上传成功");bwServer.newLine();bwServer.flush();//释放资源s.close();}catch (IOException e){e.printStackTrace();}}

java网络编程小结(黑马程序员基础java总结)相关推荐

  1. java的套娃汇总(黑马程序员基础java总结)

    java里面存在很多套娃关系,这里对于基础的套娃做一个小小的总结 对象调用 对象调用顾名思义就是new一个新的对象出来,在主程序中调用 设想一个场景,我要定义一个手机对象,里面有牌子,价格,和一些其他 ...

  2. 黑马程序员:Java基础总结----Java语言编程规范

       黑马程序员:Java基础总结        Java语言编程规范:参考自SUN公司文档  ASP.Net+Android+IO开发..Net培训.期待与您交流!  I.   排版规范 A.  规 ...

  3. 黑马程序员全套Java教程_Java基础教程_异常(含扩展)(二十三)

    黑马程序员全套Java教程_Java基础教程_异常(含扩展)(二十三) 1.1 异常概述与异常体系结构 1.2 JVM遇到异常时的默认处理方案 1.3 异常处理 1.4 异常处理之try--catch ...

  4. 黑马程序员入学Java知识——精华总结

    黑马程序员入学Java知识--精华总结 J2SE部分,Java高新技术部分,7K面试题部分等黑马入学要求的知识点总结! 一.黑马程序员-java概述与基础知识 6 1.何为编程? 6 2.Java语言 ...

  5. 解析python网络爬虫pdf 黑马程序员_正版 解析Python网络爬虫 核心技术 Scrapy框架 分布式爬虫 黑马程序员 Python应用编程丛书 中国铁道出版社...

    商品参数 书名:Python应用编程丛书:解析Python网络爬虫:核心技术.Scrapy框架.分布式爬虫 定价:52.00元 作者:[中国]黑马程序员 出版社:中国铁道出版社 出版日期:2018-0 ...

  6. Java语法快速学习-黑马程序员(个人整理版本)

    Java入门基础视频教程,java零基础自学首选黑马程序员Java入门教程(含Java项目和Java真题)_哔哩哔哩_bilibili为了帮助广大对Java有兴趣和立志进入本行业的零基础学员,本套课程 ...

  7. Java网络编程小结

    1 网络编程概述 Java是 Internet 上的语言,它从语言级上提供了对网络应用程序的支持,程序员能够很容易开发常见的网络应用程序. Java提供的网络类库,可以实现无痛的网络连接,联网的底层细 ...

  8. 黑马程序员之Java集合类详解

    android培训  java培训 期待与您交流! Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Ele ...

  9. C++核心编程(黑马程序员视频个人总结)

    C++核心编程 1.内存分区模型 1.1.1.四个区 代码区:存放函数体的二进制代码,由操作系统进行管理----共享.只读 全局区:存放全局变量.静态变量及常量,常量区中存放const修饰的全局变量和 ...

  10. JAVA开发环境搭建-黑马程序员(个人整理版本)

    Java语言概述 Java环境搭建:JDK安装.常用命令 补充几个命令行窗口的常用命令(记一下) Java入门程序: HelloWorld C:\Java\code新建一个HelloWorld.jav ...

最新文章

  1. 超卖 100 瓶茅台的事故分析
  2. 测试香港服务器访问速度的方法
  3. 超市收银程序_超市收银系统案例|千平超市再开2家,星耀助力门店年关创收...
  4. html5前端裁剪图片,FocusPoint.js 实现图片的响应式裁剪
  5. 搜索引擎优化的关键字工具
  6. vue 手写签名_签名模仿,把握好三个“度”!
  7. python绘图坐标轴|刻度值|刻度||标题设置
  8. Java实现 俄罗斯方块(简陋版)
  9. 【IoT】STM32 启动代码汇编指令详解
  10. ab测试post如何用文件提交json格式的参数
  11. 碳化硅纳米线,SiC纳米线(SiC nanowires),SiC短纤维(SiC fiber),SiC晶须(SiC whiskers)的主要应用方向,检测XRD图谱
  12. 写运维实习生第五周实习周报,包括心得体会和下周计划,多于300字
  13. C#实现自己的远程桌面控制工具
  14. 如何从0到1组建敏捷团队?
  15. 信息系统项目管理师(2022年)—— 重点内容:10大管理、5大过程组、47个过程信息汇总
  16. May 18:PHP 函数
  17. Postman的应用——入门应用
  18. ACCESS在程序运行中实时更新查询列表的条件
  19. Tensorflow2实现人脸关键点检测算法PFLD——一个精度高,速度快,模型小的人脸关键点检测模型
  20. iOS开发笔记(二)

热门文章

  1. matlab仿真零中频接收机技术,经典又实用的零中频接收机的技术解决方案
  2. 【干货】跨端体验度量的思考与实现(含直播回放)
  3. Windows系统win10系统压缩解压软件推荐
  4. MySQL数据库入门学习 #CSDN博文精选# #IT技术# #数据库# #MySQL#
  5. 各省简称 拼音 缩写_中国省会城市拼音名称及缩写
  6. ASCII码对照表(二进制、十进制、十六进制)
  7. 保密工作中非密计算机工具检查,【保密知识】别在保密工作面前耍“小聪明”哦~...
  8. 智能电话机器人源码安装 部署好后,人工智能电话机器人,不仅仅是打电话而已!
  9. 紧急通知:阿里聚合直播盒子APP源码2019年5月以前的版本BUG
  10. 高校水电费管理系统C语言课程设计