黑马程序员_源自梦想 网络编程

-------  android培训 java培训 、期待与您交流! ----------

网络编程---概述

网络模型
  OSI参考模型
  TCP/IP参考模型
网络通讯要素
 IP地址
 端口号
  传输协议

1.找到对方IP
2.数据要发送到对方指定的应用程序上,为了标识这些应用程序,所以给这些网络应用程序都用数字进行标识
  为了方便称呼这个数字,叫做端口。 逻辑端口
3.定义通信规则。这个通讯规则称为协议
  国际组织定义了通过协议TCP/IP
数据通讯的原理就是数据传输
端口
127.0.0.1//本机地址
常见默认端口:
web:80
tomcat:8080
mySql:3306
oracle:1521

网络模型

 OSI参考模型
 TCP/IP参考模型
OSI参考模型 TCP/IP参考模型
 应用层  
 表示层          应用层
 会话层  
 传输层          传输层
 网络层          网际层
 数据链路层 
 物理层         主机至网络层
我们现在有一点数据,将数据发给另一个机器,底层是怎么传输的:先要使用应用层的特点,根据应用层特点将数据先进行封装,应用层也有自己的数据表现规则(或者说数据封装规则) ,应用层就在数据的头上加了应用层的特征,加完以后往下传递,传递到表示层 ,又加一次表示层的标示 ,依次类推 ,我们称之为数据的封装 到网络层其实就是在给数据ip地址, 然后到数据链路层(通过什么方式传输出去) , 加完之后就到最后一层了, 网线就是标准的物理层设备 ,物理层设备连接上之后,就传输过去了,这个过程就是数据封包。    
  先到对方的物理层 , 然后开始解 ,这个过程就叫 数据拆包, 一次一次的不断拆,每一层都在读自己特有的能够识别的数据, 因为这两个都符合OSI参考模型  ,拆到应用层后,要看到底给谁 ,这个时候就要看看数据要走哪个端口。

IP地址

class  IPDemo
{
 public static void main(String[] args) throws Exception
 {
	  InetAddress i = InetAddress.getLocalHost();   //获取本地主机
	  System.out.println(i.toString());          
	  System.out.println("address:"+i.getHostAddress());
	  System.out.println("name:"+i.getHostName());
	//getByName在给定主机名的情况下确定主机的 IP地址
	  InetAddress ia = InetAddress.getByName("Hainuo");
	  System.out.println("address:"+ia.getHostAddress());
	  System.out.println("name:"+ia.getHostName());
 }
}

TCP和UDP

传输协议
通讯的规则,
常见的协议:TCP和UDP
UDP--(DatagramSocket(发送,接收)+ DatagramPacket(封装数据))
将数据及源和目的封装成数据包,不需要建立连接
每个数据包的大小限制在64K内.
因无连接,是不可靠协议.
不需要建立连接,速度快
简而言之:1,面向无连接;2,数据会被封包在64K以内;3,不可靠;4,速度快
举例子:QQ聊天,视频会议,桌面共享
TCP--(Socket + ServerSocket)
建立连接,形成传输数据的通道;
在连接中进行大数据量传输
通过三次握手完成连接,是可靠协议(三次握手,1,哥们在不2哥们在的3,收到你在啦)
必须建立连接,效率会稍低
简而言之:1,面向连接2,数据不用封包,可以大数据传输3,可靠4,速度稍慢。
例子:打电话

TCP传输

 |---TCP分客户端和服务端
   |--客户端对应的对象是Socket
   |--服务端对应的对象是ServerSocket
客户端:

  通过查阅socket对象,发现在该对象建立时,就可以去连接指定主机.
  因为tcp是面向连接的.所以在建立socket服务时,
  就要有服务端存在,并连接成功.形成通路后,在该通道进行数据的传输 

 步骤:
1,创建Socket服务,并指定要连接的主机和端口.
2, 获取输出流(可选输入流),进行发送数据.
3,如果有进行获取输入流,可接收服务端的数据
4.关闭客户端.
服务端:
步骤:
1,建立服务端的Socket服务,通过ServerSocket()
 并监听一个端口
