1. 网络通信
计算机网路:将不同地理位置的电脑通过某种协议连接起来
网络编程的目的:数据交换、通信
网络通信需要解决几个问题:
1. 如何准确的定位网络上的一台主机:端口,定位到这个计算机上的某个资源
2. 找到这个主机,如何传输数据呢?
注意:网络编程和网页编程(javaweb)是两个不同的概念,网络编程是C/S架构,网页编程是B/S架构
网络通信的要素:
通信双方地址:IP、端口号
规则(网络通信协议):TCP/IP参考模型
2. IP地址
IP地址的分类
IPV4/IPV6:
IPV4 : 4个字节组成,0~255,共42亿,有30亿都在北美,亚洲4亿,2011年就用尽了
IPV6: 128位,8个无符号整数
公网-私网:
公网:互联网使用,ABCD类地址
私网:局域网,192.168.XX.XX
域名:解决记忆IP的问题
public static void main(String[] args){
//一般作为参数传递的,不会单独拿出来,没意义
InetAddress ina = InetAddress.getByName("127.0.0.1");
}
3. 端口Port
端口表示计算机上的一个程序的进程:
1. 不同的进程有不同的端口号,用来区分软件的
2. 被规定0~65535,分别支持TCP和UDP,所以一共是65535*2个端口,单个协议下端口号不能冲突
3. 端口分类:公有端口(0-1023) 程序注册端口(1024-49151) 私有端口(49152-65535)
共有端口: HTTP 80 HTTPS 443 FTP 21 SSH 22 Telent 23
程序注册端口:Tomcat 8080 MYSQL 3306 Oracle 1521
netstat -ano // 查看所有端口
netstat -ano|findstr “5900” //查看指定的端口
public static void main(String[] args){
//一般作为参数传递的,不会单独拿出来,没意义
InetSocketAddress isa = new InetSocketAddress ("127.0.0.1",8080);
}
4. 通信协议
TCP/IP协议簇,其中比较重要的两个协议有TCP和UDP
TCP: 用户传输协议,三次握手四次挥手
UDP: 用户数据报协议
三次握手
四次挥手
A:我要走了
B:你真的要走了吗?
B:你真的真的要走了吗?
A:我真的要走了
5. TCP通信 (了解)
底层代码,实际很少用到
public class TCPClientDemo{
public static void main(String[] agrs){
ServerSocket ss = null;
Socket socket = null;
InputStream is = null;
ByteArrayOutputStream baos = null;
try{
//首先要有个地址,服务端的地址是localhost:9999,客户端要连接这个地址
ss = new ServerSocket(9999);
while(true){
//等待客户端连接过来(从客户端拿过来的消息)
socket = ss.accept();
//读取客户端的消息
is = socket.getInputStream();
//用管道流读
baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while((len = is.read(buffer)!= -1){
baos.write(buffer,0,len);
}
System.out.println(baos.toString());
}
}catch(IOException e){
e.printStackTrace();
}finally{
//自行优化,还有if **!=null try...catch
baos.close();
is.close();
socket.close();
ss.close();
}
}
}
public class TCPServerDemo{
public static void main(String[] args){
//要知道服务器的地址
try{
//1. 服务的地址
InetAddress serverIp = InetAddress.getByName("127.0.0.1")
int port = 9999;
//2. 创建一个socket连接
Socket socket = new Socket(serverIP, port);
//3. 发送消息IO流
OutputStream os = socket.getOutputStream();
os.write("要发送的内容".getBytes());
}catch(Exception e){
e.printStackTrace();
}
//这里的finally写代码时自行补充
}
}
6. TCP文件上传(了解)
public class TCPClientDemo2{
public static void main(String[] args){
//1. 创建一个socket连接
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9000);
//2. 创建一个输出流
OutputStream os = socket.getOutputStream();
//3. 文件输入流,读取本地的文件
FileInputStream fis = new FileInputStream(new File("wenjianname.jpg"));
//4. 写出文件,发送给服务端
byte[] buffer = new byte[1024];
int len;
while(len = fis.read(buffer)!= -1){
os.write(buffer, 0 ,len);
}
//通知服务器,我已经传输完了
socket.shutdownOutput();
//确定服务器接收完毕,断开连接
InputStream inputStream =socket.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer2 = new byte[1024];
int len2;
while((len2=inputSteam.read(buffer2))!=-1){
baos.write(buffer2, 0, len2);
}
System.out.println(baos.toString());
//5. 关闭资源省略
}
}
pubic class TCPServerDemo2{
public static void main(String[] args){
//1. 创建服务
ServerSocket serverSocket = new ServerSocket(9000);
//2. 监听客户端的连接,阻塞式监听会一直等待客户端连接
Socket socket = serserSocket.accept();
//3. 获取输入流
InputStream is = socket.getInputStream();
//4. 文件输出
FileOutputStream fos = new FileOutputStream(new File("wenjianname.jpg");
byte[] buffer = new byte[1024];
int len;
while(len = is.read(buffer)!= -1){
fos.write(buffer, 0 ,len);
}
//通知服务器,接收完毕
OutputStream os = socket.getOutputStream();
os.write("我接收完毕了,你可以断开了")
//关闭资源,省略
}
}
7. Tomcat
服务器端用Tomcat, 客户端用浏览器,B/S结构
8. UDP
不用连接,需要知道对方地址,涉及到的两个类DatagramPacket和DatagramSocket.
UDP没有严格意义上的服务端和客户端,只要给IP和端口,可以互相发消息,也不用建立连接
public class UdpClientDemo1{
public static void main(String[] args){
//1. 创建一个Socket
DatagramSocket socket = new DatagramSocket();
//2. 建个包
String msg = "hell0";
//发送给谁
InetAddress ip = InetAddress.getByName("localhost");
int port = 9090;
DatagramPacket packet = new DatagramPacket(msg.getBytes(),0,msg.getBytes().length(),ip, port);
//3. 发送包
socket.send(packet);
//4. 关闭流
socket.close();
}
}
//服务端开放端口
public class UdpServerDemo2{
public static void main(String[] args){
//开放端口
DatagramSocket socket = new DatagramSocket(9090);
//接收数据
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer,0, buffer.length);
socket.receive(packet);
System.out.println(new String(packet.getData(),0,packet.getLength()));
//关闭连接
socket.close();
}
}
9. URL
统一资源定位符,定位互联网上的某个资源,如https://www.baidu.com
组成:
协议://IP地址(DNS域名解析) :端口/项目名/资源
URL url = new URL("http://");*
public class UrlDown{
public static void main(String[] args) throws Exception{
//1. 下载地址
URL url = new URL("***");
//2. 连接到这个资源HTTP
HttpURLConnection uc = (HttpURLConnection)url.openConnection();
InputStream is = uc.getInputStream();
//要存的文件是个什么样的格式 就写入什么格式的文件
FileOutputStream fos = new FileOutputStream("***.txt");
byte[] buffer = new byte[1024];
int len;
while((len=is.read(buffer))!=-1){
//写出数据
fos.write(buffer, 0, len)
}
fos.close();
is.close();
uc.disconnect();
}
}