网络编程
一、网络编程概述
1.实现网络传输的三个要素:
使用IP地址(准确定位网络上一台或多台主机)
使用端口号(定位主机上的特定的应用)
规范网络通信协议(可靠、高效的数据传输)
2.通信要素1:IP地址
- 作用:IP地址用来给网络中的一台计算机设备做唯一的编号
- IP地址分类
IP地址分类方式1
IPV4(占用4个字节)
IPV6(占用16个字节)IP地址分类方式2
公网地址(万维网使用)和私有地址(局域网使用)
- 本地回路地址:127.0.0.1
- 域名:便捷的记录ip地址 www.baidu.com
3.通信要素2:端口号
- 端口号可以唯一标识设备中的进程(应用程序)
- 不同的进程分配不同的端口号
- 范围0~65535
4.InetAddress的使用
- 作用:InetAddress类的一个实例就代表一个具体的ip地址
- 实例化的方式:
InetAddress getByName(String host):获取指定ip对应的InetAddress的实例
InetAddress getLocalHost():获取本地ip对应的InetAddress的实例
- 常用方法
getHostName():获取域名
getHostAddress():获取ip地址
5.通信要素3:通信协议
- 网络通信协议的目的
为了可靠且高效的数据传输。
- 网络参考模型
OSI参考模型:过于理想化,没有实施起来
TCP/IP参考模型:将网络分为4层:应用层、传输层、网络层、物理+数据链路层。
6.利用Socket网络编程C/S通信(TCP/IP):
package com.weike.C;
import org.junit.Test;
import sun.net.InetAddressCachePolicy;
import java.io.*;
import java.net.*;
/**
* TCP/IP socket网络通信
* 客户端发送内容给服务端、服务端将内容打印到控制台上
*/
public class SocketTest {
//客户端
@Test
public void client(){
Socket socket = null;
OutputStream outputStream = null;
try {
//1.创建一个Scoket 192.168.233.50 注意是对方的ip地址
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
int port = 8989; //声明对方的端口号
socket = new Socket(inetAddress, port);
//2.发送数据
outputStream = socket.getOutputStream();
outputStream.write("你好,北京!".getBytes());
//客户端表明不再继续发送数据
socket.shutdownOutput();
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
//3.关闭资源
try {
if (socket != null) {
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (outputStream != null) {
outputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//服务端
@Test
public void Server() throws IOException {
ServerSocket serverSocket = null;
Socket socket = null;
InputStream inputStream = null;
ByteArrayOutputStream byteArrayOutputStream = null;
try {
//1.创建一个ServerSocket
int port = 8989;
serverSocket = new ServerSocket(port);
//2.调用accept(),接受来自客户端的Socket
socket = serverSocket.accept();
System.out.println("服务端已开启!");
//3.接收数据
inputStream = socket.getInputStream();
byte[] buffer = new byte[1024];
int len = 0;
byteArrayOutputStream = new ByteArrayOutputStream();
while((len = inputStream.read(buffer)) != -1){
byteArrayOutputStream.write(buffer , 0 , len);
}
System.out.println(byteArrayOutputStream);
System.out.println("数据接受完毕!");
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.关闭资源
try {
if (byteArrayOutputStream != null) {
byteArrayOutputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (inputStream != null) {
inputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (socket != null) {
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (serverSocket != null) {
serverSocket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
UDP通信案例:
package com.weike.C;
import org.junit.Test;
import java.io.IOException;
import java.net.*;
public class SocketTest3 {
@Test
public void testSender() throws IOException {
DatagramSocket datagramSocket = new DatagramSocket();
byte[] bytes = "你好!".getBytes();
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("127.0.0.1"), 8989);
datagramSocket.send(datagramPacket);
datagramSocket.close();
}
@Test
public void Receiver() throws IOException {
DatagramSocket datagramSocket = new DatagramSocket(8989);
byte[] bytes = new byte[1024 * 64];
DatagramPacket datagramPacket = new DatagramPacket(bytes , 0 , bytes.length);
datagramSocket.receive(datagramPacket);
byte[] data = datagramPacket.getData();
String str = new String(data , 0 , datagramPacket.getLength());
System.out.println(str);
datagramSocket.close();
}
}
url编程:
package com.weike.C;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
public class URLTest {
public static void main(String[] args) throws IOException {
URL url = new URL("https://www.wenm.com/。。。");
HttpURLConnection uc = (HttpURLConnection)url.openConnection();
InputStream inputStream = uc.getInputStream();
FileOutputStream fileOutputStream = new FileOutputStream(new File("copy1.html"));
int len = 0;
byte[] buffer = new byte[1024];
while ((len = inputStream.read(buffer)) != -1){
fileOutputStream.write(buffer , 0 , len);
}
System.out.println("下载完成!");
fileOutputStream.close();
inputStream.close();
uc.disconnect();
}
}