文章目录


文章目录

  • 文章目录
  • 前言
  • 一、什么是网络编程
    • (1)计算机网络
    • (2)网络编程
    • (3) 网络三要素与三大协议
      • 3.1网络三要素
      • 3.2网络三大协议
    • (3)套接字“Socket”的使用
  • 二、三大协议的使用步骤与操作案例
    • (1)TCP协议(面向连接的协议,可靠性更高)
    • (2)UDP协议(无连接的协议)
    • (3)TCP VS UDP
    • (4)HTTP协议
  • 三、实战案例:实现不同用户之间的聊天
    • (1)TCP案例部分:
      • 1.1一对一聊天
      • 1.2实现文件的传输(不正经系列)
      • 1.3多人之间聊天
    • (2)UDP部分案例:
      • 2.1通过用户之间的发送快递的形式来解释
    • (3)HTTP部分案例
  • 总结

前言

Java中的网络编程已经是属于JavaSE部分的尾声内容了,这一周剩下的还有一个反射的内容。都属于理论性与操作性较强的部分,如果内容错误欢迎留言指点


以下是本篇文章正文内容,下面案例可供参考

一、什么是网络编程

(1)计算机网络

内容:所谓计算机网络,是指将空间上具有独立功能的多台计算机以及它的外部设备(例如路由器等),通过通信线路连接起来,在网络操作系统,网络管理软件以及网络通信协议的管理下,实现资源共享和信息传递的计算机系统。

(2)网络编程

实现多态计算机之间数据共享与传递,网络应用程序主要组成是:网络编程+IO流+多线程

(3) 网络三要素与三大协议

3.1网络三要素

网络通讯模型:请求(客户端)—》响应请求(服务端)
内容:网络三大要素为:IP地址 、 端口号(port)、 网络协议(数据传输的规则)
IP地址:网络中计算机的唯一标识(IP地址是一个32位的二进制数据,为了方便,将一个字节的二进制转换为一个十进制的数据),IP地址的组成=网络号段+主机段(IPV4是32位,IPV6是128位,我们的计算机通常是IPV4,本机的IP地址都是“127.0.0.1”);
端口号:每一个网络程序都至少一个端口号,这是用于标示进程的逻辑地址,不同的地址其端口号标示不同,有效端口号范围:0 ~ 65535,其中0 ~ 1024是系统使用或保留端口
网络协议:都是数据传输的规则,TCP 、UDP都是传输层的协议(后面会详细介绍)

3.2网络三大协议

TCP:一种面向连接的协议,其稳定性比较好,通过客户端与服务端之间的Socket进行交流访问。是一种基于字节流的传输层协议,其建立过程需要通过三次握手与四次挥手结束。
UDP:面向无连接的协议,有一定的缺陷,如果用来传送数据包可能会造成数据丢失,是一种不是很负责的协议,但是其速度较快 可用于视频通话上。传输的每个包的大小为64KB。
HTTP:超文本传输协议是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。

(3)套接字“Socket”的使用

套接字的内容:如果要具体讲的话他就有点烧脑了,我们就简单提一下它的功能,Socket是将网络三大要素中的 IP 和 端口号 打包成了一个内容使得计算机之间的交流更加简单便利,Scoket也叫套接字,其表示的是IP地址和端口号的组合。网络编程主要就是指Socket编程,网络间的通信其实就是Socket间的通信,数据就通过IO流在两个Scoket间进行传递。

二、三大协议的使用步骤与操作案例

(1)TCP协议(面向连接的协议,可靠性更高)

内容:三次握手,四次挥手类似于打电话
理解图如下:

(2)UDP协议(无连接的协议)

内容:单方面发送消息数据包,类似于发快递。
特点:容易造成数据丢失,故此常应用于视频聊天,相比较于TCP它更显得不负责任,此外UDP没有服务端,只有客户端即直接行驶的是用户之间的交流没有服务端的介入。

(3)TCP VS UDP

(4)HTTP协议

三、实战案例:实现不同用户之间的聊天

(1)TCP案例部分:

1.1一对一聊天

说明:实现一对一聊天需要用到线程的知识,为了能够使得客户端与服务端之间的交流能够顺利创建一个接收的线程

客户端(Client)代码如下:

import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;public class Client {/*** 需求:优化一对一聊天*/public static void main(String[] args) throws Exception {Socket socket=new Socket("127.0.0.1",8080);Scanner input=new Scanner(System.in);new ReceiveThread(socket).start();PrintStream ps=new PrintStream(socket.getOutputStream());while (true){ps.println("雍仲:"+input.next());}}
}

服务端(Server):

