第78节:Java中的网络编程(上)

前言

网络编程涉及ip,端口,协议,tcp和udp的了解,和对socket通信的网络细节.

网络编程

OSI开放系统互连

网络编程指IO加网络

TCP/IP模型:

  1. 应用层
  2. 传输层
  3. 网际层
  4. 主机到网络层

OSI模型:(封装) 网络1封包->网络2拆包

  1. 应用层
  2. 表示层
  3. 会话层
  4. 传输层
  5. 网络层
  6. 数据链路层
  7. 物理层

网络通讯要素:

  1. ip地址
  2. 端口号
  3. 传输协议

主机名和ip地址是对应的,默认的主机名:localhost

java.net
类 InetAddressjava.lang.Object
-> java.net.InetAddress已实现的接口: Serializable
已知子类: Inet4Address, Inet6Addresspublic class InetAddress extends Object implements Serializable
该类表示互联网协议ip地址

ip地址是ip使用32或128位无符号数字,它是一种低级的协议,UDP和TCP协议都是在它的基础上构建的.

InetAddress的实例包含ip地址,相应的主机名

升级:

java.net
类 Inet6Addressjava.lang.Object
-> java.net.InetAddress
-> java.net.Inet6Address所有已实现的接口:Serializablepublic final class Inet6Address extends InetAddress
该类表示互联网协议第6版地址

获取ip地址

