网络
1.概念:一组相互连接的计算机;
2.特点:
1)多台计算机组成;
2)使用物理线路进行连接;
3.网络编程三要素:
1)IP地址:唯一标识网络上的每一台计算机;
两台电脑之间通信的必备要素;
2)端口号:计算机中应用的标号(代表一个应用程序),端口是虚拟概念,并不是说在主机上真的有若干个端口,
通过端口可以在一个主机运行多个应用程序;
0-1024目前系统使用,保留端口;以上端口民用使用;
3)通信协议:TCP、UDP协议;
TCP和UDP传输协议的区别:
UDP:相当于发短信(有字数限制);
不需要建立连接;
通信双方完全平等;
数据报的大小限制在64k内;
效率较高,不安全,容易丢包;
TCP:相当于打电话,需要建立连接;
连接建立时双方存在主次之分;
效率相对来说比较低,数据传输安全;
三次握手完成;
4) 网络模型:
a)OSI参考模式:开放系统互连参考模型
b) TCP/IP参考模型:传输控制/网际协议 Transfer Controln Protocol/Internet Protocol
5) 特殊的IP地址
▪ 0.0.0.0:本机
▪ 127.0.0.1:本机回环地址,用于本机测试
▪ 255.255.255.255:当前子网,一般用于向当前子网广播信息
6) IP地址所对应的对象——>InetAddress
代码实现:
package com.cy;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class InetAddressDemo {
public static void main(String[] args) throws UnknownHostException {
//获取计算机主机名+IP地址
InetAddress localHost = InetAddress.getLocalHost();
System.out.println(localHost);
//获取计算机主机名+IP地址
InetAddress byName = InetAddress.getByName("DESKTOP-FJ5D5J3");
System.out.println(byName);
//获得主机的IP地址
System.out.println(byName.getHostAddress());
//获取主机的名称
System.out.println(byName.getHostName());
}
}
TCP:
1)Socket套接字(虚拟接口)
网络上的两个程序通过一个双向的通信连接实现数据之间的交换,这个连接的一端成为Socket.
Java中使用Socket完成TCP程序的开发,使用此类可以方便建立可靠的、双向的、持续的、点对点的通讯连接;
在Socket的程序开发中,服务器使用ServerSocket等待客户端的连接;
对于java的网络程序来讲,每一个客户端都使用一个Socket对象表示;
2)基于TCP协议的Socket编程
进行网络通信时,Socket需要借助数据流来完成数据的传递工作;
代码实现:
客户端:
package com.cy.client;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
public class Client02 {
public static void main(String[] args) throws IOException {
//创建socket对象
Socket client = new Socket("127.0.0.1",10000);
//-------------向外进行输出---------------------
//获取输出流对象
OutputStream outputStream = client.getOutputStream();
outputStream.write("hello 服务端".getBytes(StandardCharsets.UTF_8));
//-------------接受服务端数据----------------------
InputStream inputStream = client.getInputStream();
//创建缓冲区
byte[] buffer = new byte[1024];
int length = inputStream.read(buffer);
System.out.println("服务端的相应数据是:"+new String(buffer,0,length));
//关闭流
inputStream.close();
outputStream.close();
client.close();
}
}
服务端:
package com.cy.server;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
public class Server02 {
public static void main(String[] args) throws IOException {
//创建servcersocket对象
ServerSocket serverSocket = new ServerSocket(10000);
//获取服务端的套接字对象
Socket socket = serverSocket.accept();
//-------------接受客户端的输入------------------------
//获取输入流对象
InputStream inputStream = socket.getInputStream();
//创建缓冲区
byte[] buffer=new byte[1024];
int length = inputStream.read(buffer);
System.out.println("客户端传输的数据为"+new String(buffer,0,length));
//-------------返回客户端数据--------------------
//获取输出流对象
OutputStream outputStream = socket.getOutputStream();
outputStream.write("你好客户端".getBytes(StandardCharsets.UTF_8));
//关闭流对象
outputStream.close();
inputStream.close();
serverSocket.close();
}
}
UDP:
服务端:
package com.cy.server;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPServer {
public static void main(String[] args) throws Exception {
//创建UDP通信的Socket
DatagramSocket datagramSocket = new DatagramSocket(8001);
//创建缓冲区
byte[] buffer=new byte[1024];
//创建数据包--用来接收传过来的数据包
DatagramPacket datagramPacket = new DatagramPacket(buffer, buffer.length);
datagramSocket.receive(datagramPacket);
//打印输出信息
System.out.println(new String(datagramPacket.getData(),0,datagramPacket.getLength()));
}
}
客户端:
package com.cy.client;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
public class UDPClient {
public static void main(String[] args) throws Exception {
//创建UDP通信的socket
DatagramSocket datagramSocket = new DatagramSocket(8000);
//从控制台读取数据
Scanner scanner = new Scanner(System.in);
String str = scanner.next();
//创建数据包
DatagramPacket datagramPacket = new DatagramPacket(str.getBytes(StandardCharsets.UTF_8), str.getBytes(StandardCharsets.UTF_8).length, InetAddress.getByName("localhost"), 8001);
//发送数据包
datagramSocket.send(datagramPacket);
}
}