2,获取连接过来的客户端对象
 通过ServerSocket的accept方法.没有连接就会等,所以这个方法是阻塞式的.
3,客户端如果发过来数据,那么服务端要使用对应的客户端对象.并获取到该客户端对象的读取流,来读取发过来的数据
并打印在控制台
4,关闭服务端(可选操作,一般不进行操作)
import java.io.*;
import java.net.*;
//需求:给服务端发送一个文本数据.
//客户端
class TcpClient
{
 public static void main(String[] args)throws Exception
 {
  //创建客户端的Socket服务,指定目的主机和端口
  Socket s = new Socket("127.0.0.1",7878);
  
  //为了发送数据,应该获取Socket流中的输出流.
  OutputStream out = s.getOutputStream();
  
  out.write("tcp ge men lai le".getBytes());
  
  s.close();
 }
}

//需求:定义端点接收数据,并打印在控制台上.
 class TcpServer
 {
  public static void main(String[] args)throws Exception
  {
   //建立服务端的socket服务,并监听一个端口.
   ServerSocket ss = new ServerSocket(7878);
   
   //通过accept方法获取连接过来的对象.
   Socket s = ss.accept();
   
   String ip = ss.getInetAddress().getHostAddress();
   
   System.out.println("ip:"+ip);
   //获取客户端发送过来的数据,那么要使用客户端对象的读取流对象方法来读取数据
   InputStream in = s.getInputStream();
   
   byte[] buf = new byte[1024];
   int len = in.read(buf);
   
   System.out.println(new String(buf,0,len));
   
   s.close();//关闭客户端
  }
 }

UDP-->发送端

1,建立udpsocket服务.
2,提供数据,并将数据封装到数据包中
3,通过socket服务的发送功能,将数据包发送出去
4,关闭资源
import java.net.*;
/*需求:通过udp传输方式,将一段文字发送出去.*/
class UdpDemo {
 public static void main(String[] args)throws Exception
 {
  //1,创建udp服务,通过DatagramSocket对象.
  DatagramSocket ds = new DatagramSocket();
  
  //2,确定数据,并封装成数据包DatagramPacket(数据包,数据包长度,地址,端口)
  byte[] buf = "udp gemen lai la".getBytes();
  DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),8533);
  
  //3,通过socket服务,将以后的数据包发送出去,通过send方法
  ds.send(dp);
  
  //4,关闭资源
  ds.close();
 }
}

UDP-->接收端

/*需求: 
 * 定义一个应用程序,用于接收udp协议传输并处理数据的. 
 *  
 * 思路: 
 * 1,定义udpsocket服务,通常会监听一个端口,其实就是给这个接受网络应用程序程序定义数字标示. 
 *   方便与明确哪些数据过来改应用程序可以处理 
 * 2,定义一个数据包,因为要存储接收到的字节数据,因为数据包对象中有更多功能,可以提取字节数据中的不同数据信息. 
 * 3,通过socket服务中的receive方法将接收到的数据存入一定一号的数据包中. 
 * 4,通过数据包对象的特有功能,将这些不同的数据去除,打印在控制台上 
 * 5,关闭资源 
 *  
 */  
  
import java.net.DatagramPacket;  
import java.net.DatagramSocket;  
  
class UdpRece   
{  
 public static void main(String[] args)throws Exception  
 {  
  //1,创建udp socket,建立端点  
  DatagramSocket ds = new DatagramSocket(8533);  
    
  //2,定义数据包,用于存储数据  
  byte[] buf = new byte[1024];  
  DatagramPacket dp = new DatagramPacket(buf,buf.length);  
    
  //3,通过服务的receive方法将接受到数据存入数据包中.  
  ds.receive(dp);  
    
  //4,通过数据包的方法获取其中的数据  
  String ip = dp.getAddress().getHostAddress();//获取地址  
  String data= new String(dp.getData(),0,dp.getLength());//获取内容  
    
  int port = dp.getPort();//获取端口     
  System.out.println("ip:"+ip+",data:"+data+",port"+port);  
    
  //5,关闭资源  
  ds.close();  
 }  
}  


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值