JAVA网络编程
一、网络编程
1、概述:
计算机网络是通过传输介质、通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来的,实现资源共享和数据传输的系统。网络编程就是编写程序使互联网的两个(或多个)设备(如计算机)之间进行数据传输。Java语言对网络编程提供了良好的支持。通过其提供的接口我们可以很方便地进行网络编程。
(java web 网页编程 b/s ; 网络编程 c/s)
2、目的
传播交流信息,数据交换,网络通信。
3、达到这个效果,需要什么?
1、如何准确的定位网络上的一台主机
2、找到了这个主机,如何传输数据呢?
二、网络通信的要素
如何实现网络的通信? ==》知道通信双方的地址(ip,端口号)
规则:网络通信的协议
三、IP
1、ip 地址:InterAddress
2、唯一定位一台网络上计算机
3、127.0.0.1 :本机loclahost
4、ip地址的分类:
ipv4/ipv6
ipv4:127.0.0.1 ,由4个字节组成 ,0~255
ipv6: 2409:8960:2afc:5e4d:216d:a1a2:a44d:411c 128位,8个无符号整数
5、公网==》用于互联网 ;私网 ==》用于局域网
ABCD类地址:详情出处请点击https://www.jb51.net/network/579228.html
192.168.xx.xx 专门给组织内部使用的
package lesson01; //测试ip import java.net.InetAddress; import java.net.UnknownHostException; public class TestInetAdreess { public static void main(String[] args) { try { //查询本机地址 ===有三种方式 InetAddress address = InetAddress.getByName("127.0.0.1"); System.out.println(address); InetAddress address2= InetAddress.getByName("localhost"); System.out.println(address2); InetAddress address3 = InetAddress.getLocalHost(); System.out.println(address3); //查询网站地址 InetAddress address1 = InetAddress.getByName("www.baidu.com"); System.out.println(address1); //常用的方法 System.out.println(address1.getAddress()); System.out.println(address1.getCanonicalHostName());//规范的名字 System.out.println(address1.getHostAddress()); //ip System.out.println(address1.getHostName()); //域名 或者自己电脑的名字 } catch (UnknownHostException e) { e.printStackTrace(); } } }
四、端口
1、概念:
在网络技术中,端口(Port)大致有两种意思:一是物理意义上的端口,比如,ADSL Modem、集线器、交换机、路由器用于连接其他网络设备的接口,如RJ-45端口、SC端口等等。二是逻辑意义上的端口,一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。(端口表示计算机上的一个程序的进程)
2、端口的分类():
公有端口:0~1023
常见的端口:
HTTP : 80
HTTPS : 443
FTP : 21
Telent : 23
程序注册端口:1024~49151 ,分配给用户或者程序
常见的端口:
Tomcat : 8080
Mysql:3306
Oracle : 1521
动态端口,私有端口:49152~65535
3、dos下查看所有端口号:netstat -ano
查看指定的端口 : netstat -ano |findstr "查询某一个端口号”
查看指定某一个程序的端口 :tasklist | findstr " 某一个程序端口"
快速打开任务管理器:ctrl+shift+ESC
package lesson01; import java.net.InetSocketAddress; public class TestInterSocketAddress { public static void main(String[] args) { InetSocketAddress socketAddress = new InetSocketAddress("127.0.0.1", 8080); InetSocketAddress socketAddress1 = new InetSocketAddress("localhost", 8080); System.out.println(socketAddress); System.out.println(socketAddress1); //常用的方法 System.out.println(socketAddress.getAddress()); System.out.println(socketAddress.getHostName());//地址 System.out.println(socketAddress.getPort()); // 端口 } }
五、通信协议:
1、网络通信协议:网络通信协议是一种网络通用语言,为连接不同操作系统和不同硬件体系结构的互联结构引提供通信支持,是一种网络通用语言。
2、重要协议:
TCP : 用户传输协议
UDP :用户数据报协议
3、出名的协议(实际上:TCP/IP 是一组协议):
TCP
IP :网络互联协议
4、TCP、UDP对比
TCP: 连接稳定、
三次握手:最少需要三次连接,才保证稳定连接
四次挥手,
客户端,服务端
传输完成,释放连接,效率低
UDP:不连接,不稳定
客户端、服务端 ,没有明确的界限
不管有没有准备好,都可以发给你
六、TCP协议:
客户端:
1、连接服务器Socket
2、发送消息
package lesson02; import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; //客户端 public class TcpClient { public static void main(String[] args) { Socket socket =null; OutputStream outputStream=null; //1、要知道服务器地址 try { InetAddress address = InetAddress.getByName("127.0.0.1"); int port=9999; //2、创建一个socket连接 socket = new Socket(address,port); //3、发送消息,io流 outputStream = socket.getOutputStream(); outputStream.write("hahahahh".getBytes()); } catch (Exception e) { e.printStackTrace(); } finally { if (outputStream !=null){ try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (socket !=null){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
服务端:
1、建立服务器的端口 ServerSocket
2、等待用户的连接 accept
3、接受用户的消息
package lesson02; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; //服务端 public class TcpServer { public static void main(String[] args) { ServerSocket serverSocket=null; Socket socket=null; InputStream inputStream=null; ByteArrayOutputStream baos=null; try { serverSocket = new ServerSocket(9999); //1、设一个地址 while (true){ //无限的接受客户端的连接 socket = serverSocket.accept(); //2、等待客户端的连接 System.out.println("等待客户端的连接"); inputStream = socket.getInputStream(); //3、读取客户端的消息 //管道流 baos = new ByteArrayOutputStream(); byte[] buffer= new byte[1024]; int len; while ((len=inputStream.read(buffer))!=-1){ baos.write(buffer,0,len); } System.out.println(baos.toString()); } } catch (IOException e) { e.printStackTrace(); }finally { try {//关闭资源 if (baos !=null){ try { baos.close(); }catch (IOException e){ e.printStackTrace(); } } if (inputStream !=null){ try { inputStream.close(); }catch (IOException e){ e.printStackTrace(); } } if ( socket !=null){ try { socket.close(); }catch (IOException e){ e.printStackTrace(); } } if (serverSocket !=null){ try { serverSocket.close(); }catch (IOException e){ e.printStackTrace(); } } }catch (Exception e){ e.printStackTrace(); } } }
实现文件上传:客户端和服务端
package lesson02; import java.io.*; import java.net.InetAddress; import java.net.Socket; //客户端 public class TcpFileClient { public static void main(String[] args) throws Exception { //1、创建一个Socket连接 Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 8081); //2、创建一个输出流 OutputStream outputStream = socket.getOutputStream(); //3、读取文件流 FileInputStream inputStream = new FileInputStream(new File("file.txt")); //4、写出文件 byte[] buffer= new byte[1024]; int len; while ((len=inputStream.read(buffer))!=-1){ outputStream.write(buffer,0,len); } //通知服务器,资源已接收完毕了 socket.shutdownOutput(); //确定服务器接受完毕,才能断开连接 InputStream inputStream1 = socket.getInputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer1=new byte[1024]; int len1; while ((len1=inputStream1.read(buffer1))!=-1){ baos.write(buffer1,0,len1); } System.out.println(baos.toString()); //5、关闭资源 inputStream.close(); outputStream.close(); socket.close(); } }
package lesson02; import java.io.*; import java.net.ServerSocket; import java.net.Socket; //服务端 public class TcpFileServer { public static void main(String[] args) throws IOException { //1、创建服务 ServerSocket socket = new ServerSocket(8081); //2、监听客户端的连接 Socket accept = socket.accept();//阻塞式监听,会一直等客户端连接 //3、获取输入流 InputStream inputStream = accept.getInputStream(); //4、文件输出 FileOutputStream receive = new FileOutputStream(new File("receive2.txt")); byte[] buffer=new byte[1024]; int len; while((len=inputStream.read(buffer))!=-1){ receive.write(buffer,0,len); } //通知客户端,文件接收完毕 OutputStream outputStream = accept.getOutputStream(); outputStream.write("文件接收完毕,可以断开了".getBytes()); //关闭资源 receive.close(); inputStream.close(); socket.close(); } }
七、UDP协议:
实现发消息:
客户端:
package lesson03; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; //UDP 不用连接服务器 public class UDPClientDemo { public static void main(String[] args) throws Exception { //1、建立一个socket DatagramSocket socket = new DatagramSocket(8080); //2、建一个包 String msg="你好呀!服务器"; //发送给谁 InetAddress localhost = InetAddress.getByName("localhost"); int port=6320; DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length,localhost,port); //3、发送包 socket.send(packet); //关闭资源 socket.close(); } }
服务端:
package lesson03; import java.net.DatagramPacket; import java.net.DatagramSocket; //等待客户端的连接 public class UDPServerDemo { public static void main(String[] args) throws Exception { //开放端口 DatagramSocket socket = new DatagramSocket(6320); //接收数据包 byte[] buffer=new byte[1024]; DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length); socket.receive(packet);//阻塞接收 System.out.println(packet.getAddress().getHostAddress()); System.out.println(new String(packet.getData(), 0, packet.getLength())); //关闭连接 socket.close(); } }
实现循环发送消息:
发送端:
package lesson03; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetSocketAddress; public class UDPSendDemo01 { public static void main(String[] args) throws Exception { DatagramSocket socket = new DatagramSocket(8250); //准备数据,控制台读取 System.in BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); while (true){ String data = reader.readLine(); byte[] datas = data.getBytes(); DatagramPacket packet = new DatagramPacket(datas,0,datas.length, new InetSocketAddress("localhost",6666)); socket.send(packet); if (data.equals("bye")){ break; } } socket.close(); } }
接收端:
package lesson03; import java.net.DatagramPacket; import java.net.DatagramSocket; public class UDPReceiveDdemo01 { public static void main(String[] args) throws Exception { DatagramSocket socket = new DatagramSocket(6666); while (true) {//准备接收 byte[] container = new byte[1024]; DatagramPacket packet = new DatagramPacket(container, 0, container.length); socket.receive(packet); //断开连接 byte[] data = packet.getData(); String receiveData = new String(data, 0, packet.getLength()); System.out.println(receiveData); if (receiveData.equals("bye")) { break; } } socket.close(); } }
全部代码详情:https://gitee.com/zhaoyuanq994/InterProject