网络通信
1.概念:两台设备之间通过网络实现数据传输;
2.网络通信:将数据通过网络从一台设备传输到另一台设备
3.java.net包下提供了一系列的类或接口,完成网络通信
网络
1.概念:两台或多台设备通过一定物理设备连接起来构成了网络;
2.根据网络的覆盖范围不同,对网络进行分类:
局域网:覆盖范围最小,仅仅覆盖一个教室或一个机房;
城域网:覆盖范围较大,可以覆盖一个城市;
广域网:覆盖范围最大,可以覆盖全国甚至全球,万维网是广域网的代表;
网络通信协议
协议(Tcp/Ip):在网络编程中,数据的组织形式就是协议;
Tcp/Ip(Transmission Control Protocol/Internet Protocol)的简写,
中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议,这个协议是Internet最基本的协议,Internet国际互联网络的基础,简单的说,就是由网络层的IP协议和传输层的TCP协议组成的。
实例:客户端向服务发送hello,server,使用字节流
服务端:
package com.example.socket; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; /** * @Author 郜庆辉 * @Time 2022/6/10 14:57 * @Version 1.0 */ public class SocketTcp01Server { public static void main(String[] args) throws IOException { //1.在本机的9999端口监听,等待连接 // 细节:要求在本机没有其他服务在监听9999 ServerSocket serverSocket = new ServerSocket(9999); System.out.println("服务端在9999端口监听,等待连接..."); //2.当没有客户端连接9999端口时,程序会阻塞,等待连接 //如果有客户端连接,则会返回Socket对象,程序继续执行 Socket socket = serverSocket.accept(); System.out.println("服务端Socket返回=" + socket.getClass()); //3.通过socket.getInputStream()读取客户端写入到数据通道的数据,显示 InputStream inputStream = socket.getInputStream(); //4.IO读取 byte[] buf = new byte[1024]; int readLine = 0; while ((readLine = inputStream.read(buf)) != -1){ System.out.println(new String(buf,0,readLine));//根据读取到的实际长度显示为字符串 } //5.关闭流和socket serverSocket.close(); socket.close(); inputStream.close(); } }
客户端:
package com.example.socket; import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; /** * @Author 郜庆辉 * @Time 2022/6/10 15:02 * @Version 1.0 */ public class SocketTcp01Client { public static void main(String[] args) throws IOException { //思路: //1.连接客户端(ip,端口) //2.解读:连接本机的9999端口,如果不是本机,可以时域名或者时ip地址 //如果连接成功,返回一个socket对象 Socket socket = new Socket(InetAddress.getLocalHost(),9999); System.out.println("客户端Socket返回=" + socket.getClass()); //3.通过输出流,写入数据到数据通道 OutputStream outputStream = socket.getOutputStream(); //解释:字符串.getBytes表示将一个字符串转成一个字节数组 outputStream.write("hello,server".getBytes()); //4.关闭流对象和socket,必须关闭 outputStream.close(); socket.close(); System.out.println("客户端退出..."); } }
实例:客户端向服务发送hello,server,服务端向客户端发送hello,client,使用字节流;
客户端:
package com.example.socket2; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; /** * @Author 郜庆辉 * @Time 2022/6/10 15:30 * @Version 1.0 */ public class SocketTcp02Client { public static void main(String[] args) throws IOException { //思路: //1.连接客户端(ip,端口) //2.解读:连接本机的8888端口,如果不是本机,可以是域名或者是ip地址 //如果连接成功,返回一个socket对象 Socket socket = new Socket(InetAddress.getLocalHost(), 8888); //3.通过输出流,写入数据到数据通道 OutputStream outputStream = socket.getOutputStream(); outputStream.write("hello,server".getBytes()); //4.添加一个结束标记,通俗来说就是已经说完话了,如果没有会双方会一直等待继续输入 socket.shutdownOutput(); //5.通过socket.getInputStream()读取客户端写入到数据通道的数据,显示 InputStream inputStream = socket.getInputStream(); int readLine = 0; byte[] buf = new byte[1024]; while ((readLine = inputStream.read(buf)) != -1){ System.out.println(new String(buf,0,readLine)); } //6.关闭流 outputStream.close(); inputStream.close(); socket.close(); } }
服务端:
package com.example.socket2; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; /** * @Author 郜庆辉 * @Time 2022/6/10 15:30 * @Version 1.0 * 根据字节流实现双方通信 */ public class SocketTcp02Server { public static void main(String[] args) throws IOException { //1.在本机的8888端口监听,等待连接 // 细节:要求在本机没有其他服务在监听8888 ServerSocket serverSocket = new ServerSocket(8888); //2.当没有客户端连接8888端口时,程序会阻塞,等待连接 //如果有客户端连接,则会返回Socket对象,程序继续执行 Socket socket = serverSocket.accept(); //3.通过socket.getInputStream()读取客户端写入到数据通道的数据,显示 InputStream inputStream = socket.getInputStream(); //4.IO读取 byte[] buf = new byte[1024]; int readLine = 0; while ((readLine = inputStream.read(buf)) != -1){ System.out.println(new String(buf,0,readLine)); } //5.通过输出流,写入数据到数据通道 OutputStream outputStream = socket.getOutputStream(); outputStream.write("hello,client".getBytes()); //6.添加一个结束标记,通俗来说就是已经说完话了,如果没有会双方会一直等待继续输入 socket.shutdownOutput(); //7.关闭流和socket serverSocket.close(); socket.close(); inputStream.close(); outputStream.close(); } }
实例:客户端向服务发送hello,server,服务端向客户端发送hello,client,使用字符流;
package com.example.socket3; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; /** * @Author 郜庆辉 * @Time 2022/6/10 15:30 * @Version 1.0 * 根据字节流实现双方通信 */ public class SocketTcp03Server { public static void main(String[] args) throws IOException { //1.在本机的8888端口监听,等待连接 // 细节:要求在本机没有其他服务在监听8888 ServerSocket serverSocket = new ServerSocket(8888); //2.当没有客户端连接8888端口时,程序会阻塞,等待连接 //如果有客户端连接,则会返回Socket对象,程序继续执行 Socket socket = serverSocket.accept(); //3.通过socket.getInputStream()读取客户端写入到数据通道的数据,显示 InputStream inputStream = socket.getInputStream(); //使用字符流来读取 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String s = bufferedReader.readLine(); System.out.println(s); //5.通过输出流,写入数据到数据通道 OutputStream outputStream = socket.getOutputStream(); BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream)); bufferedWriter.write("hello,client 字符流"); bufferedWriter.newLine();//插入一个换行符,表示写入的内容结束,注意:要求对方使用readLine()来读!! bufferedWriter.flush();//如果使用的是字符流需要手动刷新,否则数据不会写入数据通道 //6.添加一个结束标记,通俗来说就是已经说完话了,如果没有会双方会一直等待继续输入 socket.shutdownOutput(); //7.关闭流和socket serverSocket.close(); socket.close(); bufferedReader.close(); bufferedWriter.close(); } }
基本介绍:
实例:
UPD接收端:
package com.example.UDP; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; /** * @Author 郜庆辉 * @Time 2022/6/11 17:06 * @Version 1.0 * UPD接收端 */ public class UDPReceiverA { public static void main(String[] args) throws IOException { //1.创建一个DatagramSocket对象,准备在9999端口接收数据 DatagramSocket socket = new DatagramSocket(9999); //2.构建一个DatagramPacket对象,准备接收数据 byte[] bytes = new byte[1024]; DatagramPacket packet = new DatagramPacket(bytes,bytes.length); //3.调用接收方法,将通过网络传输的DatagramPacket对象填充到packet对象 //注意:当有数据包发送到本机的9999端口时就会接收数据,没有数据报发送就阻塞等待 System.out.println("接收端A等待接收数据"); socket.receive(packet); //4.可以把packet进行拆包,取出数据并显示 int length = packet.getLength();//实际收到的数据字节长度 byte[] data = packet.getData(); //接收到的数据 String s = new String(data, 0, length); System.out.println(s); //接收返回的数据好的明天见 byte[] bytes1 = "好的明天见".getBytes(); DatagramPacket packet1 = new DatagramPacket(bytes1,bytes1.length, InetAddress.getByName("169.254.115.195"),9998); socket.send(packet1); socket.close(); } }
UPD发送端:
package com.example.UDP; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; /** * @Author 郜庆辉 * @Time 2022/6/11 17:05 * @Version 1.0 * UPD发送端 */ public class UDPsenderB { public static void main(String[] args) throws IOException { //1.创建一个DatagramSocket对象,准备在9998端口接接收 DatagramSocket socket = new DatagramSocket(9998); //2.将需要发送的数据封装到DatagramPacket对象 byte[] data = "明天吃火锅".getBytes(); //说明:封装的DatagramPacket对象 data 内容字节数组,data.length 主机IP,端口 DatagramPacket packet = new DatagramPacket(data,data.length, InetAddress.getByName("169.254.115.195"),9999); socket.send(packet); data = new byte[1024]; DatagramPacket packet1 = new DatagramPacket(data,data.length); System.out.println("发送端B等待接收数据"); socket.receive(packet1); int length = packet1.getLength();//实际收到的数据字节长度 data = packet1.getData(); //接收到的数据 String s = new String(data, 0, length); System.out.println(s); //关闭资源 socket.close(); } }