- 1,概述
地球村:你在西安,你一个美国的朋友!
信件:
计算机网络:计算机网络系统就是利用通信设备和线路将地理位置不同、功能独立的多个计算机系统互联起来,以功能完善的网络软件实现网络中资源共享和信息传递的系统。通过计算机的互联,实现计算机之间的通信,从而实现计算机系统之间的信息、软件和设备资源的共享以及协同工作等功能,其本质特征在于提供计算机之间的各类资源的高度共享,实现便捷地交流信息和交换思想
网络编程的目的:
无线电台...传播交流信息,数据交换,通信
想要达到这个效果需要什么:
1.如何准确的定位网络上的一台主机。192.168.16.124:端口,定位到这个计算机上的某个资源
2.找到了这个主机,如何传输数据呢?
javaweb: 网页编程 B/S
网络编程:TCP/IP C/S
1.2网络通信的要素人工智能:智能汽车:工厂,人少!
如何实现网络的通信?
通信双方地址:
- ip
- 端口号
规则:网络通信的协议
TCP/IP 参考模型
TCP/IP四层模型与OSI参考模型小结:
- 网络编程上有两个主要的问题
- 如何准确的定位到网络上的一台或者多台主机
- 找到主机后如何进行通信
- 网络编程中的要素
- IP和端口号 IP
- 网络通信协议 udp,tcp
- 万物皆对象
1.3.IP
i地址:InetAddress
唯一定位一台网络上计算机
127.0.0.1:本机localhost
ip地址的分类
package com.xiao.lesson01; import java.net.InetAddress; import java.net.UnknownHostException; //测试IP public class TestInetAddress { public static void main(String[] args) { try { //查询本机地址 InetAddress inetAddress = InetAddress.getByName("127.0.0.1"); System.out.println(inetAddress); InetAddress inetAddress3 = InetAddress.getByName("localhost"); System.out.println(inetAddress); InetAddress inetAddress4 = InetAddress.getLocalHost(); System.out.println(inetAddress); //查询网站ip地址 InetAddress inetAddress2 = InetAddress.getByName("www.baidu.com"); System.out.println(inetAddress2); //常用方法 //System.out.println(inetAddress.getAddress()); System.out.println(inetAddress.getCanonicalHostName());//规范的名字 System.out.println(inetAddress.getHostName());//域名,或者自己电脑的名字 System.out.println(inetAddress.getAddress()); //ip } catch (UnknownHostException e) { e.printStackTrace(); } } }
1.4端口- IP:
- 192.168.11.11 专门给组织内部使用的
- 查ABCD类地址
ipv4/ipv6·~
127.0.0.1, 4个字节组成, 0~255 42亿 ;30亿都在北美,亚洲4亿 2011年就用尽了;
IPV6 128位。8个无符号整数!
2001:0bbs:aaaa:0015:0000:0000:1aaa:1231
IP地址分类
公网(互联网)-私网(局域网)
域名:记忆IP问题
端口表示计算机上的一个程序的进程
不同的进程有不同的端口号!用来区分软件!
被规定0-65535
TCP,UDP:65535*2 tcp:80 udp:80 ,是可以的 单个协议下,端口不能冲突
端口分类
- Tomcat:8080
- MySQL: 3306
- Oracle:1521
- HTTP:80:
- HTTPS:443
- FTP:21
- Telent:23
公有端口0-1023
程序注册端口:1014--49151,分配用户或者程序
动态,私有:49152-65535
netstat -ano #查看所有端口 netstat -ano|findstr"5900" #查看指定的端口 tasklist|findstr"8696"#查看指定端口的进程
package com.xiao.lesson01; import java.net.InetSocketAddress; // public class TestInetSocketAddress { 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());//host System.out.println(socketAddress.getPort()); } }
1.5。通信协议
协议:约定,就好比我们现在说的是普通话。
网络通信协议:速率,传输码率,代码结构,传输控制。。。
问题:非常的复杂?
大事化小:分层!
TCP/IP协议簇:实际上是一组协议
重要:
- TCP:用户传输协议
- UDP:用户数据报协议
出名的协议:
- TCP:
- IP:网络互连协议
TCP 跟UDP对比
TCP:打电话
连接,稳定
三次握手 四次挥手
最少需要三次,保证稳定连接! A:你瞅啥? B:瞅你咋地? A:干一场! A:我要走了 B:你真的要走了吗 B:你真的真的要走了吗 A:我走了
客户端,服务端
传输完成,释放连接,效率低
UDP:发短信
- 不连接,不稳定
- 客户端,服务端:没有明确的界限
- 不管有没有准备好,都可以发给你
- 导弹
- DDOS:洪水攻击!(饱和攻击)
客户端
连接服务器Socket
发送消息
package com.xiao.lesson02; import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; import java.nio.charset.StandardCharsets; //客户端 public class TcpClientDemo01 { public static void main(String[] args) { Socket socket= null; OutputStream os = null; //1.要知道服务器的地址 try { InetAddress serveIP = InetAddress.getByName("127.0.0.1"); //2.端口号 int port = 9999; //3.创建一个socket连接 socket = new Socket(serveIP,port); //3.发送消息 IO流 os = socket.getOutputStream(); os.write("你好".getBytes()); } catch (Exception e) { e.printStackTrace(); }finally { if(os!=null){ try { os.close(); } catch (IOException e) { e.printStackTrace(); } } if (socket!=null) { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
服务器
建立服务的端口ServerSocket
等待用户的链接accept
接收用户的消息
package com.xiao.lesson02; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.ServiceLoader; //服务端 public class TcpServerDemo01 { public static void main(String[] args) { ServerSocket serverSocket = null; Socket socket = null; InputStream is = null; ByteArrayOutputStream baos = null; //1.我得有一个地址 try { serverSocket = new ServerSocket(9999); while (true) { //2.等待客户端连接过来 socket = serverSocket.accept(); //3.读取客户端的消息 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()); } //2.等待客户端连接过来 //socket = serverSocket.accept(); //3.读取客户端的消息 // is = socket.getInputStream(); /* byte[] buffer = new byte[1024]; int len; while ((len = is.read(buffer))!=-1){ String msg = new String(buffer,0,len); System.out.println(msg); } */ //客道流 // 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(); } } } } }
- 文件上传
客户端
package com.xiao.lesson02; import java.io.*; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; public class TcpClientDemo02 { public static void main(String[] args) throws Exception { //1.创建一个Socket连接 Socket socket= new Socket(InetAddress.getByName("127.0.0.1"),9000); //2.创建一个输出流 OutputStream os = socket.getOutputStream(); //3.读取文件 FileInputStream fis = new FileInputStream(new File("W0002.png")); //4.写出文件 byte[] buffer = new byte[1024]; int len; while ((len=fis.read(buffer))!=-1){ os.write(buffer,0,len); } //通知服务器,我已经结束了 socket.shutdownOutput();//我已经传输完了 //确定服务器接收完毕,才能够断开连接 InputStream inputStream = socket.getInputStream(); //String byte[] ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer2 = new byte[1024]; int len2; while ((len2=inputStream.read(buffer2))!=-1){ baos.write(buffer2,0,len2); } System.out.println(baos.toString()); //5.关闭资源 baos.close(); inputStream.close(); fis.close(); os.close(); socket.close(); } }
服务器端
package com.xiao.lesson02; import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; public class TcpServerDemo02 { public static void main(String[] args) throws Exception { //1.创建服务 ServerSocket serverSocket = new ServerSocket(9000); //2.监听客户端的连接 Socket socket = serverSocket.accept();//阻塞式监听,会一值等待客户端连接 //Scanner scanner = new Scanner(System.in); //3.获取输入流 InputStream is = socket.getInputStream(); //4.文件输出 FileOutputStream fos = new FileOutputStream(new File("receive.png")); 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(); } }Tomcat
服务端
- 自定义
- Tomcat服务器:Java后端开发
客户端
- 自定义
- 浏览器
发短信:不用连接,需要知道对方的地址!
客户端
package com.xiao.lesson03; import java.io.IOException; import java.net.*; import java.nio.charset.StandardCharsets; //不需要连接服务器 public class UdpClientDemo01 { public static void main(String[] args) throws Exception { //1.建立一个Socket DatagramSocket socket = new DatagramSocket(); //2.建个包 String msg = "你好"; //发送给谁 InetAddress localhost = InetAddress.getByName("localhost"); int port = 9090; //数据,数据的长度起始,要发送给谁 DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length,localhost,port); //3.发送包 socket.send(packet); //关闭流 socket.close(); } }
接收端
package com.xiao.lesson03; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; //还是要等待客户端的连接! public class UdpServerDemo01 { public static void main (String[]args)throws Exception { //开放端口 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 com.xiao.chat; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetSocketAddress; import java.net.SocketException; public class UdpSenderDemo01 { public static void main(String[] args) throws Exception { DatagramSocket socket = new DatagramSocket(8888); //准备数据:控制台读取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(); } // String data = reader.readLine(); // byte[] datas = data.getBytes(); // DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",6666)); // // socket.send(packet); // // socket.close(); } }
package com.xiao.chat; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; public class UdpReceiveDemo01 { public static void main(String[] args) throws Exception { DatagramSocket socket = new DatagramSocket(6666); //准备接收包裹 byte[] container = new byte[1024]; while (true){ DatagramPacket packet = new DatagramPacket(container,0,container.length); socket.receive(packet);//阻塞式接收包裹 //断开连接 bye byte[] data = packet.getData(); String receiveData = new String(data, 0, data.length); System.out.println(receiveData); if (receiveData.equals("bye")){ break; } } socket.close(); } }
在线咨询:两个人都可以是发送方,也都可以是接收方!
package com.xiao.chat; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; public class TalkReceive implements Runnable{ DatagramSocket socket= null; private int port; private String msgFrom; public TalkReceive(int port,String msgFrom){ this.port = port; this.msgFrom = msgFrom; try { socket = new DatagramSocket(port); } catch (Exception e) { e.printStackTrace(); } } @Override public void run() { try { //准备接收包裹 byte[] container = new byte[1024]; while (true){ DatagramPacket packet = new DatagramPacket(container,0,container.length); socket.receive(packet);//阻塞式接收包裹 //断开连接 bye byte[] data = 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 com.xiao.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 fromIP, String toIP, int toPort) { this.fromPort = fromIP; this.toIP = toIP; this.toPort = toPort; try { socket = new DatagramSocket(fromPort); reader = new BufferedReader(new InputStreamReader(System.in)); } catch (SocketException e) { e.printStackTrace(); } } @Override public void run() { while (true) { try { String data = reader.readLine(); 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(IOException e){ e.printStackTrace(); } } socket.close(); } } package com.xiao.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 com.xiao.chat; public class TalkTeacher { public static void main(String[] args) { new Thread(new TalkSend(5555,"localhost",8888)).start(); new Thread(new TalkReceive(9999,"学生的")).start(); } }
URL
https://www.baidu.com/
统一资源定位符:定位资源的,定位互联网上的某一个资源
DNS域名解析
协议://ip地址:端口号/项目名/资源
package com.xiao.lesson04; import java.net.MalformedURLException; import java.net.URL; public class URLDemo01 { public static void main(String[] args) throws MalformedURLException { URL url = new URL("http:hocalhost:8080/helloworld/index.jsp?username=xiao&password=123"); System.out.println(url.getProtocol()); //协议 System.out.println(url.getHost()); //主机IP System.out.println(url.getPort()); //端口 System.out.println(url.getPath()); //文件地址 System.out.println(url.getFile());//文件全路径 System.out.println(url.getQuery()); //参数 } }
URL下载
package com.xiao.lesson04; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; public class UrlDowm { public static void main(String[] args) throws IOException { //下载地址 URL url = new URL("http");//网络地址 //2.连接到这个资源HTTP HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); InputStream inputStream = urlConnection.getInputStream(); FileOutputStream fos = new FileOutputStream("sidkl.txt"); byte[] buffer = new byte[1024]; int len; while ((len = inputStream.read(buffer))!= -1){ fos.write(buffer,0,len); //写出这个数据 } fos.close(); inputStream.close(); urlConnection.disconnect();//断开连接 } }