网络编程1.1 概述1.2 网络通信要素问题:
- 如何准确定位到一台或者多台主机
- 找到主机之后如何进行通信
- IP和端口号(ip)
- 网络通信协议(tcp/udp)
- 127.0.0.1:本机localhost
- ip地址分类:
- IPV4/IPV6
- IPV4:4个字节组成
- IPV6:8个无符号整数,128位
- 公网(互联网)/私网(局域网)
- 192.168.xx.xx:专门给组织内部使用(局域网)
- IPV4/IPV6
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());}} - 公有端口:0~1023
- 重要:
- TCP:用户传输协议
- UDP:用户数据报协议
- 出名的协议:
- TCP:
- IP:网络互连协议
- tcp:打电话
- 连接稳定
- 三次握手,四次挥手
最少需要三次,保证稳定连接A:你瞅啥B:瞅你咋地A:干一场A:我要走了B:你真的要走了吗B:你真的真的要走了吗A:我真的要走了- 客户端、服务端
- 传输完成、释放连接、效率低
- udp:发短信
- 不连接、不稳定
- 客户端、服务端:没有明确的界限
- 不管有没有准备好,都可以发给你
- 连接服务器:Socket
- 发送消息
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
一端发给另外一端发送端
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();}}
- 春季老年人吃什么养肝?土豆、米饭换着吃
- 三八妇女节节日祝福分享 三八妇女节节日语录
- 老人谨慎!选好你的“第三只脚”
- 校方进行了深刻的反思 青岛一大学生坠亡校方整改校规
- 脸皮厚的人长寿!有这特征的老人最长寿
- 长寿秘诀:记住这10大妙招 100%增寿
- 春季老年人心血管病高发 3条保命要诀
- 眼睛花不花要看四十八 老年人怎样延缓老花眼
- 香槟然能防治老年痴呆症? 一天三杯它人到90不痴呆
- 老人手抖的原因 为什么老人手会抖
