java基础专栏—java网络编程

java网络编程

​ 在网络成层中TCP对应于四层

  • 链路层(物理通道)通常是对网络连接设备的驱动协议,例如对光纤和都对网线的驱动不一样
  • 网络层(核心层)TCP/IP协议的核心,他用于将数据分组发送
  • 传输层(主要是程序间通信) 包括TCP,UDP
  • 应用层主要是负责应用程序的协议。如HTTP,FTP

IP地址和端口号

​ 用来区分计算机的唯一标识(IP地址)

  • 手动写的
  • 分配的

采用八个二进制位表示一个段(所以最大只有255),用四个字节标识一个电脑

192.168.105.222

==192.168==:是局域的IP地址,以内的电脑都是联通的

==本机地址== :127.0.0.1,表示自己的地址

==ping操作==:ping也属于一个通信协议,是TCP/IP协议的一部分,用于检查网络通路是否可用

计算机之间的数据通讯

端口:通讯是为了避免不同程序之间的数据发错,导致丢失等等,操作系统实现的逻辑编号,每个应用程序都有被分配的端口号。

UDP协议

​ UDP是无连接通信协议,既在传输数据时。数据的发送端和接受端不建立逻辑连接,不确认接受端是否存在,也不会接受反馈。

  • UDP协议消耗资源小,通信效率高,一般用于音频,视频和普通护具的传输
  • 使用UDP不能确保数据的完整,可能会丢失
  • 数据大小被限制在64K内

InetAddress

java.net中的类都与互联网有关系

public static InetAddress getLocalHost()
//localhost本地主机,会抛出异常
//主机名和IP地址
  
public String getHostName()
  
public String getHostAddress()
  
public static InetAddress getByName(String name)
//传输别人的主机名,拿到对方的IP地址

DatagramPacket and DatagramSocket

​ DategramPacket是UDP对传输数据对象的封装,接受端的IP,端口号的封装

DatagramSocket是对封装好的数据包的传输对象,是绑定IP和端口号的套接字

//客户端
//创建DatagramPacket对象
//DatagramPacket(byte[] buf,int length,InetAddress address,int port);
byte[] data = "你好UDP".getBytes();
InetAddress inet = InetAddress.getByName("192.168.1.101");
//封装数据对象
DategramPacket datagramPacket = new DatagramPacket(data,date.length,inet,1000)
//创建Socket对象
DatagramSocket datagramSocket = new datagramSocket();
//发送数据包
datagramSocket.send(datagramSocket);
//关闭资源
datagramSocket.close()
//服务端
//创建DatagramSocket对象,必须绑定端口号DatagramSocket(int port);
DatagramSocket datagramSocket = new DatagramSocket(1000);
//创建一个字节数组用来接收数据
byte[] data = new byte[1024];
//创建一个DatagramPacket数据包对象
DatagramPacket dp = new DatagramPacket(data,data.length)
//调用DatagramSocket对象的receive(DatagramPacekt dp)接收数据
datagramSocket.receive(dp);
//拆包
	/*
	需要知道发送者的IP
		DatagramPacket中的public InetAddress getAddress()
	需要发送端的端口号
		DatagramPacket中的public int getPort()
	知道数据的字节个数,避免资源浪费
		DatagramPacket中的public int getLength()
	*/
	int length = dp.getLength();
	int port = dp.getPort();
	String address = dp.getAddress().getHostAddress();
//关闭资源
datagramSocket.close()

改进

​ 将发送端的getDatagraPacket的传输数据转换到键盘输入,在接收端DatagramSocket不关闭资源就可以了。

String sc = new Scanner(System.in);
DatagramSocket ds = new DatagramSocket();
InetAddress inet = InetAddress.getByName(192.168.1.101);
while(true){
  	String message = sc.nextLine();
	byte[] bytes = message.getBytes();
  	DatagramPacket dp = new DatagramPacekt(bytes,bytes.length,inet,1000);
}
byte[] data = new byte[1024];
DatagramSocket ds = new DatagramSocket(1000)
while(true){
  	DatagramPacket dp = new DatagramPacket(date,data.length);
  	ds.receive(dp);
  	int port = dp.getPort();
  	String address = dp.getAddress().getHostAddress();
  	int length = dp.getLength();
}

TCP协议

​ TCP协议是面向连接呃通信协议。必须建立发送与接收端的逻辑连接。

  • 客户端想服务端发出连接请求

  • 服务端向客户端发送一个响应

  • 客服端想服务端发送确认信息

  • 刻意确保传输数据的安全性

    ​==TCP与UDP的区分:==UDP只区分发送和接受,但是TCP严格区分客服端和服务器,服务器不会主动连接客户端。在连接通路完成后悔自动建立一个字节流对象(OutputStream,InputStream)

Socket

//传入服务器的IP和端口号,一运行就会去连接
public Socket(String host,int port);
//一但连接就会创建对应的输入输出流
public OutputStream getOutputStream();

public InputStream getInputStream();
Socket socket = new Socket(127.0.0.1,1000);
OutputStream out = socket.getOutputStream();
out.write("");
//网络上的流对象可以不用关闭流对象

ServerSocet

//服务器为了区分到底是那个客户端连接了,需要拿到客户端的套接字
public ServiceSocket(int port);
public Socket accept();
//这个套接字对象是通过IO传过来的
public InputStream getInpurStream();
//向客户端回写数据的方法
public OutputStream getOutputStream();
ServerceSocket server = new ServerSocket(1000);
Socket socket = server.accept();
InputStream in = socket.getInpuStream();
byte[] data = new byte[1024];
int len = in.read(data);
System.out.println(new String(data,0,len));
OutputStream out = socket.getOutputStream();
server.write(xxxx);
socket.close();
server.close();

猜你喜欢

转载自my.oschina.net/u/3483440/blog/1556184