计算机网络
127.0.0.1
IP :互联网协议地址 ipv4和ipv6 设备在网络中的唯一表示
DNS把域名解析为了IP
IPv4 4字节 点分十进制
IPv6 16字节 八组 冒分十六进制 去头0,0位压缩
端口号: 找到设备中软件的标识 两个字节表示的整数 0~65535
协议 :计算机网络中,连接和通信的规则被称为计算机网络通信
InetAddress 类使用
//通过主机名获取主机对象 InetAddress inetAddress= InetAddress.getByName("DESKTOP-4MKNLPK"); System.out.println("主机名为"+inetAddress.getHostName()); System.out.println("IP为"+inetAddress.getHostAddress());
1 允许部分数据丢失,使用UDP(用户数据报)协议 无连接
发送数据 (单播)
class Client { public static void main(String[] args) throws IOException { Scanner scanner =new Scanner(System.in); //找码头 数据报 套接字 DatagramSocket datagramSocket=new DatagramSocket(); //数据报 封装 String string=scanner.next(); byte[] bytes=string.getBytes(); InetAddress inetAddress=InetAddress.getByName("127.0.0.1"); int port=10086; DatagramPacket datagramPacket=new DatagramPacket(bytes,bytes.length,inetAddress,port); //发送数据 datagramSocket.send(datagramPacket); System.out.println("发送成功"); //释放资源 datagramSocket.close(); } }
接收数据
public class Server { public static void main(String[] args) throws IOException { //找码头 数据报套接字 DatagramSocket datagramSocket=new DatagramSocket(10086); //装数据报箱子 byte[] bytes=new byte[1204]; DatagramPacket datagramPacket=new DatagramPacket(bytes,bytes.length); //接受数据 System.out.println("接受数据"); datagramSocket.receive(datagramPacket); System.out.println("接收成功"); //获取箱子中的数据 String string=new String(datagramPacket.getData()); System.out.println(string); //释放资源 datagramSocket.close(); } }
UDP(组播)
MulticastSocket ms=new MulticastSocket(port)//接收端
//把当前计算机绑定一个人组播地址
//组播地址 224.0.0.1~239.255.255.255 组播的预留地址为 224.0.0.1~224.0.0.255
发送数据
class Client {
public static void main(String[] args) throws IOException {
//套接字
Scanner scanner =new Scanner(System.in);
DatagramSocket datagramSocket=new DatagramSocket();
//装 数据报的箱子
String string=scanner.next();
byte[] bytes=string.getBytes();
InetAddress inetAddress=InetAddress.getByName("224.0.0.15");
int port=14752;
DatagramPacket datagramPacket=new DatagramPacket(bytes,bytes.length,inetAddress,port);
//发送数据
datagramSocket.send(datagramPacket);
System.out.println("发送成功");
//释放资源
datagramSocket.close();
}
}
接收数据
public class Server { public static void main(String[] args) throws IOException { //创建 广播套接字对象 MulticastSocket multicastSocket=new MulticastSocket(14752); //创建数据报报对象 byte[] arr=new byte[1024]; DatagramPacket datagramPacket=new DatagramPacket(arr,arr.length); //加入组播组 multicastSocket.joinGroup(InetAddress.getByName("224.0.0.15")); multicastSocket.receive(datagramPacket); String s=new String(datagramPacket.getData()); System.out.println(s); //释放资源 multicastSocket.close(); } }
UDP (广播)
广播 InetAddressdd255.255.255.255
2 不允许任何数据丢失,是同TCP(传输控制协议)协议 面向连接
发送端
/* //套接字 两台机器间通信的端点 Scoket sk=new Socket(host,port); //获取IO流开始写写数据 OutputStream os=socket.getOutputStream(); //将字节输出流转换为字符输出流 OutputStreamWriter osw=new OutputStreamWriter(os); BufferedWriter bw=new BufferedWriter(osw); */ public class SocketClient { public static void main(String[] args) throws IOException { //创建套接字对象 Socket socket=new Socket("192.168.11.61",10000); //创建字节输出流对象 OutputStream outputStream=socket.getOutputStream(); //字节输出流转换为字符输出流 OutputStreamWriter outputStreamWriter=new OutputStreamWriter(outputStream); BufferedWriter bufferedWriter=new BufferedWriter(outputStreamWriter); bufferedWriter.write("带骨头的狗"); bufferedWriter.newLine(); bufferedWriter.close(); //释放资源 socket.close(); } }
接收数据
//客户端连接服务器三次握手 //在最后一步断开链接,通过四次挥手协议保证连接终止 public class Server { public static void main(String[] args) throws IOException { //创建服务器端的套接字对象 ServerSocket socket=new ServerSocket(10000); //监听客户端连接 阻塞方法 Socket accept=socket.accept(); //创建字节输入流对象,接受 InputStream inputStream=accept.getInputStream(); //字节输入流转换成字符输入流 InputStreamReader inputStreamReader=new InputStreamReader(inputStream); BufferedReader bufferedReader=new BufferedReader(inputStreamReader); //readLine阻塞方法,传输的数据报中没有结束符标记 System.out.println(bufferedReader.readLine()); //在关IO流的时候,多了一个往服务器理写结束标记的动作 bufferedReader.close(); socket.close(); } }
三次握手 粗浅理解,不是计算机网络
四次挥手 粗浅理解
数据交互小练习
客户端
public class Client01 { public static void main(String[] args) throws IOException { //创建套接字对象 Socket socket=new Socket("127.0.0.1",10086); //创建字节输出流输出到套接字对象中 OutputStream outputStream=socket.getOutputStream(); //将字节输出流转换为字符输出流 OutputStreamWriter outputStreamWriter=new OutputStreamWriter(outputStream); BufferedWriter bufferedWriter=new BufferedWriter(outputStreamWriter); bufferedWriter.write("大白鹅"); bufferedWriter.newLine(); bufferedWriter.flush(); socket.shutdownOutput(); //接受服务器的回复 InputStream inputStream=socket.getInputStream(); //字节输入流转换为字符数入流 InputStreamReader inputStreamReader=new InputStreamReader(inputStream); BufferedReader bufferedReader=new BufferedReader(inputStreamReader); System.out.println(bufferedReader.readLine()); bufferedWriter.close(); bufferedReader.close(); socket.close(); } }
服务器端
public class Server { public static void main(String[] args) throws IOException { //创建服务器端 套接字对象 ServerSocket serverSocket=new ServerSocket(10086); // 创建连接 阻塞任务 Socket accept=serverSocket.accept(); //创建字节输入流 InputStream inputStream=accept.getInputStream(); //字节输入流转换为字符数入流 InputStreamReader inputStreamReader=new InputStreamReader(inputStream); BufferedReader bufferedReader=new BufferedReader(inputStreamReader); System.out.println(bufferedReader.readLine()); //回复客户端 OutputStream outputStream=accept.getOutputStream(); //将字节输出流转换为字符输出流 OutputStreamWriter outputStreamWriter=new OutputStreamWriter(outputStream); BufferedWriter bufferedWriter=new BufferedWriter(outputStreamWriter); bufferedWriter.write("难道你就是传说中的大白鹅"); bufferedWriter.close(); bufferedReader.close(); accept.close(); } }
文件里的数据交互小练习
优化 服务端
文件名随机且唯一(有很小小小的几率重复) UUID
reandomUUID()
toString().replace()
改为多线程
加线程池
类 InetAddress
ipconfig 查看本机IP地址
私有构造 成员方法
public class MyInetAddress { public static void main(String[] args) throws UnknownHostException { //通过ip获取主机对象 InetAddress inetAddress= InetAddress.getByName("192.168.56.1"); System.out.println("主机名为"+inetAddress.getHostName()); System.out.println("IP为"+inetAddress.getHostAddress()); /*byte[] arr="192.168.56.1".getBytes(); InetAddress inetAddress=InetAddress.getByAddress(arr); System.out.println(inetAddress.getHostName());*/ } }