一.什么是网络编程?
1.在网络通信协议下,实现网络互连的不同计算机上运行的程序间可以进行数据交换。
2.网络编程三要素 :IP地址 、端口、协议(TCP、UDP)
iso七层模型:
二. IP
Java中ip地址类:InetAddress
1.唯一定位一台网络上的计算机(127.0.0.1 本机:localhost)
2.ip地址的分类:ipv4 / ipv6
ipv4:127.0.0.1,由四个字节组成。
ipv6:128位,8个无符号整数!
公网(互联网)---私网(局域网)
域名:记忆ip问题。
ip:www.baidu.com
三.端口
端口表示计算机上的一个程序进程:
1. 不同的进程有不同的端口!来区分软件 !
2.端口规定:0-65535
3.TCP,UDP,单个协议下,端口号不能冲突
查看所有端口命令:netstat -ano
查看指定端口命令:netstat -ano|findstr "8080"
四.通信协议
协议:约定,规则。
TCP:(类似打电话)
1.双方必须建立连接,稳定。
2.三次握手,四次挥手
最少需要三次,保证稳定连接!
三次握手:
A:你愁啥!
B:瞅你咋的!
A:来打一架!
四次挥手:
A:我要走了!
B:你真的要走了吗?
B:你真的真的要走了吗?
A:我真的要走了!
3.客户端,服务端
4.传输完成,释放连接,效率低。
TCP:面向连接的协议,在正式收发数据的时候,必须和对方建立可靠的连接。
TCP 代码演示(先启动服务端):
创建服务端:
public class ServerTest {
public static void main(String[] args) throws Exception {
//创建服务端
ServerSocket serverSocket = new ServerSocket(8089);
//侦听连接
Socket accept = serverSocket.accept();
//获取输入流
InputStream inputStream = accept.getInputStream();
byte[] bytes = new byte[1024];
int len = inputStream.read(bytes);
String str = new String(bytes, 0, len);
inputStream.close();
serverSocket.close();
System.out.println("数据:" + str);
}
}
创建客户端:
public class ClientTest {
public static void main(String[] args) throws Exception {
//创建客户端
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),8089);
//获取输出流
OutputStream outputStream = socket.getOutputStream();
outputStream.write("在吗?我来了...".getBytes());
outputStream.close();
socket.close();
}
}
UDP:(类似发短信)
1.不用建立连接,不稳定,可能有网络导致数据发送失败。
2.客户端,服务端:没有明确的界限
3.不管有没有准备好,都可以发送给你
UDP:面向非连接协议,不用与对方建立连接,可以直接把数据报发送出去。
UDP 代码演示(先启动服务端):
创建服务端:
//等待客户端发送
public class ServerTest {
public static void main(String[] args) throws Exception {
//开放端口
DatagramSocket datagramSocket = new DatagramSocket(9090);
//接收数据包
byte[] bytes = new byte[1024];
//接收
DatagramPacket datagramPacket = new DatagramPacket(bytes, 0, bytes.length);
//阻塞接收
datagramSocket.receive(datagramPacket);
System.out.println(datagramPacket.getAddress().getHostAddress());
System.out.println(new String(datagramPacket.getData(),0,datagramPacket.getLength()));
//关闭流
datagramSocket.close();
}
}
创建客户端:
//不需要连接服务器
public class ClientTest {
public static void main(String[] args) throws Exception {
//建立一个socket
DatagramSocket datagramSocket = new DatagramSocket();
//建个包
String msg="你好,服务器!";
//发送给谁
InetAddress localhost = InetAddress.getByName("localhost");
//定义端口号
int port=9090;
//数据,数据的长度,要发送给谁
DatagramPacket datagramPacket = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port);
//发送包
datagramSocket.send(datagramPacket);
//关闭流
datagramSocket.close();
}
}
URL:
例如:https://www.baidu.com/
URL:统一资源定位符,定位互联网上的某一资源。
DNS:域名解析 。 www.baidu.com 解析成ip:127.0.0.1
url组成:协议://ip地址:端口/项目名/资源
url下载网络资源代码示例: public class UrlTest { public static void main(String[] args) throws IOException { //下载地址 URL url = new URL("https://t13.baidu.com/it/u=3879914021,2320932645&fm=224&app=112&f=JPEG?w=500&h=500&s=D93FF1FAD80860CE4806C65C030040D7"); //连接这个资源 HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection(); InputStream inputStream = urlConnection.getInputStream(); FileOutputStream fileOutputStream = new FileOutputStream("a.jpg"); byte[] bytes = new byte[1024]; int len; while ((len=inputStream.read(bytes))!=-1){ fileOutputStream.write(bytes,0,len); } } }