java学习笔记 --- 网络编程(套接字)
1、Socket通信原理
Socket套接字概述:
网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。
通信的两端都有Socket。
网络通信其实就是Socket间的通信。
数据在两个Socket间通过IO流传输。
Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP和port。
B:图解
二、UDP传输
1.发送Send
创建DatagramSocket, 随机端口号
创建DatagramPacket, 指定数据, 长度, 地址, 端口
使用DatagramSocket发送DatagramPacket
关闭DatagramSocket
2.接收Receive
创建DatagramSocket, 指定端口号
创建DatagramPacket, 指定数组, 长度
使用DatagramSocket接收DatagramPacket
关闭DatagramSocket
从DatagramPacket中获取数据
3.接收方获取ip和端口号
String ip = packet.getAddress().getHostAddress();
int port = packet.getPort();
public class Send { public static void main(String[] args) throws Exception { //键盘输入 Scanner sc = new Scanner(System.in); //1、创建DatagramSocket,随机端口号 DatagramSocket scoket = new DatagramSocket(); //创建传输内容 while(true){ String str = sc.nextLine(); //如果输入"886"则退出 if("886".equals(str)){ break; } //2、创建DataramPacket,指定数据,长度,地址,端口 DatagramPacket packet = new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666); //3、使用DatagramSocket发送DatagramPacket scoket.send(packet); } //4、关闭DatagramSocket scoket.close(); } } ------------------------------------------------------------------------------------- public class Receive { public static void main(String[] args) throws Exception { //1、创建DatagramSocket,制定端口号 DatagramSocket socket = new DatagramSocket(6666); //2、创建DatagramPacket,指定数组,长度 DatagramPacket packet = new DatagramPacket(new byte[1024], 1024); //3、使用DatagramSocket接收DatagramPacket 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+":"+":"+new String(arr,0,len)); } } }
三、TCP协议传输
1.客户端
创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器
调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
输入流可以读取服务端输出流写出的数据
输出流可以写出数据到服务端的输入流
2.服务端
创建ServerSocket(需要指定端口号)
调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
输入流可以读取客户端输出流写出的数据
输出流可以写出数据到客户端的输入流
/*.服务端 * 创建ServerSocket(需要指定端口号) * 调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket * 调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流 * 输入流可以读取客户端输出流写出的数据 * 输出流可以写出数据到客户端的输入流 */ public class Server { public static void main(String[] args) throws IOException { //1、创建ServerSocket,并指定端口号 ServerSocket server = new ServerSocket(12345); //2、调用ServerSocket的accept()方法接受一个客户端请求,等到一个Socket Socket socket = server.accept(); //3、调用Socket的getInputStream()和getOutputStream()方法获取客户端相连的io流 InputStream is = socket.getInputStream(); OutputStream os = socket.getOutputStream(); os.write("百度一下吧".getBytes());//服务器向客户端写出数据 //读取客户端发过来的数据 byte[] arr =new byte[1024]; int len = is.read(arr); //将数据转换成字符串并打印 System.out.println(new String(arr,0,len)); //释放资源 socket.close(); } ------------------------------------------------------------------------------------- /*.客户端 * 创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器 * 调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流 * 输入流可以读取服务端输出流写出的数据 * 输出流可以写出数据到服务端的输入流 */ public class Cilent { public static void main(String[] args) throws Exception{ //1、创建Socket连接服务器端(要指定Ip地址和端口号)通过ip地址找到对应的服务器 Socket socket = new Socket("127.0.0.1",12345); //2、调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流 InputStream is =socket.getInputStream(); OutputStream os = socket.getOutputStream(); //3、读取服务器端发过来的数据 byte[] arr = new byte[1024]; int len = is.read(arr); //4、将数据转换成字符串打印 System.out.println(new String(arr,0,len)); //向服务器写数据 os.write("是这样敲代码吗".getBytes()); //释放资源 socket.close(); } }