网络编程
2.网络通信的两要素(如何实现网络的通信?)
地址(IP+端口号)
规则 (网络通信协议)TCP 、UTP
3. IP
IP地址 InetAddress
-
唯一定位一台网络上的计算机
-
127.0.0.1 本机localhost
-
IP地址的分类
-
Ipv4 / Ipv6
-
IPV4 四个字节 0-255 2011年已经用完
-
IPV6 八个无符号整数
-
-
公网IP 私网IP
-
192.168.xx.xx 一般都是局域网
-
-
import java.net.Inet4Address;
import java.net.UnknownHostException;
public class TestInetAdddress {
public static void main(String[] args) {
try {
Inet4Address inet4Address = (Inet4Address) Inet4Address.getByName("localhost");
System.out.println(inet4Address);//localhost/127.0.0.1
Inet4Address inet4Address1 = (Inet4Address) Inet4Address.getLocalHost();
System.out.println(inet4Address1);//DESKTOP-5D4I4TV/172.20.10.2 电脑型号(主机名)
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
4. 端口
端口概念
端口表示计算机上的一个程序的进程
-
不同的进程有不同的端口号,用这来区分软件
-
被规定为0-65536
-
TCP , UDP
5.通信协议
协议,约定,就好比我们说的普通话
网络通信协议: 速率 、 传输速率、代码结构 、 传输控制
问题:非常复杂?但我们通过分层来简化。
TCP/IP协议簇 :实际上是一组协议
重要
-
TCP:用户传输协议
-
UDP:用户数据报协议
出名的协议
-
TCP
-
IP :网际互联协议
6.TCP与UDP对比
TCP :打电话
-
连接 ,稳定
-
三次握手,四次挥手
//三次握手(最少需要三次) A:你愁啥 B:瞅你咋地? A:干一场 ! //四次挥手 A:我要走了 B:你真的要走了吗? B:你真的真的要走了吗? A:我真的要走了!
-
客户端,服务端
-
传输完成,释放连接,效率低
UDP :发短信
-
不连接 ,不稳定
-
客户端,服务端,没有明确的界限
-
不管有没有准备好,都可以发给你
-
导弹
-
DDOS :洪水攻击(饱和攻击)
7.TCP实现聊天 (打电话)
Client
public class TcpClient {
//客户端
public static void main(String[] args) throws IOException {
Socket socket = null;
OutputStream os = null;
System.out.println("Client is running---------");
try {
//1.要知道服务器的ip和端口号
InetAddress serverIP = InetAddress.getByName("127.0.0.1");
int port=9999;
//2.创建一个socket连接
socket = new Socket(serverIP,port);
//3.发送消息 IO流
os = socket.getOutputStream();
os.write("客户端:server你好,我是客户端长城!".getBytes());
} catch (Exception e) {
e.printStackTrace();
}finally {
socket.close();
os.close();
}
}
}
Server
public class TcpServer {
//服务器端
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = null;
Socket socket = null;
InputStream inputStream =null;
ByteArrayOutputStream baos = null;
System.out.println("Server is running--------");
try {
//1.作为服务器,我得有一个地址 和端口
serverSocket = new ServerSocket(9999);
//2.等待客户端连接我
socket = serverSocket.accept();
//3.读取客户端发来的信息
inputStream = socket.getInputStream();
//管道流(显式读取到得数据)
baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len=inputStream.read(buffer))!=-1){
baos.write(buffer,0,len);
}
System.out.println(baos.toString());
} catch (IOException e) {
e.printStackTrace();
}finally {
serverSocket.close();
socket.close();
inputStream.close();
baos.close();
}
}
}
8. TCP实现文件上传
-
9.初步认识tomcat
10. UDP 消息发送 (发短信)
发短信:不用连接,只需知道对方地址即可。
//模拟A向B发送短信
A:
public class UdpA {
public static void main(String[] args) throws Exception {
//1.创建socket,获取目标IP、Port
DatagramSocket socket = new DatagramSocket();
InetAddress localhost = InetAddress.getByName("127.0.0.1");//127.0.0.1即代表本主机
int port = 8080;
//2.创建(准备)数据包
String msg = "你好啊B,我是A, 恭喜你收到了我的短信!";
//数据内容、发送数据起始点 、发送数据的总长度、目标IP、目标端口port
DatagramPacket dataPackage = new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,localhost,port);
//3.使用socket发送数据包
socket.send(dataPackage);
//4.关闭socket资源
socket.close();
}
}
B:
public class UdpB {
public static void main(String[] args) throws Exception {
//1.开放端口-持续监听
DatagramSocket socket = new DatagramSocket(8080);
//2.接收数据包
byte[] buffer = new byte[1024];
DatagramPacket dataPacket = new DatagramPacket(buffer, 0, buffer.length);//接收方
socket.receive(dataPacket);
//3.显示数据包
System.out.println(new String(dataPacket.getData()));//新建一个Stirng对象,以便显示数据
//4.关闭连接
socket.close();
}
}
10. UDP在线聊天
1. 循环获取键盘输入+循环获取发送发的内容
(1)循环接收键盘输入
//模拟A向B发送短信场景
public class UdpA {
public static void main(String[] args) throws Exception{
//1.打开socket,获取目标ip与端口
DatagramSocket socket = new DatagramSocket();
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
int port = 8080 ;
//2.准备数据包(讲原本写死的转换成键盘输入的)
//String msg = "这里是A,呼叫B,听到请回答!";
while(true){
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));//获取键盘的输入
String msg = reader.readLine();
DatagramPacket datagramPacket = new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,inetAddress,port);
if(datagramPacket.getData().equals("bye")){
break;
}
//3.发送数据包
socket.send(datagramPacket);
}
//4关闭资源
socket.close();
}
}
(2)循环接受发送方的内容
public class UdpB {
public static void main(String[] args) throws Exception{
//1,使用socket,持续监听
DatagramSocket socket = new DatagramSocket(8080);
while(true){
//2.接收数据
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
socket.receive(packet);
if (packet.getData().equals("bye")) {
break;
}
//3.显示数据
System.out.println(new String(packet.getData()));
}
//4.关闭资源
socket.close();
}
}
2. 引入多线程实现同时在线聊天
-