网络编程
概述
计算机网络通过 各种协议 将不同的电脑连接起来
目的:
传播交流信息、数据交换、通信
达成的效果需要什么?
1.如何准确地确定一个主机的位置
eg: IP地址:端口,定位到该计算机的某个资源
2.如何传输数据?
通过传输的介质
网络通信的要素
需要知道通信双方的地址
IP地址
端口号
规则:网络通信的协议
TCP/IP参考模型
IP地址
class InetAddress
//常用方法[了解即可]
getByName(String str); //通过字符内的网址获取相关IP地址
getLocalHost(String str); //获取设备名及其IP地址
getCanonicalHostName() ; //获取规范化的名字
getAddress(); //对象地址
getHostAddress(); //IP地址
getHostName(); //域名||该设备的名字
唯一定位一台网络上计算机
本地IP地址:127.0.0.1
IP地址的分类
IPV4 eg:127.0.0.1 ( 4个字节组成)
IPV6 eg: xxxx:xxxx::xxxx:xxx… (128位,8个无符号数)
公网-私网
公网(互联网)、私网(局域网) eg:192.168.xx.xx
端口POST
端口表示计算机上的一个程序的进程
- 不同的进程有不同的端口号 且不可冲突 ->用于区分软件
-被规定 0~65535
-还分为TCP、UDP端口(单个协议,端口不能重复。但不同协议,可相同)
端口分类:
公有端口 0~1023
HTTP:80
HTTPS:443
FTP:21
Telent:23
程序注册端口:1024~49151,分配用户或程序
Tomcat:8080
MySQL:3306
Oracle:1521
动态、私有端口:49152~65535
(尽量不要用这里的端口)
CMD中查看设备的端口
netstat -ano
netstat -ano|findstr "xxx" # 查看指定端口
java中的应用
类
class InetSocketAddress
getAddress() //获取IP地址
getHostName() //获取IP地址名
getPort() //获取端口号
//模拟端口
InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1", 8080);
System.out.println(inetSocketAddress); ///127.0.0.1:8080
System.out.println(inetSocketAddress.getAddress()); ///127.0.0.1
System.out.println(inetSocketAddress.getHostName()); //www.lrz.com
System.out.println(inetSocketAddress.getPort()); //8080
通信协议
为了解决 计算机交流的 一种约定
网络通信协议:速率、码率、代码结构、传输控制…
TCP/IP协议族 【=>传输层】
TCP:用户传输协议
UDP:用户数据报协议
IP:网络互联协议
TCP&UDP 的对比
TCP:
连接、稳定
三次握手 四次挥手
客户端 --- 请求服务 ---> 服务端
<--- 回应服务 -------
---- 再次发送具体请求 -->
--- 申请断开服务 -->
<--- 通知明白请求 --
<--- 询问是否确定 --
---- 确定断开 -->
分为客户端、服务端
传输完成,释放连接,效率低
UDP:
不连接、不稳定
虽然也分为客户端和服务端、但没有明确的界限
不管有无准备,都可发送
容易导致DDOS攻击,即你可不接受数据,但它发送不断发送时,会堵塞通道
TCP实现聊天
主要类
class socket
客户端
public class TcpDemo {
public static void main(String[] args) throws Exception {
//1.获取服务器的地址、端口号
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
int port=9802;
//2.创建Socket连接
Socket socket = new Socket(inetAddress,port);
//3.发送消息
OutputStream outputStream = socket.getOutputStream();
outputStream.write("Hello".getBytes());
//关闭资源
socket.close();
outputStream.close();
}
}
服务端
public class TcpServer {
public static void main(String[] args) throws IOException {
//1.设置服务器的地址
ServerSocket serverSocket = new ServerSocket(9802);
//2.等待客户端连接
Socket accept = serverSocket.accept();
//3.读取客户端的消息
InputStream inputStream = accept.getInputStream();
//管道流
ByteArrayOutputStream 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.toString());
//关闭资源
serverSocket.close();
inputStream.close();
accept.close();
byteArrayOutputStream.close();
}
}
UDP
不需要连接 但需要知道对方地址
主要java类
class DatagramSocket
class DatagramPacket
服务器
package javaEE;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UdpServet {
public static void main(String[] args) throws Exception {
//开放端口
DatagramSocket socket = new DatagramSocket(9820);
//接收数据包
byte[] bytes = new byte[1024];
DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length);
//堵塞接收
socket.receive(packet);
System.out.println(new String(packet.getData(),0,packet.getLength()));
socket.close();
}
}
客户端
package javaEE;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UdpClient {
public static void main(String[] args) throws Exception {
//1.建立一个Socket
DatagramSocket socket = new DatagramSocket();
//2.建立数据包
String msg ="Hello";
//发送对象
InetAddress localhost = InetAddress.getByName("localhost");
int port=9820;
DatagramPacket datagramPacket = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port);
//3.发送包
socket.send(datagramPacket);
socket.close();
}
}