网络编程三要素:
IP地址:Internet protocol address,给网络中的计算机进行编号,Java中的InetAddress类。
端口:port,通过端口号可以找到对应电脑上的某个程序。
协议:连接和通信的规则:
UDP(user datagram protocol)用户数据报协议特点:不需要连接,速度快,大小限制64k,易丢失数据。
TCP(transmission control protocol)传输控制协议特点:需要连接,速度慢,无大小限制,不易丢失数据。
发送端:
// 1.创建发送端
DatagramSocket datagramSocket = new DatagramSocket();
// 2.创建数据包,发给本地ip下的9527端口
byte[] bytes = "你好啊".getBytes(StandardCharsets.UTF_8);
DatagramPacket datagramPacket = new DatagramPacket(bytes, 0, bytes.length, InetAddress.getLocalHost(), 9527);
// 3.发送数据,然后关闭
datagramSocket.send(datagramPacket);
datagramSocket.close();
接收端:
// 1.创建接收端, 将本机的9527端口,提供别人找到
DatagramSocket datagramSocket = new DatagramSocket(9527);
// 2.创建空的数据包
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes, 0, bytes.length);
// 3.接收到的数据放到包中,也就是byte数组中,打印出来,并关闭
datagramSocket.receive(datagramPacket);
System.out.println(new String(bytes, 0, datagramPacket.getLength()));
datagramSocket.close();
客户端:
//1.创建Socket客户端
Socket socket = new Socket("192.168.86.80", 9999);
//获取服务端的输出流,循环读到程序,写出输出流
OutputStream out = socket.getOutputStream();
// 2.创建输入流读取文件
FileInputStream fis = new FileInputStream("D:\\MyTest\\test.jpg");
byte[] bytes = new byte[1024];
int len;
while ((len = fis.read(bytes)) != -1) {
out.write(bytes, 0, len);
}
//传输结束,给出结束标记!!!
socket.shutdownOutput();
//3.接收服务端的回应
InputStream in = socket.getInputStream();
len = in.read(bytes);
System.out.println("服务器回复:" + new String(bytes, 0, len));
//关闭资源
in.close();fis.close();out.close();socket.close();
服务端:
System.out.println("服务端启动");
ServerSocket ss = new ServerSocket(9999);
while (true) {
try {
//接收客户端连接(一个客户端连接,就有一个Socket被创建)
Socket socket = ss.accept();
System.out.println("有客户端连接:"+socket);
//生成文件名
String fileName = UUID.randomUUID().toString()+".jpg";
//创建文件输出流,读后写出去
FileOutputStream fos = new FileOutputStream("t_day12\\upload\\"+fileName);
//接收客户端的资源,保存到服务器的磁盘上
InputStream in = socket.getInputStream();
byte[] bytes = new byte[1024];
int len;
while ((len=in.read(bytes))!=-1){
fos.write(bytes,0,len);
}
//回复消息给客户端
OutputStream out = socket.getOutputStream();
out.write("文件保存成功".getBytes());
//关闭资源
out.close();in.close();fos.close();socket.close();
System.out.println("文件保存成功");
} catch (Exception e) {
System.out.println("文件传输异常");
}
}