package com.dashucoding.ip;import java.net.InetAddress;
import java.net.UnknownHostException;public class IPDemo {public static void main(String[] args) throws UnknownHostException {// TODO Auto-generated method stub// ip地址对象 InetAddress// 获取本地主机地址对象InetAddress ip = InetAddress.getLocalHost();// 获取主机地址和主机名System.out.println(ip.getHostAddress() + ":" + ip.getHostName());InetAddress ip2 = InetAddress.getByName("192.168.2.151");// 获取主机地址和主机名System.out.println(ip.getHostAddress() + ":" + ip.getHostName());// 主机名是需要进行解析的}}

域名解析_查表

C:\Windows\System32\drivers\etc

DNS域名解析服务器,宽带服务.配置DNS域名服务器主机,一个网址浏览要到它的Ip地址,要找到,就会把ip地址放到DNS域名解析服务器,供给本地使用宽带连接的使用,就可以在浏览器中找到ip地址,浏览网址了.

DNS服务器软件,把你要浏览的地址ip写进去就可以了

有些软件需要进行注册序列号?

// hosts 文件配置
127.0.0.1 www.###.cn // 该域名地址

端口

端口,为物理端口,一台电脑发送信息给另一台电脑的软件,发送ip地址完, 要带上端口号, 然后 对应另一台接收消息的软件 有个软件应用程序的数字标识,为逻辑端口, 这样就可以对应发送到另一台电脑上的对应软件接收消息.

我今天要去一家酒店去了地址,到了楼层, 要知道哪个房间号,才知道对应做什么事.

传输协议

TCP和UDP: 传输协议,传输规则,通讯规则,传输层.

UDP,不需要建立连接.我发给你信息,不管你在不在,我就发给你了.我送你东西,写个地址,发到你家就行.有个包,装东西,有大小限制,最多是64k的限制数据.(好处,速度快,不可靠)

TCP发数据,要确保连接是不是畅通的.TCP是通过三次握手完成的,确保数据的连接畅通.用流行的话语:

完成了三次TCP握手:

女朋友发给男朋友
:“在吗?”

男朋友回复女朋友
:“我在!”

女朋友回复男朋友
:“我知道了”

这样爱情可靠,但是很浪费时间的,这样维护情感有点耗时,但是很可靠.

TCP断开就不传了,UDP不管.电话来形容TCP,对讲机来形容UDP.

Socket

Socke <-> Socket
数据在两者之间通过IO传输,传输协议TCP或UDP

Socket就像两端插口,传输协议不一样,Socket插口也是由不同的类型的.数据在两者之间进行传输,数据是基于网络的io流进行传输的,传输过程就是传入和传出的过程

UDP_发送端_out

java.net
Class DatagramSocket
java.lang.Object
-> java.net.DatagramSocketAll Implemented Interfaces:
Closeable, AutoCloseable
已知直接子类:
MulticastSocketpublic class DatagramSocket extends Object implements Closeable
该类为用于发送和接收数据报数据包的套接字,数据报套接字是分组传送服务的发送或接收点.

例子:

DatagramSocket s = new DatagramSocket(null);
s.bind(new InetSocketAddress(8888));DatagramSocket s = new DatagramSocket(8888);

构造方法摘要

方法 说明
DatagramSocket() 构造数据报套接字并将其绑定到本地主机上的任何可用端口
DatagramSocket(DatagramSocketImpl impl) 使用指定的DatagramSocketImpl创建一个未绑定的数据报套接字
DatagramSocket(int port) 构造数据报套接字并将其绑定到本地主机上的指定端口
DatagramSocket(int port, InetAddress laddr) 创建一个数据报套接字,绑定到指定的本地地址
DatagramSocket(SocketAddress bindaddr) 创建一个数据报套接字,绑定到指定的本地套接字地址

receive(DatagramPacket p):从此套接字接收数据报包
send(DatagramPacket p):从此套接字发送数据报包

java.net
Class DatagramPacket
java.lang.Object
-> java.net.DatagramPacketpublic final class DatagramPacket extends Object
该类表示数据报包将数据封装到数据包中,数据包对象为DatagramPacket

数据包

DatagramPacket(byte[] buf, int length)
// 字节数组来的

构造一个DatagramPacket用于接收长度的数据包length.

receive
public void receive(DatagramPacket p) throws IOException
此套接字接收数据报包
返回, DatagramPacket的缓冲区填充了接收的数据
数据报包也包含发送的ip地址和发送方的端口号

UDPSend

package com.dashucoding.udp;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;public class UDPSend {public static void main(String[] args) throws IOException {System.out.println("udp 发送端 run");// 先建立upd的socket 面向对象编程// 将数据封装到数据包中// 使用Socket对象的send方法// 将数据包发送出去// 关闭资源DatagramSocket ds = new DatagramSocket();// 数据String text = "我是发送端,发送的数据";// 将数据转成字节数组byte[] buf = text.getBytes();// 将字节数据封装到数据包中DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("你的ip地址"),10000);// 发送ds.send(dp);// 发完关掉,不然留着资源干嘛ds.close();}}
package com.dashucoding.udp;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;public class UDPRece {public static void main(String[] args) throws IOException {System.out.println("udp 接收端 run");// 定义udp接收数据,显示在屏幕上// 先有插座嘛,udpsocket服务// 接收数据前 -> 先将数据存储到数据包中// 先定义数据包// 数据包对象会获取数据包中的内容,发送端的ip和端口// 关闭资源// 有upsocket服务DatagramSocket ds = new DatagramSocket(10000);// 接收数据,接收字节数据byte[] buf = new byte[1024];// 定义包DatagramPacket dp = new DatagramPacket(buf, buf.length);// 还没存到数据包,进行存储ds.receive(dp); // 阻塞String ip = dp.getAddress().getHostAddress();int port = dp.getPort();String text = new String(dp.getData(),0,dp.getLength());System.out.println(ip+" : "+port+" : "+text);// 关闭资源ds.close();}}

键盘录入

发送端:

package com.dashucoding.udp2;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;public class UDPSend2 {public static void main(String[] args) throws IOException {// TODO Auto-generated method stubSystem.out.println("udp2 发送端 run");DatagramSocket ds = new DatagramSocket();// 数据来源于键盘录入BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));String line = null;while ((line = bufr.readLine()) != null) {if("over".equals(line)) {break;}// 将数据转成字节数组byte[] buf = line.getBytes();// 将字节数据封装到数据包中DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("你的ip地址"), 10002);ds.send(dp);// 发完关掉,不然留着资源干嘛}ds.close();}}

接收端:

package com.dashucoding.udp2;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;public class UDPRece2 {public static void main(String[] args) throws IOException {// 有upsocket服务System.out.println("udp2 接收端 run");DatagramSocket ds = new DatagramSocket(10002);while (true) {// 接收数据,接收字节数据byte[] buf = new byte[1024];// 定义包DatagramPacket dp = new DatagramPacket(buf, buf.length);// 还没存到数据包,进行存储ds.receive(dp); // 阻塞String ip = dp.getAddress().getHostAddress();int port = dp.getPort();String text = new String(dp.getData(), 0, dp.getLength());System.out.println(ip + " : " + port + " : " + text);// 关闭资源}// ds.close();}
}

群聊工程

变化ip地址192.168.1.255

TCP

Socket()
通过系统默认类型的SocketImpl创建未连接套接字Socket(InetAddress address, int port)
创建一个流套接字并将其连接到指定ip地址的指定端口Socket(String host, int port)
创建一个流套接字并将其连接到指定主机上的指定端口号getOutputStream()返回此套接字的输出流

网络编程_TCP_服务端

package com.dashucoding.tcp;import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;public class TCPClient {public static void main(String[] args) throws UnknownHostException, IOException {// TODO Auto-generated method stub// 建立tcp的客户端socket 明确服务端的地址和端口// socket io流// 获取socket流System.out.println("客户端运行");// 建立tcp的客户端socket,明确服务端的地址和端口Socket s = new Socket("ip地址",20003);// socket输出流数据发送OutputStream out = s.getOutputStream();// 通过socket输出流将数据发送out.write("hello tcp 来了".getBytes());// 关闭s.close();}}
package com.dashucoding.tcp;import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;public class TCPServer {public static void main(String[] args) throws IOException {// TODO Auto-generated method stub// 获取客户端的数据,在屏幕上// 思路// 创建服务端的socket,明确端口,监听一个端口// 服务端只要获取到链接过来的客户端就可以和指定的客户端通信了// 通过获取客户端的读取流对象读取客户端发来的数据.// 显示屏幕上System.out.println("服务端运行");// 创建服务端的socket,明确接收端口ServerSocket ss = new ServerSocket(20003);while (true) {// 服务端只要获取到连接过来的客户端就可以和指定的客户端通信Socket s = ss.accept();String ip = s.getInetAddress().getHostAddress();System.out.println(ip + "...connected");// 通过获取客户端的读取流对象读取客户端发送来的数据InputStream in = s.getInputStream();// 流操作byte[] buf = new byte[1024];int len = in.read(buf);String text = new String(buf, 0, len);System.out.println(text);// 关闭s.close();}// ss.close();}}

客户端和服务端交互

客户端:

package com.dashucoding.tcp2;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;public class TCPClient2 {public static void main(String[] args) throws UnknownHostException, IOException {// TODO Auto-generated method stub// 实现客户端和服务端的收发过程System.out.println("客户端2 启动");// 创建客户端的socket对象 Socket s = new Socket("ip地址",20004);// 发送数据,通过socket输出流完成OutputStream out = s.getOutputStream();out.write("服务端,我来了".getBytes());// 读取服务端返回的数据,通过socket输入流InputStream in = s.getInputStream();byte[] buf=new byte[1024];int len = in.read(buf);String text = new String(buf,0,len);System.out.println(text);// 关闭资源s.close();}}

服务端:

package com.dashucoding.tcp2;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;public class TCPServer2 {public static void main(String[] args) throws IOException {// TODO Auto-generated method stubSystem.out.println("服务端2 启动");// 创建tcp服务端socket明确端口ServerSocket ss = new ServerSocket(20004);while (true) {// 获取客户端Socket s = ss.accept();System.out.println(s.getInetAddress().getHostAddress() + "...");// 读取客户端的发送过来的数据InputStream in = s.getInputStream();byte[] buf = new byte[1024];int len = in.read(buf);String text = new String(buf, 0, len);System.out.println(text);// 给客户端回馈数据OutputStream out = s.getOutputStream();out.write("客户端,我已经收到".getBytes());// 关闭客户端s.close();}// 关闭服务端// ss.close();}}

小结

网络编程到网络模型:一开始7层到4层

传输层的了解

网络通讯:

  1. ip:用于网络中主机的数字标识
  2. 端口:用于应用程序的数字标识
  3. 传输协议:用于数据传输的规则

TCP和UDP的区别

TCP: 面向连接,三次握手,速度慢,可靠
UDP: 面向无连接,速度快,不可靠

实现UDP的通信:

可以发送,又可以接收 DatagramSocket DatagramPacket 数据包对象

实现TCP传输:

客户端,服务端

客户端要明确服务端的ip+端口,而服务端要明确端口,通过accept的方法获取客户端对象.

结言

那么你是否掌握了,什么是tcp和udp,socket通信机制,以及ip,端口,协议.

达叔小生:往后余生,唯独有你
You and me, we are family !
90后帅气小伙,良好的开发习惯;独立思考的能力;主动并且善于沟通
简书博客: 达叔小生
https://www.jianshu.com/u/c785ece603d1

结语

  • 下面我将继续对 其他知识 深入讲解 ,有兴趣可以继续关注
  • 小礼物走一走 or 点赞

第78节:Java中的网络编程(上)相关推荐

  1. 学习Java第十九天(一):1、Java中的网络编程

    1.Java中的网络编程 什么是网络? 在计算机领域中网络是信息传输,接收共享的虚拟平台,通过它把各个点,面,体的联系到一起,从而实现这些资源的共享. 作用:信息传输,资源共享 有点:资源共享免费 O ...

  2. Java中的网络编程类(TCPUDP)

    Java中的网络编程类 n Java.net包 – TCP协议 URL URLConnection Socket ServerSocket – UDP协议 DatagramPacket Datagra ...

  3. java 中的网络编程(Socket、TCP三次握手四次挥手、TCP/UDP/URL)

    文章目录 前言 一.网络编程概述 二.网络通信要素概述 1.如何实现网络中的主机互相通信 2.网络通信协议 3.IP和端口号 4.InetAddress类 5.网络协议 6.TCP/IP协议簇 7.T ...

  4. Java中的网络编程入门

    网络编程 软件结构 C/S结构: 全称为 Client/Server 结构,是指客户端和服务器结构. B/S结构: 全程为 Browser/Server 结构, 是指浏览器和服务器结构. 网络编程,就 ...

  5. 二十五、Java中的网络编程

    1.什么是网络? 概念:在计算机领域中网络是信息传输,接收,共享的虚拟平台,通过它把各个点,面,体的联系到一起,从而实现这些资源的共享. 作用:信息传输,资源共享 优点: 资源共享免费 2.OSI七层 ...

  6. Java中的网络编程(TCP与UDP)

    什么是Socket? Socket是一个抽象的概念,一个应用程序通过Socket建立一个远程连接,而Socket内部通过TCP/IP协议把数据传送至网络. 简单的来说,Socket就是套接字,由IP地 ...

  7. Java学习之网络编程实例

    转自:http://www.cnblogs.com/springcsc/archive/2009/12/03/1616413.html 多谢分享 网络编程 网络编程对于很多的初学者来说,都是很向往的一 ...

  8. Java中的多线程编程(超详细总结)

    文章目录 Java中的多线程编程(超详细总结) 一.线程与多线程的概念 二.线程与进程之间的关系 三.一个线程的生命周期 四.多线程的目的和意义 五.线程的实现的方式 Java中的多线程编程(超详细总 ...

  9. Java学习笔记-网络编程

    Java提供了网络编程,并且在实际中有着大量运用 网络编程 网络编程概述 网络模型 OSI参考模型 TCP/IP参考模型 网络通讯要素 IP地址 端口号 传输协议 网络参考模型 网络通讯要素 IP地址 ...

最新文章

  1. LINUX环境下资源下载中文目录及中文文件名称问题
  2. mysql5.6.20二进制安装
  3. eureka多台注册中心_微服务实战系列(五)-注册中心Eureka与nacos区别
  4. linux rpc.statd服务 获取系统性能统计 简介
  5. ubuntu下安装java和tomcat安装
  6. java嵌入groovy脚本_Java封装groovy脚本引擎并支持脚本包含(include)功能
  7. 如何通过Windows Server 2008 R2建立NFS存储
  8. 纷享逍客宣布完成E+轮融资 长山兴资本领投
  9. 如何迁移outlook邮件到另一个硬盘_猎头如何有效的搜寻与筛选简历
  10. 批量替换字符串,将其中的数字递增(两种方法)和circlr.js插件的使用
  11. cenos安装erlang
  12. JS(JavaScript)的初了解8(更新中···)
  13. jquery 获取 选中的radio的值
  14. 数据结构银行叫号系统
  15. 知网caj转pdf格式的方法
  16. 设置CRT使用Console连接网络设备
  17. CODING 告诉你硅谷的研发项目管理之道(5)
  18. 《剑指offer》攻略
  19. 如何查看bios版本号?
  20. 备受企业青睐的商业智能BI工具究竟好在哪里?

热门文章

  1. MediaCodec编码
  2. sdut4259种西瓜 [原题: 2018西安邀请赛K题]【线段树】
  3. Hexo_更换主题(Next)
  4. 用latex做幻灯片三种位置插入图片问题
  5. 1042: 【入门】求1992个1992的乘积的末两位数是多少
  6. Linux自动删除tomcat日志文件
  7. 高中信息技术高考精讲IP协议及域名解析历年考纲真题分布
  8. UE4虚幻争霸(帕拉贡)资源提取 (模型、贴图提取)
  9. Android翻页效果原理实现之引入折线
  10. 做好网络舆情监测监控的重要性,TOOM网络舆情监控平台建设方案?