1.网络编程概述
网络编程,是指通过编写程序,使程序能完成网路之间的通信功能。现如今网路的发展是非常迅速的。并且底层的网络实现已经被隐藏起来,我们只要使用提供的接口就可以实现网络编程。但是,作为一个程序员,了解网络是非常有必要的。
1.1、ip地址和端口 ip地址,是由32位二级制组成,分成4段,每段8位,正好组成了4段0之255之间的数字。ip地址能表示一台主机所在地区位置。现如今的网络设备非常之多,ipv4的地址已经不够使用了。ipv6慢慢登上了舞台,ipv6由128位二级制组成,分成8段,每段16位,也就是4位16进制数。
端口,端口可以表示一个进程。我们常说的端于端之间的通信,通常就是指端口与端口之间的通信。一台主机的端口有65536个。
1.2、socket套间字 一个端系统想要和一个端系统之间通信,必须需要知道对方的ip地址和端口,而ip地址和端口合在一起就是套间字,常常以"127.0.0.1:8080 "这样的形式出现。
2.实现网络编程 在java中实现网络编程非常简单,因为具体的实现底层不需要我们去了解,我们只需要使用提供的API就能实现我们想要实现的程序。
2.1、InetAddress类 该类实现了如果获取ip地址相关的信息。InetAddress是Java对IP地址的封装,几乎所有的Java网络相关的类都和它有关系,例如:serversocket,socket,URL,DataGramSocket,DataGRamPacket等。
try {
//给定主机名
InetAddress inetAddress = InetAddress.getByName("www.baidu.com");
//通过给定的主机名获取ip地址
System.out.println("in"+inetAddress.getHostAddress());
}catch (Exception e){
e.printStackTrace();
}
使用ping 命令测试IP地址是否可以访问
Process p = Runtime.getRuntime().exec("ping " + "192.168.225.1");
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream(),"gbk"));
String line = null;
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
if (line.length() != 0){
sb.append(line + "rn");
}
}
System.out.println("本次指令返回的消息是:");
System.out.println(sb.toString());
2.2、ServerSocket 和Socket(HTTP协议)
ServerSocket类实现了服务器套接字。服务器套接字等待通过网络进入的请求。它根据该请求执行一些操作,然后可能将结果返回给请求者。
Socket实现客户端套接字(也称为“套接字”)。 套接字是两台机器之间通讯的端点。
server:
ServerSocket serverSocket = new ServerSocket(8080);
Socket accept = serverSocket.accept();//侦听要连接到此套接字并接受它。 该方法将阻塞直到建立连接。
InputStream inputStream = accept.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"utf-8"));
String massage =bufferedReader.readLine();
System.out.println("massage:"+massage);
accept.close();
serverSocket.close();
user:
Socket socket = new Socket("127.0.0.1", 8080);//和指定的套间字连接
System.out.println(socket);
Scanner scanner = new Scanner(System.in);
OutputStream outputStream = socket.getOutputStream();
outputStream.write(scanner.nextLine().getBytes(StandardCharsets.UTF_8));
socket.close();
3.实现UDP协议连接
UDP是无连接服务,所以在编写程序的时候我们只能在形式上将一个定位客户端和服务端,其实它们之间是等价关系。
实现UDP协议传输数据的话,只需要关注接受或发送的端口(DatagramSocket类)和要接受或发送的信息存储的位置(DatagramPacket)。
发送端实现类:
try {
//启动一个发送信息的端口
DatagramSocket datagramSocket = new DatagramSocket(6767);
byte[] hello = "hello".getBytes();
InetAddress inetAddress = InetAddress.getLocalHost();
//添加要发送的信息 该消息中包括了目的地的地址
DatagramPacket packet = new DatagramPacket(hello,0,hello.length,inetAddress,7676);
//启动发送程序
datagramSocket.send(packet);
//关闭流
datagramSocket.close();
}catch (Exception e){
e.printStackTrace();
}
接收端实现类:
try {
//启动一个接受信息的端口
DatagramSocket datagramSocket = new DatagramSocket(7676);
//设置一个接受数据的容器
byte [] bytes = new byte[1024];
//接受数据包
DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length);
//接受数据
datagramSocket.receive(packet);
System.out.println("packet "+new String(bytes,0,packet.getLength()));
//关闭流
datagramSocket.close();
}catch (Exception e){
e.printStackTrace();
}



