JAVA网络编程是什么 JAVA网络编程

网络编程1.1 概述1.2 网络通信要素问题:

  • 如何准确定位到一台或者多台主机
  • 找到主机之后如何进行通信
网络编程的要素:
  • IP和端口号(ip)
  • 网络通信协议(tcp/udp)
1.3 IP地址(InetAddress)特殊IP地址:
  • 127.0.0.1:本机localhost
  • ip地址分类:
    • IPV4/IPV6
      • IPV4:4个字节组成
      • IPV6:8个无符号整数,128位
    • 公网(互联网)/私网(局域网)
      • 192.168.xx.xx:专门给组织内部使用(局域网)
InetAddress中没有构造器,需要用他的静态方法返回本身
package ip_study;import java.net.InetSocketAddress;public class TestInetSocketAddress {public static void main(String[] args) {InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1",8080);System.out.println(inetSocketAddress);System.out.println(inetSocketAddress.getAddress());System.out.println(inetSocketAddress.getHostName());}}1.4 端口端口表示计算机上的一个程序的进程
  • 不同的进程有不同的端口号:用来区分软件
  • 被规定0~65535
  • 分为TCP端口和UDP端口:每个都有65535,单个协议下面端口号不能冲突
  • 端口分类:
    • 公有端口:0~1023
      • http:80
      • https:443
      • ftp:21
      • telent:23
    • 程序注册端口:1024~49151:分配给用户或者程序的
      • Tomcat:8080
      • MySQL:3306
      • Orcale:1521
    • 动态、私有:49152~65535
    netstat -ano #查看所有的端口netstat -ano|findstr "5900" #查看指定的端口tasklist|findstr"8696" #查看指定端口的进程package ip_study;import java.net.InetSocketAddress;public class TestInetSocketAddress {public static void main(String[] args) {InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1",8080);System.out.println(inetSocketAddress);System.out.println(inetSocketAddress.getAddress());System.out.println(inetSocketAddress.getHostName());}}
1.5 通信协议TCP/IP协议簇:实际上是一组协议
  • 重要:
    • TCP:用户传输协议
    • UDP:用户数据报协议
  • 出名的协议:
    • TCP:
    • IP:网络互连协议
TCP UDP对比:
  • tcp:打电话
    • 连接稳定
    • 三次握手,四次挥手
    最少需要三次,保证稳定连接A:你瞅啥B:瞅你咋地A:干一场A:我要走了B:你真的要走了吗B:你真的真的要走了吗A:我真的要走了
    • 客户端、服务端
    • 传输完成、释放连接、效率低
  • udp:发短信
    • 不连接、不稳定
    • 客户端、服务端:没有明确的界限
    • 不管有没有准备好,都可以发给你
1.6 TCP实现聊天客户端
  1. 连接服务器:Socket
  2. 发送消息
package tcp_study;import java.io.IOException;import java.io.OutputStream;import java.net.InetAddress;import java.net.Socket;import java.net.UnknownHostException;public class TcpClientDemo01 {public static void main(String[] args) {Socket socket = null;OutputStream os = null;try {//要知道服务器的地址InetAddress serverIP = InetAddress.getByName("localhost");int port = 9999;//创建一个socket连接socket = new Socket(serverIP,port);//发送消息 IO流os = socket.getOutputStream();os.write("发送方发送啦".getBytes());} catch (IOException e) {e.printStackTrace();}finally{if(os!=null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}if(socket!=null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}}服务器
1. 建立服务端口ServerSocket2. 等待用户的链接:accept3. 接受用的消息:输入流(管道流)package tcp_study;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.ServerSocket;import java.net.Socket;public class TcpServerDemo01 {public static void main(String[] args) {ServerSocket serverSocket = null;ByteArrayOutputStream baos = null;InputStream is = null;Socket socket = null;try {//得有个地址serverSocket = new ServerSocket(9999);while(true) {//等待客户端连接过来socket = serverSocket.accept();//读取客户端的消息is = socket.getInputStream();//管道流baos = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len;while ((len = is.read(buffer)) != -1) {baos.write(buffer, 0, len);}System.out.println(baos.toString());}} catch (IOException e) {e.printStackTrace();}finally {//关闭资源if(baos!=null){try {baos.close();} catch (IOException e) {e.printStackTrace();}}if(is!=null){try {is.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();}}}}}1.7 TCP实现文件上传//服务器端package ip_tofile_study;import java.io.*;import java.net.ServerSocket;import java.net.Socket;public class TcpServerDemo2 {public static void main(String[] args) throws IOException {//创建服务ServerSocket serverSocket = new ServerSocket(9000);//监听客户端连接Socket socket = serverSocket.accept();//阻塞式监听,会一直等待客户端连接//获取输入流InputStream is = socket.getInputStream();//文件输出FileOutputStream fos = new FileOutputStream(new File("receive.jpg"));byte[] buffer = new byte[1024];int len;while((len = is.read(buffer))!=-1){fos.write(buffer,0,len);}//通知客户端接受完毕了OutputStream os = socket.getOutputStream();os.write("我接收完毕了".getBytes());//关闭资源fos.close();is.close();socket.close();serverSocket.close();}}//客户端package ip_tofile_study;import java.io.*;import java.net.InetAddress;import java.net.Socket;import java.net.UnknownHostException;public class TcpClientDemo2 {public static void main(String[] args) throws IOException {//创建一个socket链接Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000);//创建一个输出流OutputStream os = socket.getOutputStream();//读取文件FileInputStream fis = new FileInputStream(new File("椎名真白.jpg"));//写出文件byte[] buffer = new byte[1024];int len;while((len = fis.read(buffer))!=-1){os.write(buffer,0,len);}//通知服务器,我已经传输完了socket.shutdownOutput();//我已经传输完了//确定服务器接受完毕,才能断开连接InputStream inputStream = socket.getInputStream();ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buffer2 = new byte[1024];int len2;while((len2=inputStream.read(buffer2))!=-1){baos.write(buffer,0,len2);}//关闭资源baos.close();inputStream.close();fis.close();os.close();socket.close();}}1.8 Tomcat服务端
  • 自定义S
  • Tomcat服务器S:java后台开发
客户端
  • 自定义C
  • 浏览器B
1.9 UDP发短信:不用链接,需要对方的地址
一端发给另外一端发送端
package udp_study;import java.io.IOException;import java.net.*;import java.nio.charset.StandardCharsets;public class UdpClientDemo01 {public static void main(String[] args) throws IOException {//建立一个SocketDatagramSocket socket = new DatagramSocket();//建一个包String msg = "你好啊,服务器!";//发送给谁InetAddress localhost = InetAddress.getByName("localhost");int port = 9090;//参数:数据,数据的长度起始,要发送的IP地址和端口DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port);//发送包socket.send(packet);//关闭流socket.close();}}接收端
package udp_study;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;//还是要等待客户端的连接public class UdpServerDemo01 {public static void main(String[] args) throws IOException {//开放端口DatagramSocket socket = new DatagramSocket(9090);//接收数据包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 chat;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.*;public class UdpSenderDemo01 {public static void main(String[] args) throws IOException {DatagramSocket socket = new DatagramSocket(8888);//准备数据:控制台读取BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));while(true) {String data = https://tazarkount.com/read/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 chat;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.SocketException;public class UdpReceiverDemo01 {public static void main(String[] args) throws IOException {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 = https://tazarkount.com/read/packet.getData();String receiveData = new String(data, 0, data.length);System.out.println(receiveData);if(receiveData.equals("bye")){break;}}socket.close();}}在线咨询【JAVA网络编程是什么 JAVA网络编程】两个人都可以是发送方也都可以是接受方
场景:老师给学生发消息
说明:
  • 因为是相互发消息,所以不存在发送方和接收方
  • 每个用户都可以发送或者接受消息,利用双线程完成
简要设计:
包含四个类:发送类,接受类,老师类,学生类
  • 发送类:完成包的发送
    • 成员变量:发送方端口,接收方端口,接收方IP
    • 循环发送
  • 接受类:完成包的接收
    • 成员变量:接收方端口,发送方昵称
    • 循环接收
  • 老师类和学生类均使用双线程,注意开放的端口号不同
//talksend类package chat;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetSocketAddress;import java.net.SocketException;public class TalkSend implements Runnable{DatagramSocket socket = null;BufferedReader reader = null;private int fromPort;private String toIP;private int toPort;public TalkSend(int fromPort, String toIP, int toPort) {this.fromPort= fromPort;this.toIP = toIP;this.toPort = toPort;try {socket = new DatagramSocket(fromPort);reader = new BufferedReader(new InputStreamReader(System.in));} catch (Exception e) {e.printStackTrace();}}@Overridepublic void run() {while(true) {String data = https://tazarkount.com/read/null;try {data = reader.readLine();byte[] datas = data.getBytes();//数据只有转化成字节才可以读DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress(this.toIP, this.toPort));socket.send(packet);if(data.equals("bye")){break;}} catch (Exception e) {e.printStackTrace();}}socket.close();}}//talkreceive类package chat;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.SocketException;public class TalkReceive implements Runnable {DatagramSocket socket = null;private int port;private String msgFrom;public TalkReceive(int port,String msgFrom) {this.msgFrom = msgFrom;this.port = port;try {socket = new DatagramSocket(port);} catch (SocketException e) {e.printStackTrace();}}@Overridepublic void run() {while(true) {try {//准备接受包裹byte[] container = new byte[1024];DatagramPacket packet = new DatagramPacket(container, 0, container.length);socket.receive(packet);//断开连接byte[] data = https://tazarkount.com/read/packet.getData();String receiveData = new String(data, 0, data.length);System.out.println(msgFrom+":"+receiveData);if(receiveData.equals("bye")){break;}} catch (IOException e) {e.printStackTrace();}}socket.close();}}//学生package chat;public class TalkStudent {public static void main(String[] args) {//开启两个线程new Thread(new TalkSend(7777,"localhost",9999)).start();new Thread(new TalkReceive(8888,"老师")).start();}}//老师package chat;public class TalkTeacher {public static void main(String[] args) {new Thread(new TalkSend(5555,"localhost",8888)).start();new Thread(new TalkReceive(9999,"学生")).start();}}2.0 URL统一资源定位符:定位资源的,定位互联网上的某一个资源
DNS域名解析:将域名解析成IP
协议://IP地址:端口/项目名/资源url下载歌曲江南
package url_study;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLConnection;public class UrlDownLoad {public static void main(String[] args) throws Exception {//得到urlURL url = new URL("https://m10.music.126.net/20210527215758/9bc4d608a8a0cd7bb60cbebb9e45049a/yyaac/obj/wonDkMOGw6XDiTHCmMOi/3047335779/c10c/e3a7/4c42/719b0c3fcba91b78ad27ace8be81c3e4.m4a");//建立http连接HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();//输入流得到资源InputStream inputStream = urlConnection.getInputStream();FileOutputStream fos = new FileOutputStream("江南.m4a");byte[] buffer =new byte[1024];int len;while((len = inputStream.read(buffer))!=-1){fos.write(buffer,0,len);}fos.close();inputStream.close();urlConnection.disconnect();}}