当前位置: 首页 > 编程日记 > 正文

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

网络概述

协议

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

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();}
}

相关文章:

set debug mode for flex builder

1. 要具备debug功能,我们必须要首先安装Flash Player Debug 版本。windows版本2. 安装好debug版本后,我们还需要添加日志的配置文件mm.cfg。该配置文件存放的目录如下:Macintosh OS X MacH D:Library:Application Support:macromedia:mm.cfgM…

XML 解析XML文档 XML约束

XML 什么是XML Extensible Markup Language(可扩展的标记语言)他是一个语言,有自己的语法,和Java以及其他的编程无关“标记” 在文件中包含类似于张三 ,这种用尖括号括起来的叫标记,使用来标记数据的。标…

Host Only、NAT和Bridge三种网络连接

Host Only、NAT和Bridge三种网络连接 在安装好了Linux镜像之后,如何连接物理机和虚拟机呢?这就需要网络连接,网络连接有三种:HostOnly、NAT、Bridge,它们都可用于Guest虚拟机和Host物理机之间的网络通信。 一、三者的不…

OSPF 提升 一 ----基础

ospf ccnp内容 一 link-state protocols IGP 开放式的最短路径优先协议 公有协议支持中到大型的网络 spf算法 链路状态协议1.传送的LSA link status advertisement 链路状态通告 包换拓扑信息具体包括:网段的前缀 掩码 连接的路由器的…

C#实现网页截图功能

//需要添加System.Drawing及System.Windows.Forms引用 using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.Windows.Forms; namespace 网页截图 { class Program { [S…

微软发布全新多核心操作系统原型:Barrelfish

Windows 7完成之后,很多人开始把目光投向微软的下一代服务器和客户端操作系统Windows 8,不过今天微软放出了一套全新操作系统的原型,开发代号“Barrelfish”。该系统由微软剑桥研究院和苏黎世理工学院联合全新开发,专为现在和未来…

Docker应用:Kubernetes(容器集群)

Docker应用:Kubernetes(容器集群) 原文:Docker应用:Kubernetes(容器集群)阅读目录: Docker应用:Hello WorldDocker应用:Docker-compose(容器编排)…

通道应用——抠头发

通道应用——抠头发 原图: 效果图: 步骤:1、打开原图的“通道面板”,选择颜色对比分明的绿色通道,并新建一个绿色通道副本;2、选择“图像”-“调整”-“色阶”,调节色阶使得头发颜色更分明些&am…

2017 ACM/ICPC 南宁赛区小结 By JSB @ Reconquista

Statistics TYPE: Onsite ContestNAME: 2017 - ICPC - Asia NanningPLAT: pc^2TIME: 2017/11/26 09:00-14:00LOCA: Guangxi UniversityTEAM: Reconquista[shb,lsmll,jsb]RANK: 8/227 3.52%SOLVE: 8/13PENALTY: 451 ◦ A - 1 ◦ E - 123 (2) ◦ F - 8 ◦ H - 55 ◦ I - 97 (1) ◦…

用户管理系统控制台版连接数据库