import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;public class Server {public static void main(String[] args) throws Exception {//创建服务端ServerSocket serverSocket = new ServerSocket(8080);Socket socket=serverSocket.accept();//由服务端创建一个 服务于客户端的SocketScanner input=new Scanner(System.in);//向服务端发送消息new ReceiveThread(socket).start();PrintStream ps=new PrintStream(socket.getOutputStream());while (true){ps.println("中国人寿保险:"+input.next());}}
}

线程接受器


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
public class ReceiveThread extends Thread{private Socket socket;public ReceiveThread(Socket socket) {this.socket = socket;}@Overridepublic void run() {BufferedReader bufferedReader=null;try {bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));} catch (IOException e) {e.printStackTrace();}while (true){String readLine=null;try {readLine=bufferedReader.readLine();} catch (IOException e) {e.printStackTrace();}System.out.println(readLine);}}
}

1.2实现文件的传输(不正经系列)

这个案例的要求的实现主要是依靠对输入流以及输出流的熟练使用,以及通过对网络编程Socket的熟练使用

Client客户端


import java.io.FileInputStream;
import java.io.OutputStream;
import java.net.Socket;public class Client {/*** 需求:传输文件*/public static void main(String[] args) throws Exception {Socket socket=new Socket("127.0.0.1",8080);//1、创建流对象FileInputStream fis=new FileInputStream("明日花绮罗.jpg");OutputStream out=socket.getOutputStream();//将该内容发送到服务端 127.0.0.1//2、读写数据int len;byte [] bs=new byte[1024];while ((len=fis.read(bs))!=-1){out.write(bs,0,len);}//3、关闭流对象fis.close();out.close();}
}

Server服务端类:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {public static void main(String[] args) throws Exception {ServerSocket serverSocket=new ServerSocket(8080);Socket socket=serverSocket.accept();//接收客户端的消息的Socket//1、创建流对象InputStream is=socket.getInputStream();//利用服务端的Socket来进行接受客户端的传输内容,相当于 这代码就是客户端中的FileInputStream fis=new FileInputStream("明日花绮罗.jpg")OutputStream os=new FileOutputStream("download.jpg");//2、读写数据int len;byte [] bs=new byte[1024];while ((len=is.read(bs))!=-1){os.write(bs,0,len);}//3、关闭流对象os.close();is.close();}
}

结果展示:

1.3多人之间聊天

说明 :对于实现多人聊天,我们需要注意的一点就是在我们不知道到底有多少个用户在聊天的时候我们就无法确定有多少个客户端Socket,因此就不能在服务端中明确创建多少个服务端的Socket来进行对象之间的匹配,因此我们需要用到多线程,而谈及多线程的话明显是要实现多个用户的交流,而对于这一部分我们作为服务器的控制者,那么我们就需要收集到所有用户的IP地址和Socket来进行他们之间的消息收集和发送到其余的用户那儿去故此 我们需要用到一个Map,而这个Map就是多线程下的安全性最高的ConcurrenHashMap。

创建用户端类(Client)

import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
public class Client {/*** 需求 :实现群聊*/public static void main(String[] args) throws Exception{Socket socket=new Socket("127.0.0.1",8080);Scanner input=new Scanner(System.in);new ReceiveThread(socket).start();PrintStream ps=new PrintStream(socket.getOutputStream());while (true){ps.println("雍仲杨:"+input.next());}}
}

创建服务端类(Server)


import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ConcurrentHashMap;public class Server {//这里设置一个静态公共Map用来存放所有的客户端的Socket与其ip地址public static ConcurrentHashMap<InetAddress,Socket> map=new ConcurrentHashMap<>();public static void main(String[] args) throws Exception {ServerSocket serverSocket=new ServerSocket(8080);//由于是多个用户之间的聊天 因此在不确定有多少个用户的时候就无法知道有多少个用户的Socket,故此我们选择用一个死循环来创建服务端的SOcket来匹配与值数量的用户Socketwhile (true){Socket socket=serverSocket.accept();//获取客户端的IP地址InetAddress ip=socket.getInetAddress();//存放IP与对应的Socketmap.put(ip,socket);//创建线程并启动线程new ServerThread(socket).start();}}
}

创建接受线程类(ReceiveThread)


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;public class ReceiveThread extends Thread{private Socket socket;public ReceiveThread(Socket socket) {this.socket = socket;}@Overridepublic void run() {BufferedReader br=null;try {br=new BufferedReader(new InputStreamReader(socket.getInputStream()));} catch (IOException e) {e.printStackTrace();}while (true){String readLine=null;try {readLine=br.readLine();} catch (IOException e) {e.printStackTrace();}System.out.println(readLine);}}
}

创建服务线程类(ServerThread)


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;public class ServerThread extends Thread{private Socket socket;public ServerThread(Socket socket) {this.socket = socket;}@Overridepublic void run() {//接收当前Socket的消息BufferedReader bufferedReader = null;try {bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));} catch (IOException e) {e.printStackTrace();}while (true){String readLine=null;try {readLine =bufferedReader.readLine();System.out.println(readLine);//发送给其他的SocketConcurrentHashMap<InetAddress,Socket> map=Server.map;Set<Entry<InetAddress,Socket>> entrySet=map.entrySet();for (Entry<InetAddress,Socket> entry:entrySet) {InetAddress key=entry.getKey();Socket value=entry.getValue();if (socket.getInetAddress()!=key){//这句代码的意思是,如果当前的key不等于当前的socket那么说明就是等于其余的socketPrintStream ps=new PrintStream(value.getOutputStream());ps.println(readLine);}}} catch (IOException e) {e.printStackTrace();}}}
}

(2)UDP部分案例:

2.1通过用户之间的发送快递的形式来解释

创建第一个用户端


import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;public class Client01 {public static void main(String[] args) throws IOException {/*** 知识点:UDP协议*///发送者所在城市的快递公司,发送者不需要写端口号DatagramSocket socket=new DatagramSocket();//发送礼物者发快递//礼物byte [] bs="鲜花一束~~~".getBytes();//数据包--快递包裹DatagramPacket packet=new DatagramPacket(bs,bs.length, InetAddress.getByName("127.0.0.1"),8080);//发送快递socket.send(packet);//4、接受 用户端2 的礼物byte [] buf=new byte[1024];packet=new DatagramPacket(buf, buf.length);socket.receive(packet);System.out.println(new String(buf).trim());}
}

创建用户端2

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Client02 {public static void main(String[] args) throws IOException {//接受礼物者//接收者所在地的快递公司DatagramSocket socket=new DatagramSocket();//接受发送者的礼物byte [] bs=new byte[1024];DatagramPacket packet=new DatagramPacket(bs,bs.length);socket.receive(packet);System.out.println(new String(bs).trim());//3、给 用户端01 回礼byte [] buf="典藏版黑金卡".getBytes();packet=new DatagramPacket(buf, buf.length,packet.getSocketAddress());socket.send(packet);}
}

(3)HTTP部分案例

Http部分案例我通过一个查询快递的接口来展示 具体的注释我写在了项目中
查询快递:需要获取网络接口URL查询快递的位置等信息,其中需要用到网络接口对象(URL)与连接对象HttpURLConnection以及后面的设置和获取响应码等

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;public class Test01 {@SuppressWarnings("all")public static void main(String[] args) throws IOException {/*** 知识点:HTTP* 需求:查询快递*///获取网络接口(这个可以在网上查到,但是不是所有的接口都能用)String urlStr="http://www.kuaidi100.com/query?type=yunda&postid=4316645130015";//创建网络接口的对象URL url =new URL(urlStr);//获取HttpURLConnection对象HttpURLConnection conn= (HttpURLConnection) url.openConnection();//设置conn.setReadTimeout(5000);//设置阅读超时时间conn.setRequestMethod("GET");//设置连接方式,我目前所知道的一共有两种“GET"与"POST"conn.setConnectTimeout(5000);//设置连接超时时间//获取响应的状态码int responseCode=conn.getResponseCode();if (responseCode==200){//获取响应中的数据BufferedReader br=new BufferedReader(new InputStreamReader(conn.getInputStream(),"utf-8"));char [] cs=new char[1024];int len;while ((len=br.read(cs))!=-1){System.out.println(new String(cs,0,len));}}else if (responseCode==404){System.out.println("页面丢失");}}
}

通过Http协议来传送网络上的资源到电脑上。


import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.net.HttpURLConnection;
import java.net.URL;public class Test02 {public static void main(String[] args)throws Exception {/*** 知识点:使用HTTP协议下载网络资源*///1、获取资源地址接口String str="https://gimg2.baidu.com/image_search/src=http%3A%2F%2F5b0988e595225.cdn.sohucs.com%2Fq_70%2Cc_zoom%2Cw_640%2Fimages%2F20180219%2F60a5778a47384ea9bc673be94a7f646a.jpeg&refer=http%3A%2F%2F5b0988e595225.cdn.sohucs.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1632019852&t=38c341554f5189d54f57c949f2de9fb9";//2、获取网络连接对象URL url=new URL(str);//3、获取HttpConnection对象HttpURLConnection connection= (HttpURLConnection) url.openConnection();//4、设置各种状态与获取状态码connection.setRequestMethod("GET");connection.setReadTimeout(5000);//设置五秒的阅读有效时间connection.setConnectTimeout(5000);//设置连接时间//5、获取动态码int responseCode=connection.getResponseCode();//6、判断各种情况if (responseCode == 200){BufferedInputStream bis=new BufferedInputStream(connection.getInputStream());//通过输入流获取网络连接内容BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("AVgirl.jpg"));int len;byte [] bs=new byte[1024];while ((len=bis.read(bs))!=-1){bos.write(bs,0,len);}}else if (responseCode==404){System.out.println("页面查找失败");}}
}

总结

本文主要是通过一些基本理论+实战场景来进行梳理的,内容还不完整,后期我会慢慢进行填补,若所写内容之中有错误请指正。

JavaSE——基础知识回顾18之网络编程部分相关推荐

  1. JavaSE基础知识回顾

    文章目录 JavaSE 一.前言 1.1.解决大家的疑惑 1.2.Java和Python的抉择 1.3.走进Java 二.预科 2.1.学习准备:博客 2.2.MarkDown 2.3.基本Dos命令 ...

  2. JavaSE——基础知识回顾13之集合(上半部分Collection部分)

    文章目录 本次文章就要开始真正进入到Java的核心部分了,集合是属于较难的部分,不仅难在不好理解,还有运用上,再加上这个东西的内容十分的多,体系也十分的庞大,需要花一段时间乃至更久来仔细学习,目前我会 ...

  3. JavaSE——基础知识回顾14之集合(下半部分Map)

    文章目录 现在已经是深夜十二点了,才复习完Map部分的内容,打算将自己今天所学的再做一次巩固,毕竟这一次是我打算给自己留的最后一次机会了,不管以后的路是平坦,是坎坷,我只需要做到无悔于自己的决定. 文 ...

  4. Java基础知识回顾之七 ----- 总结篇

    前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...

  5. 【JavaSE 基础知识盲点小结】

    [JavaSE 基础知识盲点小结] 一.第一天: 1. 在 cmd 命令窗口问题: ①编译是: javac HelloWorld.java ②运行时是: java HelloWorld (类名 不加 ...

  6. 面向对象-----6(javaSE基础知识完结篇)

    目录 解析面向对象 内存分析 三大特性.封装.继承.多态 接口 内部类 涉及知识目录总览: 资料来自于马士兵java笔记 这是javaSE基础知识的最后一篇笔记 1. 解析面向对象 返回目录 [1]面 ...

  7. java知识点博客园_JAVA基础知识回顾

    JAVA基础知识回顾 一.背景介绍 JavaSE(J2SE)(Java2 Platform Standard Edition,java平台标准版) JavaEE(J2EE)(Java 2 Platfo ...

  8. JavaSE基础知识(五)--面向对象代码实现初步(实现一个简单的类类型代码)

    Java SE 是什么,包括哪些内容(五)? 本文内容参考自Java8标准 一.面向对象(代码实现): 首先,在这里我需要说明一个根本性的问题:实际上,面向对象编程包括了两部分,一个是你的编程思想,一 ...

  9. 【Java基础知识回顾篇】之打怪升级Day001

    Java基础知识回顾篇之打怪升级Day001 目录 Java基础知识回顾篇之打怪升级Day001 简介 一.为什么现在主流的是Java8和Java11? 二.简单尝试编写java程序 1.编写一个He ...

最新文章

  1. 【bzoj2770】YY的Treap 权值线段树
  2. Matplotlib基础绘图功能 — 以折线图为例
  3. 01-mybatis源码阅读
  4. 强化学习1——策略,价值函数,模型
  5. 《Python游戏编程快速上手》第十章TicTacToe
  6. boost实用工具:创建一个禁止复制的类 noncopyable
  7. SQL和PL/SQL的性能优化之四---联结与子查询
  8. 设计模式---命令模式(C++实现)
  9. Ms SQL2016 备份和还原
  10. mysql有什么编程软件_常用数据库编程软件有哪些?
  11. 显式积分,隐式积分和弹簧质点系统(详细公式推导和太极源码)
  12. One-shot Face Reenactment(BMVC19)
  13. 云服务器查看物理MAC地址的方法
  14. 第9周项目6委派任务
  15. 金属学复习【5】--- 金属及合金的塑性变形与再结晶
  16. centos下安装snmp服务
  17. 关于Prim算法,自己的一些总结
  18. C语言:判断两数是否互质
  19. OpenCV之图像相似度
  20. arduino和轮毂电机接线_四. 测试电机相线和霍尔线接线顺序

热门文章

  1. 《华林科纳-半导体工艺》颗粒清洗技术
  2. C++COLORREF与字符串互转
  3. android 弹窗有边框_android中常用的弹出提示框
  4. Android中打招呼
  5. Oracle采用的数据模型,POSTGRES、ORACLE等数据库采用的数据模型面向对象的数据模型()...
  6. Introduce C
  7. android 手机网络接入点名称及WAP、NET模式的区别
  8. 梦幻模拟战更新服务器正在维护,梦幻模拟战:10月18日更新维护公告
  9. myeclipse编辑新字母就会覆盖掉后面的字母解决方法
  10. 素颜聚合登录多渠道便捷登录平台接入【免费社会化登录计划】