网络概述

协议

在网络之间传出数据时需要按照指定的标准来传输,标准中规定了数据的格式、大小、传输的方式、传输速率。形成统一规范—>按照规范开发的代码—>协议(应用层、传输层、网络层、链路层)

InetAddress类

用来分装网络地址:IP地址、端口、主机名称

UDP协议编程

UDP(User Datagram protocol),用户数据报协议;

特点:

  1. 发送端只发送数据,不管接收端是否接收数据或者接收数据是否完整
  2. 接受端只管接受数据
  3. 允许发送的数据出现丢失的现象

电视直播、广播

TCP 传输控制协议

特点:
1. 客户端:发送数据
2. 服务器:接受数据
3. 不允许出现数据丢失的情况

长传下载文件

TCP/IP的三次握手:第一次握手,客户端向服务器端发出连接请求,等待服务器确认,第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求,第三次握手,客户端再次向服务器端发送确认信息,确认连接。

UDP通信的过程

  1. DatagramSocket类(码头 用来存放数据包(集装箱)DatagramPacket)
  2. DatagramPacket类(集装箱 用来装载数据)

UDP接收端的过程

简单原理:创建一个能接收(存放)数据报(集装箱)的数据平台(码头)。

  1. 创建DatagramSocket(码头)来存放数据报(集装箱),这个码头要有编号(port 端口号),用来接收具有相同端口号的数据报。
  2. 创建有一定规格的DatagramPacket(集装箱)不需要知道是那里来的数据报。
  3. 接受数据报
  4. 读取数据报里的数据
  5. 关闭码头