建User表 CREATE TABLE user (id INT(11) NOT NULL AUTO_INCREMENT,name VARCHAR(20) DEFAULT NULL,pwd VARCHAR(20) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEINNODB AUTO_INCREMENT5 DEFAULT CHARSETutf8User对象(javaBean) public class User {priva…

微信小程序组件 日历

js文件 use strict;let choose_year null,choose_month null;const conf {data: {hasEmptyGrid: false,showPicker: false},onLoad() {const date new Date();const cur_year date.getFullYear();const cur_month date.getMonth() 1;const weeks_ch [ 日, 一, 二, 三, …

node编写定时任务,for循环只执行一遍的解决办法

在用node编写定时任务时候,发现for循环只执行i0这一次,就不接着循环执行了,下面贴上代码: exports.task async function(ctx){ let { app } ctx, resultArr1 [],//查询的数据库数据 resultArr2 [];//查询的数据库…

oledb读不到dbf文件内容

最近在处理一批VFP的数据库,使用OleDB方式读取一直很正常,前两天突然碰到一张表怎么也读不出数据来,害我瞎忙了一整天,在研究了DBF文件结构后发现记录前的0x20位置存储的是0x2A。 一查才知道是删除标记,我倒&#xff0…

好用的截图工具

好用的截图工具...简单好用而且不大转载于:https://blog.51cto.com/dd123/208983

“AS3.0高级动画编程”学习:第二章转向行为(上)

因为这一章的内容基本上都是涉及向量的,先来一个2D向量类:Vector2D.as (再次强烈建议不熟悉向量运算的童鞋,先回去恶补一下高等数学-07章空间解释几何与向量代数.pdf) package {import flash.display.Graphics;public class Vector2D {privat…

用Azure VM + Azure Database for MySQL搭建Web服务

仍然是一篇动手实验,实验演示如何在Azure的虚拟机内部署一个Web服务器,并且使用Azure Mysql PaaS作为本应用的数据库。此实验的目的一方面是为了演示Azure IaaS层和PaaS服务配合使用的常规操作,另一方面是为之后的文章打基础,后续…

C3P0_and_pro.properties配置文档代码

C3P0-config.xml配置文件 <c3p0-config> <!-- 默认配置&#xff0c;如果没有指定则使用这个配置 --> <default-config><property name"driverClass">com.mysql.jdbc.Driver</property><property name"jdbcUrl">jdbc:…

电视信号——行场同步

电视信号分NTSC制和PAL制两种制式, NTSC制每秒刷新60次, 而PAL制每秒刷新50次。 水平消隐&#xff1a;电子枪从左到右画出象素&#xff0c;它每次只能画一条扫描线&#xff0c;画下一条之前要先回到左边并做好画下一条扫描线的准备&#xff0c;这之间有一段时间叫做水平消隐&am…

QWidget一生,从创建到销毁事件流

版权声明&#xff1a;若无来源注明&#xff0c;Techie亮博客文章均为原创。 转载请以链接形式标明本文标题和地址&#xff1a;本文标题&#xff1a;QWidget一生&#xff0c;从创建到销毁事件流 本文地址&#xff1a;http://techieliang.com/2017/11/319/ 代码较多&#xff…

事物_软件分层

事务 事务是&#xff1a;在数据库指业务处理的”一个业务“对应数据库中的多个步骤的操作。例如银行转账。 面对的问题&#xff1a;程序接受请求后&#xff0c;会至少发送两条SQL语句&#xff0c;两条语句之间会有时间的间隔&#xff0c;如果间隔时间期间Mysql服务器发生意外&a…

雷林鹏分享:jQuery EasyUI 数据网格 - 创建属性网格

jQuery EasyUI 数据网格 - 创建属性网格 属性网格(property grid)带有一个内置的 expand(展开)/collapse(合并) 按钮&#xff0c;可以简单地为行分组。您可以简单地创建一个可编辑属性的分层(hierarchical)列表。 设置 HTML url"propertygrid_data.json" showGroup&q…

as3.0中如何阻止事件冒泡?

as3.0中的事件冒泡机制有时候会很烦人&#xff0c;比如一个Sprite(方便下文描述就命名为Container吧)把另一外Sprite(称为Child吧)做为子元素套进来以后&#xff0c;如果两个Sprite都注册了Mouse_Down事件&#xff0c;要想在Child上点击鼠标时系统只响应Child的Mouse_Down事件&…

紫色回归线:雅虎中国的运筹学

共同体并不意味着一个我们可以获得享受的世界&#xff0c;而是一个我们热切希望栖息、希望重新拥有的世界。—— 齐格蒙特.鲍曼紫色回归线&#xff1a;雅虎中国的运筹学紫色是比较中性的颜色&#xff0c;但紫色在生活中却也是温柔、神秘、甚至性感的代词。当雅虎中国将主色调重…

JavaScript_上

javaScript JavaScript,简称JS&#xff0c;是Web开发中不可缺少的脚本语言的&#xff0c;不需要编译就可以运行&#xff08;解释性语言&#xff09;。它“寄生”在HTML体内&#xff0c;随网络传输到客户端在浏览器中运行。js代码可以写到html的任何地方。一般写在 body 结束标签…

java类加载的表现形式

java中的类是动态加载的&#xff0c;我们先看一下我们常用的类加载方式&#xff0c;先有一个感性的认识&#xff0c;才能进一步 深入讨论,类加载无非就是下面三种方式。 class A{} class B{} class C{} public class Loader{ public static void main(String[] args) throws Ex…

.net core在vs开发环境下脱离iis运行

.net core相比之前.net的是一个可以跨平台&#xff0c;脱离iis运行的语言&#xff0c;并且项目启动的效率要比用iis启动快&#xff0c;可以说进一步提高了开发的效率。要想自己的项目core脱离iis&#xff0c;首先选择vs启动项目的载体&#xff1a; 如下图&#xff0c;不要选择I…

Sublime遇见中文乱码问题?

今天在写demo的时候&#xff0c;突然发现html页面上的中文在浏览器上显示乱码~&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 这时&#xff0c;我根据网上的提示安装了两个插件:converttoUtf-8&#xff0c;support Gbk ~~~然而&#xff0c;好像无济于事~~ 于是…

Dynamics AX 2009 升级PreSynchnoize时的无反应的解决

问题: 安装完升级补丁后在Data upgrade cockpit窗口点击Run或Train Run按钮后Update Job没有开始&#xff0c;始终显示为Ready状态。 #1 原因&#xff1a;数据库以前已经做过升级&#xff08;例如安装过AX 2009 SP1&#xff09;并且已经存在一个DataUpdate批处理组但是针对这个…

如何 搭建 RMAN 备份平台

一&#xff0e; RMAN 的一些理论知识RMAN Catalog 和 Nocatalog 的区别http://blog.csdn.net/tianlesoftware/archive/2010/06/02/5641763.aspxRMAN 系列&#xff08;一&#xff09;---- RMAN 体系结构概述http://blog.csdn.net/tianlesoftware/archive/2010/06/09/5659701.asp…

git更新代码报错,error: The following untracked working tree files would be overwritten by ch

git忽略大小写导致的&#xff0c; git config --add core.ignorecase true 转载于:https://www.cnblogs.com/newcbs/p/10732662.html