第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
类 InetAddress java.lang.Object
-> java.net.InetAddress 已实现的接口: Serializable
已知子类: Inet4Address, Inet6Address public class InetAddress extends Object implements Serializable
该类表示互联网协议ip地址

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

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

升级:

java.net
类 Inet6Address java.lang.Object
-> java.net.InetAddress
-> java.net.Inet6Address 所有已实现的接口:Serializable public 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.DatagramSocket All Implemented Interfaces:
Closeable, AutoCloseable
已知直接子类:
MulticastSocket public 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.DatagramPacket public 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 stub
System.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 stub
System.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. 第84节:Java中的网络编程(中)

    第84节:Java中的网络编程(中) 实现客户端和服务端的通信: 客户端需要的操作,创建socket,明确地址和端口,进行键盘录入,获取需要的数据,然后将录入的数据发送给服务端,为socket输出流, ...

  2. 第62节:探索Java中的网络编程技术

    前言 感谢! 承蒙关照~ 探索Java中的网络编程技术 网络编程就是io技术和网络技术的结合,网络模型的定义,只要共用网络模型就可以两者连接.网络模型参考. 一座塔有七层,我们需要闯关. 第一层物理层 ...

  3. Java中的网络编程

    ​ Java中的网路编程主要是Java的Socket编程,属于JavaEE中的高级的部分,以下内容是对java网路编程的一个小结,代码都是经过编译调试的 C/S程序应用:客户/服务器模式,如QQ客户端 ...

  4. JAVA中-面向网络编程---单层交互

    面向网络编程---单层交互: 客户端说明: /* * 实现TCP客户端,链接到服务器 * 和服务器实现数据交互 * 实现TCP客户端的类 java.net.Scoket * 构造方法: * Socke ...

  5. Java中的网络编程-2

    Socket编程:(一般的网络编程) <1> 两个 JAVA 应用程序可通过一个双向的网络通信连接, 实现数据交换, 这个双向链路的一段称为一个 Socket. <2> Soc ...

  6. Java中的网络编程-3

    用户数据协议(UDP)是网络信息传输的另外一种形式, 基于UDP的通信不同于基于TCP的通信, 基于UDP的信息传递更快, 但是不提供可靠的保证. 使用UDP传输数据时, 用户无法知道数据能否正确地到 ...

  7. Java中的网络编程-1

    计算机网络:将分布在不同地区的计算机与专门的外部设备用通信线路互连成一个规模大.功能强的网络系统, 从而使众多计算机 可以方便的互相传递信息, 共享硬件.软件.数据信息等资源. 计算机网络的主要功能: ...

  8. 读懂Java中的Socket编程

    Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的S ...

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

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

随机推荐

  1. js兼容总结之获取非行间样式

    非行间样式案例 #div1 { width: 200px; height: 200px; background: red; } IE获取非行间样式 var oDiv = document.getEle ...

  2. PO VO BO DTO POJO DAO(转)

    2EE开发中大量的专业缩略语很是让人迷惑, 特别是对于刚毕业的新人来说更是摸不清头脑.若与公司大牛谈技术人家出口就是PO VO BO DTO POJO DAO 等,让新人们无比仰慕大牛. PO(bea ...

  3. 自适应布局webkit-box的用法

    Flexible Box Model(灵活盒子模型)在平常的web横排布局中,会经常用到float或display:inline-block,但是在多种不同宽度的移动设备的自适应布局中用的话,还得设置 ...

  4. [shell基础]——split命令

    测试文本 # cat name1.txt name1 alvin1 name2 alvin2 name3 alvin3 name4 alvin4 此时目录下就只有这个文件 # ls name1.txt ...

  5. Sicily 1790. Single Round Match

    高进度求余 或者 将一个数奇位上的数字与偶位上的数字分别加起来,再求它们的差,如果这个差是11的倍数(包括0),那么,原来这个数就一定能被11整除. #include <iostream> ...

  6. Webbench源代码分析(转载)

    转载地址 http://blog.csdn.net/kangroger/article/details/42500703 Web Bench是一个网站压力测试的工具.其最后更新时间是2004年,已经十 ...

  7. 反射:修改请求头HttpWebRequest/Webclient Header属性的date值-&quot;此标头必须使用适当的属性进行修改&quot;

    场景:调用外部接口,接口要求Header信息里面包涵Date信息,且Date信息必须是格式化好的,(他们用的是Java),但是C#默认的是Date属性不能被修改, 所以就会出现下面的错误: 未处理的异 ...

  8. [android] 手机卫士手机定位的原理

    手机定位的三种方式:网络定位,基站定位,GPS定位 网络定位,手机连上wifi 2g 3g的时候,手机会有一个ip,误差很大 基站定位,精确度与基站的多少有关,几十米到几公里的误差 GPS定位,至少需 ...

  9. Git服务器,仓库的hook监控

    简单应用场景:代码提交到git仓库,仓库监控到变化的jar包,然后把变化的jar包推到私服maven仓库. Git预定义了触发时机: ClientSide hooks: 1 pre-commit,当执 ...

  10. Android 监听 WiFi 开关状态

    Android 监听 WiFi 开关状态 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/70854309 本文出自[赵彦军的博客] ...