JAVA的网络编程有三个重要的点
- IP地址
要想让网络中的计算机能够互相通信,必须为每一台计算机指定一个标识号,通过这个标识号来指定接收数据的计算机和识别发送的计算机,而IP地址就是这个标识号。也就是设备的标识 - 端口
网络的通信,本质上是两个应用程序的通信。每台计算机都有很多的应用程序,那么在网络通信时,如何区分这些应用呢?如果说IP地址可以唯一标识网络中的设备,那么端口号就可以唯一标识设备中的应用程序了,也就是设备的标识 - 协议
通过计算机网络可以使多台计算机实现链接,位于同一个网络中的计算机在进行链接和通信时需要遵守一定的规则,在计算机网络中,那些链接和通信的规则被称为网络通信协议,常见的有UDP协议和TCP协议
在网络传输中最重要的两个协议 UDP 和TCP 有共同点和区别
UDP 和TCP的重要差别:
UDP:发送端和接收端不建立联系,消耗资源少,通信效率高,面向无连接性,不能保证数据的完整性,可能会出现丢包情况,通常用于音频,视频和普通数据的传输
TCP:TCP是面向连接性的通信协议,在传输之前会先建立链接然后再传输数据,他提供了两台计算机之间可靠无差错的数据传输。每次的链接都会经过三次握手
使用协议传输时还得了解一个类 InetAddress 此类表示Internet协议(IP)地址
- static InetAddress getByteName(String host) 确定主机名称的IP地址。主机名称可以是机器名称,也可以是IP地址
- String getHostName() 获取此IP地址的主机名
- String getHostAddress() 返回文本显示中的IP地址字符串
UDP通讯原理
UDP协议是一种不可靠的网络协议,他在通信的两端各建立一个Socket对象,但是这两个Socket只是发送,接收数据的对象因此对于基于UDP协议的双发而言,没有所谓的客户端和服务器的概念
Java提供了DatagramSocket类作为基于UDP协议的Socket
UDP发送数据的步骤
-
创建发送端的Socket对象(DatagramSocket)
DatagramSocket()
-
创建数据,并把数据打包
DatagramPacket(byte []buf,int length,InetAddress,int port)
-
调用DatagramSocket对象的方法发送数据
void send(DatagramPacket p)
import java.io.IOException;
import java.net.*;
public class send {
public static void main(String[] args) throws IOException {
//先创建DatagramSocket对象
DatagramSocket ds= new DatagramSocket();
//将数据打包
byte[] bytes = "你好啊UDP,学习Java的不知道第几天".getBytes();
int len=bytes.length;
InetAddress byName = InetAddress.getByName("ip地址");
DatagramPacket dp=new DatagramPacket(bytes,len,byName,端口号);
// 第二种方式 DatagramPacket dp=new DatagramPacket("你好啊".getBytes(),"你好啊".getBytes().length,InetAddress.getByName("172.23.145.165"),端口号);
//发送数据
ds.send(dp);
//关闭出口
ds.close();
}
}
UDP接收数据的步骤
-
创建接收端的Socket对象(DatagramSocket)
DatagramSocket (int port)
-
创建一个数据包,用于接收数据
DatagramPacket(byte[] buf,int length)
-
调用DatagramSocket对象的方法接收数据
void receive(DatagramPscket p)
-
解析数据包,并把数据输出在控制台
byte[] getData()
int getLength()
-
关闭接收端
void close()
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class receive {
public static void main(String[] args) throws IOException {
DatagramSocket ds=new DatagramSocket(端口号);
byte [] a= new byte[1024];
DatagramPacket sd=new DatagramPacket(a,a.length);
ds.receive(sd);
byte[] data = sd.getData();
String s=new String(data);
System.out.println(s);
ds.close();
}
}
tcp通讯原理
- TCP通讯协议是一种可靠的网络协议,他在通信的两端各建立一个Socket对象,从而在通信的两端形成网络虚拟链路,一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信
- JAVA对基于TCP协议的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信
- JAVA为客户端提供了Socket类,为服务器端提供了Server Socket类
TCP发送数据
发送数据的步骤
-
创建客户端的Socket对象(Socket)
Socket(String host,int port)
-
获取输出流,写数据
OutputStream getOutputStream()
-
释放资源
void close()
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class TCPsend {
public static void main(String[] args) throws IOException {
Socket s=new Socket("IP地址",端口号);
OutputStream op = s.getOutputStream();
op.write("我爱学Java".getBytes());
s.close();
}
}
TCP接收数据
-
创建服务器端的Socket对象(ServerSocket)
ServerSocket(int port)
-
监听客户端链接,返回一个Socket对象
Socket accept()
-
获取输入流,读数据,并把数据显示在控制台
InputStream getInputStream()
-
释放资源
void close()
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPrecive {
public static void main(String[] args) throws IOException {
ServerSocket sd= new ServerSocket(端口号);
Socket s = sd.accept();
InputStream is = s.getInputStream();
byte []byt =new byte[1024];
int a=is.read(byt);
String da= new String(byt,0,a);
System.out.println(da);
sd.close();
s.close();
}
}
注意:使用协议时需要倒包,抛出异常