网络编程---概述
网络模型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,速度稍慢。
例子:打电话
|--客户端对应的对象是Socket
|--服务端对应的对象是ServerSocket
客户端:
通过查阅socket对象,发现在该对象建立时,就可以去连接指定主机.
因为tcp是面向连接的.所以在建立socket服务时,
就要有服务端存在,并连接成功.形成通路后,在该通道进行数据的传输
步骤:
1,创建Socket服务,并指定要连接的主机和端口.
2, 获取输出流(可选输入流),进行发送数据.
3,如果有进行获取输入流,可接收服务端的数据
4.关闭客户端.
服务端:
步骤:
1,建立服务端的Socket服务,通过ServerSocket()
并监听一个端口
2,获取连接过来的客户端对象
通过ServerSocket的accept方法.没有连接就会等,所以这个方法是阻塞式的.
3,客户端如果发过来数据,那么服务端要使用对应的客户端对象.并获取到该客户端对象的读取流,来读取发过来的数据
并打印在控制台
4,关闭服务端(可选操作,一般不进行操作)
2,提供数据,并将数据封装到数据包中
3,通过socket服务的发送功能,将数据包发送出去
4,关闭资源
不需要建立连接,速度快
简而言之: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();
}
}