InetAddress
首先介绍一个api : InetAdderss,该类用于封装一个IP地址,并且提供了一系列的IP地址相关操作的方法
import java.net.InetAddress;
import java.net.UnknownHostException;
public class InetAddressDemo {
public static void main(String[] args) throws UnknownHostException {
InetAddress address = InetAddress.getByName("192.168.1.107");
String hostAddress = address.getHostAddress();
String hostName = address.getHostName();
System.out.println(hostAddress);
System.out.println(hostName);
}
}
UDP协议
UDP协议:
UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。
简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,
就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。
由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输例如视频会议都使用UDP协议,
因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。
但是在使用UDP协议传送数据时,由于UDP的面向无连接性,
不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议。
DatagramPacket
UDP通信的过程就像是货运公司在两个码头间发送货物一样。在码头发送和接收货物时都需要使用集装箱来装载货物,UDP通信也是一样,发送和接收的数据也需要使用“集装箱”进行打包,为此JDK中提供了一个DatagramPacket(详细参考API)类,该类的实例对象就相当于一个集装箱,用于封装UDP通信中发送或者接收的数据。
DatagramSocket
DatagramPacket(详细参考API)数据包的作用就如同是“集装箱”,可以将发送端或者接收端的数据封装起来。然而运输货物只有“集装箱”是不够的,还需要有码头。在程序中需要实现通信只有DatagramPacket数据包也同样不行,为此JDK中提供的一个DatagramSocket类。DatagramSocket类的作用就类似于码头,使用这个类的实例对象就可以发送和接收DatagramPacket数据包,发送数据的过程如下图所示。
UDP的实现
发送端
代码案例:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class SendDemo {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket();
String s = "hello udp,im comming!";
byte[] bys = s.getBytes();
int length = bys.length;
InetAddress address = InetAddress.getByName("itheima");
int port = 8888;
DatagramPacket dp = new DatagramPacket(bys,length,address,port);
ds.send(dp);
ds.close();
}
}
接收端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket(8888);
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys,bys.length);
System.out.println(1);
ds.receive(dp);
System.out.println(2);
InetAddress address = dp.getAddress();
byte[] data = dp.getData();
int length = dp.getLength();
System.out.println("sender ---> " + address.getHostAddress());
System.out.println(new String(bys,0,length));
ds.close();
}
}
TCP协议
TCP通信同UDP通信一样,都能实现两台计算机之间的通信,通信的两端都需要创建socket对象。
区别在于,UDP中只有发送端和接收端,不区分客户端与服务器端,计算机之间可以任意地发送数据。
而TCP通信是严格区分客户端与服务器端的,在通信时,必须先由客户端去连接服务器端才能实现通信,服务器端不可以主动连接客户端,并且服务器端程序需要事先启动,等待客户端的连接。
在JDK中提供了两个类用于实现TCP程序,一个是ServerSocket类,用于表示服务器端,一个是Socket类,用于表示客户端。
通信时,首先创建代表服务器端的ServerSocket对象,该对象相当于开启一个服务,并等待客户端的连接,然后创建代表客户端的Socket对象向服务器端发出连接请求,服务器端响应请求,两者建立连接开始通信。
这里不再做ServerSocket和Socket的介绍,详细参考API
TCP协议的实现
客户端
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
public class ClientDemo {
public static void main(String[] args) throws IOException {
Socket s = new Socket(InetAddress.getByName("itheima"),10086);
OutputStream os = s.getOutputStream();
String str = "hello tcp,im comming!!!";
os.write(str.getBytes());
s.close();
}
}
服务端
import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerDemo {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(10086);
Socket s = ss.accept();
InputStream is = s.getInputStream();
byte[] bys = new byte[1024];
int len;
len = is.read(bys);
InetAddress address = s.getInetAddress();
System.out.println("client ---> " + address.getHostName());
System.out.println(new String(bys,0,len));
s.close();
}
}
需求:使用TCP协议发送数据,并将接收到的数据转换成大写返回
客户端
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
public class ClientDemo {
public static void main(String[] args) throws IOException {
Socket s = new Socket(InetAddress.getByName("itheima"),10010);
OutputStream os = s.getOutputStream();
os.write("tcp,im comming again!!!".getBytes());
InputStream is = s.getInputStream();
byte[] bys = new byte[1024];
int len;
len = is.read(bys);
System.out.println(new String(bys,0,len));
s.close();
}
}
服务端
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerDemo {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(10010);
Socket s = ss.accept();
InputStream is = s.getInputStream();
byte[] bys = new byte[1024];
int len;
len = is.read(bys);
String str = new String(bys,0,len);
System.out.println(str);
String upperStr = str.toUpperCase();
OutputStream os = s.getOutputStream();
os.write(upperStr.getBytes());
s.close();
}
}