javaseday27(网络编程)

OSI (OPEN system interconnection 开放系统互连) 参考模型

tcp/IP 参考模型

网络通讯要素

IP地址

端口号

传输协议

1、物理层 主要定义物理设备标准 如网线的接口类型 光纤的接口类型 各种传输介质的传输速率等 1、0转化为电流 到达目的地再转化为1、0 就是数模 和魔术转换  这一层被称为比特层

2、数据链路层主要将从物理层接受的数据进行MAC(全球唯一)地址(网卡的地址) 的封装与解封装 常把这一层的数据叫做帧 这一层的工作设备是交换机 数据通过交换机传输

3、网络层 从下层收到的数据进行ip地址(192.168.0.1)的封装与解封装 这一层工作的设备是路由器 常把这一层的数据叫做数据包(把数据送到指定位置)

4、传输层 定义了一些传输数据的协议与端口号(WWW端号80等) TCP(传输控制协议 传输效率低 可靠性强 用于传输可靠性要求高 数据量大的数据) UDP(用户数据传输协议 与TCP特性相反 用于传输可靠性要求不高 数据量小的数据 如QQ聊天) 主要是将下层接受到的数据进行分段和传输 到达目的地址后再进行重组 常常把这一层数据叫做段

5、会话层 通过传输层(端口号 传输端口和接受端口) 建立数据传输的通路 主要在系统之间发起会话或者接受会话请求(设备之间需要互相认识 可以是IP也可以是MAC 或者是主机名)

6、表示层 主要是进行对接受的数据进行解析、加密与解密、压缩与解压缩(也就是把计算机能识别的东西转换成人能识别的东西 如图片 声音)

7、应用层 主要是一些终端的应用比如FTP(各种文件下载) WEB(ie浏览)qq之类的 (可以理解成我们在电脑上可以看到的 终端应用)


IP地址 InetAddress

网络中设备的标识

不易记忆 可用主机名

本地回环地址127.0.0.1 主机名 localhost

端口号 应用程序通过端口号来确定用什么来解析 比如qq能传到另外一个机器的qq就是用端口号

用于标识进程的逻辑地址 不同进程的标识

有效端口0~65535 其中 0~1024系统使用或保留端口

传输协议(规则)

通讯的规则

常见的协议 TCP、UDP

UDP 给地址就送 如果不存在实际的就丢掉

将数据及源和目的封装成数据包中 不需要建立连接

每个数据包的大小限制在64l内

因无连接 是不可靠协议

不需要建立连接 速度快

TCP 先呼叫对方对方回馈 然后自己再反馈给对方让对方知道我已连接  连接断开就不传输数据

建立连接形成传输数据的通过

连接中进行大数据量传输

通过三次握手完成连接 是可靠协议

必须建立连接 效率会降低


//获取本地主机IP地址对象
InetAddress ip = InetAddress.getLocalHost();
//获取其他主机的ip地址对象
// ip = InetAddress.getByName("192.168.79.1");//ip = InetAddress.getByName("XB-201703181402");
ip = InetAddress.getByName("XB-201703181402");
System.out.println(ip.getHostAddress());
System.out.println(ip.getHostName());

可以把网站 在 系统的hosts中指定到本地回环屏蔽

Socket 就是为网络服务提供的一种机制

通信的两端都是Socket

网络通信其实就是Socket间的通信

数据在两个Socket 间通过IO传输

UDP 传输

DatagramSocket 与DatagramPacket

/*
* 建立udp接收端的思路
* 1、建立socket服务 因为是要接受数据 必须要明确一个端口号
* 2、创建数据包 用于存储接收到的数据 方便用数据包对象的方法解析这些数据
* 3、使用socket服务的receive方法将接受到的数据存储到数据包中
* 4、通过数据包的方法解析数据包中的数据
* 5、关闭资源
*/
//1、建立udp socket服务
DatagramSocket ds = new DatagramSocket(10000);
//2、创建数据包
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);


//3、使用接受方法将数据存储到数据包中
ds.receive(dp);//阻塞式
//4、通过数据包对象的方法解析其中的数据 比如 地址 端口 数据内容
String ip =  dp.getAddress().getHostAddress();
int port = dp.getPort();
String da = new String(dp.getData(),0,dp.getLength());
   System.out.println(ip+"."+port+"..."+da);
   ds.close();

/*
* 创建udp传输的发送端
* 思路
* 1、创建UDP的socket服务
* 2、将要发送的数据封装到数据包中
* 3、通过udp的socket服务将数据包发送出去
* 4.关闭socket 服务
*/
//1、udp的socket 服务 使用datagramsocket对象
DatagramSocket ds = new DatagramSocket(2552);
//2、将要发送的数据封装到数据包中
// String str = "udp传输演示";
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line =null;
while((line=br.readLine())!=null){
byte[] buf = line.getBytes();
DatagramPacket dp = new DatagramPacket(buf, buf.length,InetAddress.getLocalHost(),10000);
ds.send(dp);
if("over".equals(line))
break;
}
//使用datagrampacket 将数据封装到该对象包中
//3、通过udp的socket服务将数据包发送出去 使用send方法


//4、关闭资源
ds.close();


public class Send implements Runnable{
private DatagramSocket ds;
public Send(DatagramSocket ds){
this.ds=ds;
}


@Override
public void run(){
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line =null;
while((line=br.readLine())!=null){
byte[] buf = line.getBytes();//255用来发广播
DatagramPacket dp = new DatagramPacket(buf, buf.length,InetAddress.getByName("192.168.79.255"),10001);
ds.send(dp);
if("over".equals(line))
break;
}ds.close();
} catch (UnknownHostException e) {


e.printStackTrace();
} catch (IOException e) {


e.printStackTrace();
}
}
}


public class Rece implements Runnable{
private DatagramSocket ds;
public Rece(DatagramSocket ds){
this.ds=ds;
}


@Override
public void run() {
try {
while (true) {
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);


// 3、使用接受方法将数据存储到数据包中
ds.receive(dp);// 阻塞式
// 4、通过数据包对象的方法解析其中的数据 比如 地址 端口 数据内容
String ip = dp.getAddress().getHostAddress();
int port = dp.getPort();
String da = new String(dp.getData(), 0, dp.getLength());
System.out.println(ip + "." + port + "..." + da);
if(da.equals("886")){
System.out.println(ip+"...退出聊天室");
}
}
} catch (IOException e) {


e.printStackTrace();
}
}
}


TCP传输

Socket 和ServerSocket

建立客户端和服务器端

建立连接后 通过socket 中的io流进行数据传输

关闭socket




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值