* A:计算机网络
* 是指将地理位置不同的具有独立功能的多台计算机及外部设备,通过通信连接起来
在网路操作系统,网络管理软件和网络通信协议的管理下,实现资源共享和信息传递的计算机系统
* B:网络编程
* 就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换
* 每个设备在网络中的唯一标识
* 每台网络终端在网络中都有一个独立的地址,我们在网络中传输数据就是使用这个地址
* ipconfig :查看本机 IP
* ping :测试连接
* 本地回路地址 :127.0.0.1
* 广播地址 :255.255.255.255
* IPv4 :4个字节组成,4个0到255的数,大概42亿,30亿在北美,亚洲4亿,2011年初已经用尽
* IPv6 :8组,每组4个16进制数
* 每个程序在设备上的唯一标识
* 每个网络程序都需要绑定一个端口号,传输数据的时候除了确定发到哪台机器上,还要明确发到哪个程序
* 端口号范围从 0 - 65535
* 编写网络应用就需要绑定一个端口号,尽量使用1024以上的,1024以下的基本上都被系统程序占用了
* 常用端口
* MySQL :3306
* Oracle :1521
* web :80
* tomcat :8080
* QQ :4000
* feiQ :2425
* 为计算机网络进行数据交换而建立的规则
* UDP
* 面向无连接,数据不安全,速度快,不区分客户端与服务端
* TCP
* 面向连接(三次握手),数据安全,速度略低,分为客户端和服务端
* 三次握手:客户端先向服务端发起请求,服务端响应请求,传输数据
* A:Socket套接字概述
* 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字
* 通信的两端都要Socket
* 网络通信其实就是Socket间的通信
* 数据在两个Socket间通过 I/O流传输
* Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的 IP和端口号
* A:发送,Send
* 创建 DatagramSocket,随机端口号
* 创建 DatagramPacket,指定数据,长度,地址,端口
* 使用 DatagramSocket,发送 DatagramPacket
* 关闭 DatagramSocket
* B:接收,Receive
* 创建 DatagramSocket,指定端口号
* 创建 DatagramPacket,是定数组,长度
* 使用 DatagramSocket,接收 DatagramPacket
* 关闭 DatagramSocket
* 从 DatagramPacket中获取数据
* C:接收方获取 ip和端口号
* String ip = packet.getAddress().getHostAddress();
* int port = packet.getPort()
package com.heima.socket; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class Demo1_Send { public static void main(String[] args) throws IOException { String str = "What are you doing?"; // 待发送的数据 DatagramSocket socket = new DatagramSocket(); // 创建socket,相当于创建码头,可以不指定端口号,随机绑定 DatagramPacket packet = // 创建packet,相当于创建集装箱,用于存储数据报文 new DatagramPacket(str.getBytes(), str.length(), InetAddress.getByName("192.168.0.101"), 61666); // 字节数组 数组的有效长度 主机名 端口号 socket.send(packet); // 发送数据,相当于发货 socket.close(); // 关流,相当于关闭码头 } }
package com.heima.socket; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; public class Demo1_Receive { public static void main(String[] args) throws IOException { DatagramSocket socket = new DatagramSocket(61666); // 创建Socket,绑定端口号 DatagramPacket packet = new DatagramPacket(new byte[1024], 1024); // 创建Packet,指定接收数组及其长度 socket.receive(packet); // 接收数据 byte[] arr = packet.getData(); // 用数组获取数据 int len = packet.getLength(); // 获取有效的字节个数 System.out.println(new String(arr,0,len)); // 调用 String的构造方法将数组转化为字符串 socket.close(); } }
* 发送端 Send ,发送键盘录入数据
* 接收端 Receive,接收并打印
package com.heima.socket; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.Scanner; public class Demo2_Send { public static void main(String[] args) throws IOException { Scanner sc = new Scanner(System.in); // 创建键盘录入对象 DatagramSocket socket = new DatagramSocket(); // 创建socket while (true) { String str = sc.nextLine(); // 获取键盘录入的字符串 if ("quit".equals(str)) { sc.close(); // 判断字符串并退出循环 break; } DatagramPacket packet = // 创建packet,将录入的字符串转换为字节数组并打包 new DatagramPacket(str.getBytes(), str.length(), InetAddress.getByName("192.168.0.101"), 61666); socket.send(packet); // 发送数据 } socket.close(); // 关流 } }
package com.heima.socket; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; public class Demo2_Receive { public static void main(String[] args) throws IOException { DatagramSocket socket = new DatagramSocket(61666); // 创建Socket,绑定指定的端口号 DatagramPacket packet = new DatagramPacket(new byte[1024], 1024); // 创建Packet,指定用来接收的字节数组及其长度 while (true) { // 定义无限循环 socket.receive(packet); // 接收数据 byte[] arr = packet.getData(); // 获取数据 int len = packet.getLength(); // 获取有效的字节个数 String ip = packet.getAddress().getHostAddress(); // 获取ip地址 int port = packet.getPort(); // 获取端口号 System.out.println(ip + " : " + port + " : " + new String(arr, 0, len)); // 打印数据 } } }
* 发送和接受在一个窗口内完成
package com.heima.socket; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.Scanner; public class Demo3_MoreThread { public static void main(String[] args) { new Receive().start(); // 开启接受线程 new Send().start(); // 开启发送线程 } } class Receive extends Thread { // 定义接受类继承Thread public void run() { // 重写 run()方法 try { DatagramSocket socket = new DatagramSocket(61666); // 创建Socket,绑定端口号 DatagramPacket packet = new DatagramPacket(new byte[1024], 1024); // 创建Packet while (true) { socket.receive(packet); // 接受数据 byte[] arr = packet.getData(); // 获取数据 int len = packet.getLength(); // 获取有效的字节个数 String ip = packet.getAddress().getHostAddress(); // 获取ip地址 int port = packet.getPort(); // 获取端口号 System.out.println(ip + ":" + port + ":" + new String(arr, 0, len)); } } catch (IOException e) { // 选中代码块后 alt + shift + z 一键生成try catch e.printStackTrace(); } } } class Send extends Thread { // 定义发送类继承Thread public void run() { // 重写 run()方法 try { Scanner sc = new Scanner(System.in); // 创建键盘录入对象 DatagramSocket socket = new DatagramSocket(); // 创建socket while (true) { String str = sc.nextLine(); // 键盘录入字符串 if ("quit".equals(str)) { sc.close(); break; } DatagramPacket packet = // 创建packet,将字符串转换为字节数组并打包 new DatagramPacket(str.getBytes(), str.length(), InetAddress.getByName("192.168.0.101"), 61666); socket.send(packet); // 发送数据 } socket.close(); // 关流 } catch (IOException e) { e.printStackTrace(); } } }
原文:https://www.cnblogs.com/zhaochuming/p/12726825.html