代码

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;public class Receive {public static void main(String[] args)throws Exception {//创建能存放数据报(DatagramPacket) 的 DatagramSocket(码头) 对象需指定端口号DatagramSocket s=new DatagramSocket(6000);//创建一个有大小的数据报对象 相当于集装箱 用来接收数据byte []buf=new byte[1024];DatagramPacket dp=new DatagramPacket(buf,1024);//让码头接收数据报(集装箱)s.receive(dp);//读取集装箱里的数据byte[] data = dp.getData();String dataStr=new String(data);InetAddress address = dp.getAddress();String hostName = address.getHostName();System.out.println(hostName);System.out.println(dataStr);//关闭码头 不在接收数据报(集装箱)}
}

UDP发送端过程

简单原理:创建一个能发送数据报(集装箱)的数据平台(码头)。

  1. 创建能存放数据报(DatagramPacket) 的 DatagramSocket(码头) 无需指定端口号
  2. 创建数据报(集装箱)上要有目的地的信息、端口号等。
  3. 发送数据报
  4. 关闭码头

    import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;public class Send {public static void main(String[] args) throws Exception{//创建能存放数据报(DatagramPacket) 的 DatagramSocket(码头)无需指定端口号DatagramSocket s=new DatagramSocket();//创建数据报(集装箱)用来装载数据 需要指明目的地//byte []b=new byte[1024];byte []b="今晚七点我们在操场见面".getBytes();DatagramPacket dp=new DatagramPacket(b, b.length, InetAddress.getByName("192.168.88.1"), 6000);//发送数据报s.send(dp);//关闭码头s.close();}}
    

TCP通信的过程

需要注意的是:TCP通信不同于UDP通信,TCP通信需要先通过客户端连接服务器端才能实现通信,服务器不能直接连接客户端,服务器必须要先启动,等待客户端的连接。

  1. 客户端:Socket
  2. 服务器端:ServerSocket
  3. 先创建服务器端在创建客户端

TCP服务器端响应过程

  1. 创建服务器端,使用ServerSocket类,需要设置服务器的端口号
  2. 开启客户端连接,返回一个客户端对象
  3. 获得客户端发过来的信息,并输出到控制台上(输入流)
  4. 响应客户端的请求,给客户端发送信息(输出流)
  5. 关闭流和客户对象

    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;public class Server {public static void main(String[] args) throws Exception{//创建服务器端   使用ServerSocket 需要指定服务器的端口号ServerSocket s=new ServerSocket(6000);//开启客户端连接 返回客户端对象Socket socket = s.accept();//获得客户端发过来的信息 (客户端--->写入到服务器)InputStream in = socket.getInputStream();//控制台打印客户端发送过来的信息int len=-1;byte []b=new byte[1024];while((len=in.read(b))!=-1){System.out.println(new String(b,0,len));}//服务器响应客户端的请求OutputStream out = socket.getOutputStream();out.write("服务器收到".getBytes());//关闭流in.close();out.close();//关闭客户端socket.close();//服务器一般不关s.close();
    }
    

    }

TCP客户端请求服务器端过程

  1. 创建客户端对象 指定要连接的服务器的地址和端口号
  2. 获得输出流对象,将要发送的数据写到服务器端
  3. 客户端发送数据结束标识,告诉服务器数据发送完毕
  4. 接受服务器响应的数据
  5. 关闭流
  6. 关闭客户端对象

    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;public class Client {public static void main(String[] args)throws Exception {//创建客户端对象并初始化要连接的服务器端的地址和端口Socket s=new Socket("192.168.88.1",6000);//获得输出流,将数据发送给服务器OutputStream out = s.getOutputStream();out.write("嗨,我是客户端 ".getBytes());//给服务器标识 客户端已经完成了数据的发送s.shutdownOutput();//接受服务器返回来的信息InputStream in = s.getInputStream();int len=-1;byte[] b=new byte[1024];while((len=in.read(b))!=-1){System.out.println(new String(b,0,len));}//关闭流out.close();in.close();//关闭客户端s.close();}}
    

多线程文件上传练习

服务器端

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;/*** 多线程实现文件上传* * @author YandeHu**/
public class Server {public static void main(String[] args) throws Exception {// 创建服务器端 ServerSocket类 设置端口号ServerSocket s = new ServerSocket(6000);while (true) {// 创建客户对象 开启客户端连接final Socket socket = s.accept();// 创建线程匿名内部类new Thread() {@Overridepublic void run() {try {// 客户端获取输入流对象将客户端的消息显示出来InputStream in = socket.getInputStream();// 创建文件输出流FileOutputStream fos = new FileOutputStream(System.currentTimeMillis() + ".jpg");int len = -1;byte[] b = new byte[1024];while ((len = in.read(b)) != -1) {fos.write(b);}// 响应客户端OutputStream out = socket.getOutputStream();out.write("文件上传成功".getBytes());// 关闭流in.close();fos.close();out.close();// 关闭客户端socket.close();} catch (IOException e) {e.printStackTrace();}}}.start();}}
}

客户端

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;public class Client {public static void main(String[] args)throws Exception {//创建客户端类Socket s=new Socket("192.168.88.1",6000);//创建文件输入流FileInputStream fis=new FileInputStream("E:\\微信、ps素材\\微信素材文件\\图片素材\\爱情.jpg");//获取输出流OutputStream out = s.getOutputStream();int len=-1;byte[]b=new byte[1024];while((len=fis.read(b))!=-1){out.write(b,0,len);}//设置标记 标记上传文件结束s.shutdownOutput();//获得服务器响应的信息InputStream in = s.getInputStream();int len1=-1;byte[]n=new byte[1024];while((len1=in.read(n))!=-1){System.out.println(new String(n,0,len1));}//关闭流fis.close();out.close();in.close();//关闭客户端s.close();}
}

网络编程 UDP通信的过程 TCP通信过程 多线程文件上传相关推荐

  1. kuangshenshuo-网络编程-TCP实现聊天和文件上传

    网络编程 -> TCP实现聊天和文件上传 1. TCP实现聊天 1.1 客户端 ① 连接服务器 Socket ② 发送消息 import java.io.IOException; import ...

  2. Python3之socket编程(TCP/UDP,粘包问题,数据传输、文件上传)

    一.socket的定义 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后 ...

  3. 网络编程2——CS模型的TCP通信流程总结 及 server、client的实现

    一.socket模型创建流程图 二.server的实现 1,报错文件先写好,基本头文件写好,C的.网络的 2,创建socket,定义文件描述符lfd,记得要返回值检查 3,创建bind函数,其中第二个 ...

  4. 糖儿飞教你学C++ Socket网络编程——6.控制台版的TCP通信程序

    根据图2-1的TCP通信程序的流程,下面编程实现一个控制台版的TCP通信程序,程序分为服务器端和客户端,双方可以相互发送消息,运行效果如图2-4所示. 图2-4 控制台版的TCP通信程序(左图为服务器 ...

  5. 网络编程应用:基于TCP协议【实现文件上传】--练习

    要求: 基于TCP协议实现一个向服务器端上传文件的功能 客户端代码: package Homework2;import java.io.File; import java.io.FileInputSt ...

  6. 【java网络编程】用TCP socket实现多线程图片上传

    单线程上传 服务端: 客户端: 多线程上传 修改服务端: 修改客户端 单线程上传 服务端: public static void main(String[] args) {try ( // 创建一个S ...

  7. 文件在上传过程中发生异常服务器端,文件上传服务器端

    文件上传服务器端 内容精选 换一换 本节操作介绍本地Linux操作系统主机通过SCP向Linux云服务器传输文件的操作步骤.登录管理控制台,在ECS列表页面记录待上传文件的云服务器的弹性公网IP.上传 ...

  8. Java21-day12【网络编程(网络编程入门(ip地址、端口、协议、InetAddress)、UDP通信程序、TCP通信程序)】

    视频+资料[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg   提取码:zjxs] Java基础--学习笔记(零起点打开java世界的大门)--博 ...

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

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

最新文章

  1. 微信小程序1. Forgot to add page route in app.json. 2. Invoking Page() in async task.
  2. Chrome DevTools 调研笔记
  3. JEECG 开源平台全视频和文档
  4. oracle两个约束,Oracle中的约束介绍(2)
  5. redis原理及实现
  6. 误删除MySQL数据库表的ibd文件怎么办
  7. Go 用JSON加载表格数据
  8. 新华三模拟器STP和RSTP及其MSTP的作用与配置
  9. vector容器,容量和大小的操作
  10. android studio for android learning (二十八) android基础知识
  11. 无线充电主控芯片方案
  12. 路由端口的限制与破解
  13. js/vue 动态获取浏览器宽度/高度
  14. 闲置的eSATA接口,会影响Windows 7的启动速度
  15. 计算机视觉算法面试题面经
  16. Android Studio设置Eclipse快捷键
  17. 解密为何 Golang 能从众多语言中脱颖而出
  18. 五问补盲(四)| 好用的补盲激光雷达,得满足哪些条件?
  19. 0day一些概念的解释,及Scene组、iNT组、TOP组的一些介绍
  20. 阿里云部署公司网盘实例

热门文章

  1. leetcode-45 跳跃游戏II
  2. pprof搭配ceph tell命令分析ceph内存
  3. 计算机网络面试题(一)
  4. Spring Boot 整合Redis 实现缓存
  5. 关于鼠标、键盘的几个例子
  6. (转)使用 Spring缓存抽象 支持 EhCache 和 Redis 混合部署
  7. centos7下安装docker(11容器操作总结)
  8. 【python】解压文件
  9. FWFT FIFO读操作注意
  10. easyui-menu 解决disableItem不能禁用绑定事件的方法