网络编程
前述: (概念类比)
(TCP)打电话: 连接——接通——通信
(UDP)发短信: —发送即完事——接收
1.概述
(是什么?)计算机网络:计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
(干什么?)传播信息、数据交换、通信
(要怎么达到?)要点
- 如何准确地定位到网络的一台主机上和定位到某个应用上:用Ip地址和端口号
- 找到这个主机,该如何传输数据?
1.2网络通信的要素
通信双方的地址
ip地址和端口号
规则
即网络通信的协议,http协议,ftp协议、udp、tcp
1.2.1 IP地址
Java类:InetAddress
作用:唯一定位到具体的网络计算机上
eg: 主机地址: 127.0.0.1
IP地址分类:
IPV4:4个字节组成,0-255。
IPV6 : 128位,8个无符号整数。
域名:方便记忆IP
1.2.2 端口
Java类:InetSocketAddress
作用:端口表示计算机的一个程序的进程,用来区分软件
规定:0~65535
TCP、UDP
端口分类:
公有端口 0~1023
HTTP:80
HTTPS:443
FTP:21
Talent:23
程序注册端口:2014~49151
动态、私有:49152~65535
dom命令:
- 查看所有: netstat -ano
- 查看具体端口:netstat -ano|findstr “端口号”
- 查看具体窗口的具体进程:tasklist|findstr “端口号”
1.2.3 通信协议
协议:约定的一种规则
网络通信协议要做到: 网络传输效率、速率、代码结构……
通信协议簇:
重要:
TCP:用户传输协议(打电话)
特点:连接稳定、
3次握手、4次挥手、
3次握手:
A:你瞅啥?
B:瞅你咋地?
A:干一架
4次挥手:
A:我要走了
B:你真的要走了吗?
B:你真的真的要走了吗?
A:我真的走了
其中:A代表客户端,B代表服务端
客户端和服务端、
传输完成释放连接,效率低
UDP:用户传输报协议(发短信)
特点:不连接、不稳定、客户端和服务端没有界限、
TCP
客户端
package com.lin;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) {
OutputStream outputStream = null;
Socket socket = null;
InetAddress serverImp;
try {
//要连接的地址和端口
serverImp = InetAddress.getByName("127.0.0.1");
int port = 9999;
//客户端与服务器连接窗口
socket = new Socket(serverImp,port);
//向窗口传入数据
outputStream = socket.getOutputStream();
outputStream.write("xiao发在变强".getBytes());
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
服务端
package com.lin;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
public class Server {
public static void main(String[] args) {
ByteArrayOutputStream byteArrayOutputStream = null;
InputStream inputStream = null;
Socket accept =null;
ServerSocket serverSocket =null;
try {
//服务器的端口
serverSocket = new ServerSocket(9999);
//获取连接窗口
accept = serverSocket.accept();
inputStream = accept.getInputStream();
byteArrayOutputStream = new ByteArrayOutputStream();
byte[] bytes = new byte[1024];
int len;
while((len= inputStream.read(bytes))!=-1){
byteArrayOutputStream.write(bytes,0,len);
}
System.out.println(byteArrayOutputStream);
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
byteArrayOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
accept.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
UDP
客户端
DatagramSocket datagramSocket =null;
DatagramPacket datagramPacket ;
try {
int port = 9998;
datagramSocket = new DatagramSocket(port);
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
String msg="xiaoF";
datagramPacket = new DatagramPacket(msg.getBytes(),msg.getBytes().length, inetAddress,port);
datagramSocket.send(datagramPacket);
} catch (Exception e) {
e.printStackTrace();
}finally {
datagramSocket.close();
}
服务端
DatagramSocket datagramSocket = new DatagramSocket(9998);
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes, 0, bytes.length);
datagramSocket.receive(datagramPacket);
System.out.println(datagramPacket.getAddress().getCanonicalHostName());
datagramSocket.close();
附:URL和IO流过程代码
try {
//链接地址
url = new URL("https://mr1.doubanio.com/9e9df9d25389bf0ee9730139715ba8f1/0/fm/song/p1960200_128k.mp4");
//进入链接
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
//下载链接内容
InputStream inputStream = urlConnection.getInputStream();
//文件流
FileOutputStream fileOutputStream =new FileOutputStream("music.mp4");
//缓冲区
byte[] bytes = new byte[1024];
int len;
//将链接内容放到缓冲区中,后写入到文件流中
while((len = inputStream.read(bytes))!=-1){
fileOutputStream.write(bytes,0,len);
}
} catch (Exception e) {
e.printStackTrace();
}