目录
扫描二维码关注公众号,回复:
16104522 查看本文章
![](/qrcode.jpg)
一、 netstat指令
netstat -anb 查看端口被哪个程序监听
(以管理员身份运行命令行)
二、UDP网络通信编程
1.基本介绍和原理
2.基本流程
三、应用案例
1)UDP通信
思路分析:
package com.feiyang.basic16_net;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* @author:飞扬
* @公众hao:程序员飞扬
* @description:
*/
public class UDPReceiverA {
public static void main(String[] args) throws IOException {
//创建一个DatagramSocket对象,在9999端口接收数据
DatagramSocket socket = new DatagramSocket(9999);
//构建一个DatagramPacket对象,准备接收数据
byte[] bytes = new byte[1024];
DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
//调用接收方法,将通过网络传输的DatagramPacket对象填充到packet对象
System.out.println("接收端A等待接收数据。。。");
socket.receive(packet);
//把packet进行拆包,取出数据,并显示
int length = packet.getLength();
byte[] data = packet.getData();
System.out.println("接收端A接收到数据:" + new String(data, 0,length));
//回应
String s = "好的,明天见";
System.out.println("接收端A发送数据:" + s);
byte[] dataSend = s.getBytes();
DatagramPacket packetSend = new DatagramPacket(dataSend,dataSend.length, InetAddress.getByName("192.168.0.106"),9998);
socket.send(packetSend);
//关闭资源
socket.close();
}
}
package com.feiyang.basic16_net;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.nio.charset.StandardCharsets;
/**
* @author:飞扬
* @公众hao:程序员飞扬
* @description:
*/
public class UDPSenderB {
public static void main(String[] args) throws IOException {
//创建DatagramSocket对象,在9998端口接收数据
DatagramSocket socket = new DatagramSocket(9998);
//将需要发送的数据,封装到DatagramPacket
String s = "hello,明天去吃火锅啊";
System.out.println("发送端B发送数据:" + s);
byte[] bytes = s.getBytes();
DatagramPacket packet = new DatagramPacket(bytes,bytes.length, InetAddress.getByName("192.168.0.106"),9999);
//发送
socket.send(packet);
//构建一个DatagramPacket对象,准备接收数据
byte[] bytesRe = new byte[1024];
DatagramPacket packetRe = new DatagramPacket(bytesRe, bytesRe.length);
//调用接收方法,将通过网络传输的DatagramPacket对象填充到packet对象
System.out.println("发送端B等待接收数据。。。");
socket.receive(packetRe);
//把packet进行拆包,取出数据,并显示
int length = packetRe.getLength();
byte[] data = packetRe.getData();
System.out.println("发送端B接收数据:" + new String(data, 0,length));
//关闭资源
socket.close();
}
}
执行结果:
2)TCP通信
package com.feiyang.basic16_net;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author:飞扬
* @公众hao:程序员飞扬
* @description: socke通信,字符流,服务端
*/
public class Homework01Server {
public static void main(String[] args) throws IOException {
//1.在本机9999端口监听
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("服务端在9999端口监听...");
//2.当没有连接时,程序会阻塞,等待连接,如果有客户端连接,则会返回socket对象,程序继续
Socket socket = serverSocket.accept();
System.out.println("服务端socket=" + socket.getClass());
//3.读取数据
InputStream inputStream = socket.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
String s = bufferedReader.readLine();
System.out.println("服务端接收=" + s);
String answer = "";
if("name".equals(s)){
answer = "我是程序员飞扬";
}else if("hobby".equals(s)){
answer = "爱好编程";
}else{
answer = "你说啥子?";
}
//服务端发送消息
OutputStream outputStream = socket.getOutputStream();
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
bufferedWriter.write(answer);
bufferedWriter.newLine();
bufferedWriter.flush();
//4.关闭流
bufferedReader.close();
bufferedWriter.close();
socket.close();
serverSocket.close();
System.out.println("服务端退出。");
}
}
package com.feiyang.basic16_net;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;
/**
* @author:飞扬
* @公众hao:程序员飞扬
* @description: socke通信,字符流,客户端
*/
public class Homework01Client {
public static void main(String[] args) throws IOException {
//1.连接服务端(IP,端口)
Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
System.out.println("客户端socket=" + socket.getClass());
//2.连接上之后会返回一个socket对象,得到和socket关联的输出流对象
OutputStream outputStream = socket.getOutputStream();
//3.写数据
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
Scanner scanner = new Scanner(System.in);
System.out.println("请输入您要查询的内容:");
String next = scanner.next();
bufferedWriter.write(next);
bufferedWriter.newLine();
bufferedWriter.flush();
//接收数据
InputStream inputStream = socket.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
String s = bufferedReader.readLine();
System.out.println("客户端接收=" + s);
//4.关闭io流,关闭socket连接
bufferedReader.close();
bufferedWriter.close();
socket.close();
System.out.println("客户端退出。");
}
}
执行结果:
3)UDP
package com.feiyang.basic16_net;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* @author:飞扬
* @公众hao:程序员飞扬
* @description:
*/
public class HomeworkReceiverA {
public static void main(String[] args) throws IOException {
//创建一个DatagramSocket对象,在9999端口接收数据
DatagramSocket socket = new DatagramSocket(8888);
//构建一个DatagramPacket对象,准备接收数据
byte[] bytes = new byte[1024];
DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
//调用接收方法,将通过网络传输的DatagramPacket对象填充到packet对象
System.out.println("接收端A等待接收数据。。。");
socket.receive(packet);
//把packet进行拆包,取出数据,并显示
int length = packet.getLength();
byte[] data = packet.getData();
String s1 = new String(data, 0, length);
System.out.println("接收端A接收到:" + s1);
String answer ="";
if("四大名著".equals(s1)){
answer = "<<红楼梦>>、<<三国演义>>、<<水浒传>>、<<西游记>>";
}else{
answer = "您说的嘛?";
}
//回应
System.out.println("接收端A发送数据:" + answer);
String s = answer;
byte[] dataSend = s.getBytes();
DatagramPacket packetSend = new DatagramPacket(dataSend,dataSend.length, InetAddress.getByName("192.168.0.106"),9998);
socket.send(packetSend);
//关闭资源
socket.close();
}
}
package com.feiyang.basic16_net;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
/**
* @author:飞扬
* @公众hao:程序员飞扬
* @description:
*/
public class HomeworkSenderB {
public static void main(String[] args) throws IOException {
//创建DatagramSocket对象,在9998端口接收数据
DatagramSocket socket = new DatagramSocket(9998);
//将需要发送的数据,封装到DatagramPacket
Scanner scanner = new Scanner(System.in);
System.out.println("请输入: ");
String next = scanner.next();
byte[] bytes = next.getBytes();
DatagramPacket packet = new DatagramPacket(bytes,bytes.length, InetAddress.getByName("192.168.0.106"),8888);
//发送
socket.send(packet);
//构建一个DatagramPacket对象,准备接收数据
byte[] bytesRe = new byte[1024];
DatagramPacket packetRe = new DatagramPacket(bytesRe, bytesRe.length);
//调用接收方法,将通过网络传输的DatagramPacket对象填充到packet对象
System.out.println("发送端B等待接收数据。。。");
socket.receive(packetRe);
//把packet进行拆包,取出数据,并显示
int length = packetRe.getLength();
byte[] data = packetRe.getData();
System.out.println("发送端B接收到数据:" + new String(data, 0,length));
//关闭资源
socket.close();
}
}
执行结果:
4)tcp文件下载
思路分析:
package com.feiyang.basic16_net;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author:飞扬
* @公众hao:程序员飞扬
* @description:
*/
public class Homework03Server {
public static void main(String[] args) throws IOException {
//服务端在9999端口监听
ServerSocket serverSocket = new ServerSocket(9999);
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
String downLoadFileName="";
/*byte[] bytes = new byte[1024];
int len = 0;
String downLoadFileName="";
while((len = inputStream.read()) != -1){
downLoadFileName += new String(bytes, 0, len);
}
*/
//获取文件名
InputStreamReader isr = new InputStreamReader(inputStream, "utf-8"); //防止乱码
BufferedReader bufferedReader = new BufferedReader(isr);
String s = bufferedReader.readLine();
downLoadFileName = s;
System.out.println("文件名:" + downLoadFileName);
//判断要下载的文件
String filePath="";
if("天国的女儿".equals(downLoadFileName)){
filePath = "src\\天国的女儿.mp3";
}else{
//filePath = "src:\\aaa.mp3";
}
//读取对应目录下的文件
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filePath));
byte[] bytes1 = StreamUtils.streamtoByteArray(bis);
//将文件写会socke给客户端
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
bos.write(bytes1);
socket.shutdownOutput();
//关闭资源
bis.close();
inputStream.close();
socket.close();
serverSocket.close();
System.out.println("服务端退出。。。");
}
}
package com.feiyang.basic16_net;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
/**
* @author:飞扬
* @公众hao:程序员飞扬
* @description:
*/
public class Homework03Client {
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要下载的文件名: ");
String s = scanner.next();
//客户端将文件名写入socket,给服务端
Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
OutputStream os = socket.getOutputStream();
os.write(s.getBytes());
socket.shutdownOutput();
//获取服务端回写的文件流
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
byte[] bytes = StreamUtils.streamtoByteArray(bis);
String filePath = "d:\\" + s + ".mp3";
//将文件写入指定路径的磁盘下
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath));
bos.write(bytes);
bos.flush();
//关闭资源
bos.close();
bis.close();
os.close();
socket.close();
System.out.println("客户端下载完毕。。。");
}
}
执行结果: