网络
写的程序能够借助网络,在不同的计算机之间进行数据传输
计算机网络:通过通讯线路把不同区域的计算机(广义)连接起来,
通过特定的网线能够实现信息,数据共享
网络编程:使的开发的程序,可以借助网络,在不同的计算机之间进行数据传输,
java语言是支持网络传输的
将连接网络的细节都封装好了,提供给程序员的都是一些APT
使用这些类,可以轻松的开发出具有网络通信息的软件
客户端 服务端
网络模型
OSI参考模型 分成了7层 每一层做不同的事情
TCP/IP参考模型 4层 应用层(程序) 传输层(TCP/UDP) 网络层(IP) 物理链路层(实际的网络通信线路)
通信要素:
IP
寻址 找主机 每台电脑都有一个IP 局域网IP(192.168.) 广域网
本地会环地址:127.0.0.1 访问自己电脑的,如果你的局算计没有连接任何通信设备
ipconfig查询自己电脑的IP地址
端口号
与计算机上的程序对应的,每一个运行的程序都会分配一个端口号,不能重复
端口号范围是(0-65535) 0-1024基本都已经被占用 定义时1024-65535
通信协议
通信双方,如何安全可靠·的进行数据传输,传输什么内容,什么速度传输,传输的过程出现问题的解决-->协议
如何进行数据传递
http 超文本传输协议---->网页相关的内容
TCP编程
传输控制协议TCP(Transmission Control Protocol)
安全可靠
客户端--->服务器
必须先测试网络是否流畅
三次握手
四次挥手
java基于TCP协议分装的类如何使用
Socket: 客户端
ServerSocket:服务器端
先启动服务器
在启动客户端
服务器端有一个监听程序
监听到了,获取到对应的客户端程序
例创建客户端并发送到服务器里面:
package com.ffyc.java.day2; import java.io.DataOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.Socket; public class Client { public static void main(String[] args) { //创建客户端程序,创建时,就会三次握手监测网络,以及服务器是否正常 try { Socket socket = new Socket("127.0.0.1",9999); OutputStream out = socket.getOutputStream(); DataOutputStream datout = new DataOutputStream(out); datout.writeUTF("你好服务器"); } catch (IOException e) { e.printStackTrace(); System.out.println("连接失败"); } } }
package com.ffyc.java.day2; import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) throws IOException { //创建服务器端指定端口,ip同所在的计算机相同 ServerSocket serverSocket = new ServerSocket(9999); //在服务器端监听客户端连段链接,是阻塞式的,如果有程序连接,接收到对应的客户端程序 System.out.println("服务器启动成功"); Socket socket = serverSocket.accept(); System.out.println("连接成功"); //获得输入流 InputStream in = socket.getInputStream(); DataInputStream datain = new DataInputStream(in); System.out.println(datain.readUTF()); } }
例创建客户端和服务器,由服务器发送到客户端:
package com.ffyc.java.day2; import java.io.*; import java.net.Socket; public class Client1 { public static void main(String[] args) { //创建客户端程序,创建时,就会三次握手监测网络,以及服务器是否正常 try { Socket socket = new Socket("127.0.0.1",9999); OutputStream out = socket.getOutputStream(); DataOutputStream datout = new DataOutputStream(out); datout.writeUTF("你好服务器"); //获得输入流 InputStream in = socket.getInputStream(); DataInputStream datain = new DataInputStream(in); System.out.println(datain.readUTF()); } catch (IOException e) { e.printStackTrace(); System.out.println("连接失败"); } } }
package com.ffyc.java.day2; import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class Server1 { public static void main(String[] args) throws IOException { //创建服务器端指定端口,ip同所在的计算机相同 ServerSocket serverSocket = new ServerSocket(9999); //在服务器端监听客户端连段链接,是阻塞式的,如果有程序连接,接收到对应的客户端程序 System.out.println("服务器启动成功"); Socket socket = serverSocket.accept(); System.out.println("连接成功"); //获得输入流 InputStream in = socket.getInputStream(); DataInputStream datain = new DataInputStream(in); System.out.println(datain.readUTF()); //获得出流 OutputStream out = socket.getOutputStream(); DataOutputStream dataout = new DataOutputStream(out); dataout.writeUTF("你好我收到了"); } }
实现客户端和服务器的多段对话:
package com.ffyc.java.day2; import java.io.*; import java.net.Socket; import java.util.Scanner; public class Client3 { public static void main(String[] args) { //创建客户端程序,创建时,就会三次握手监测网络,以及服务器是否正常 try { Socket socket = new Socket("127.0.0.1",9999); Scanner scanner = new Scanner(System.in); OutputStream out = socket.getOutputStream(); DataOutputStream datout = new DataOutputStream(out); InputStream in = socket.getInputStream(); DataInputStream datain = new DataInputStream(in); while (true){ System.out.println("客户端输入:"); String s = scanner.next(); datout.writeUTF(s); if (s.equals("886")){ break; } System.out.println("服务器说"+datain.readUTF()); } } catch (IOException e) { e.printStackTrace(); System.out.println("连接失败"); } } }
package com.ffyc.java.day2; import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; public class Server3 { public static void main(String[] args) throws IOException { //创建服务器端指定端口,ip同所在的计算机相同 ServerSocket serverSocket = new ServerSocket(9999); //在服务器端监听客户端连段链接,是阻塞式的,如果有程序连接,接收到对应的客户端程序 System.out.println("服务器启动成功"); Socket socket = serverSocket.accept(); System.out.println("连接成功"); OutputStream out = socket.getOutputStream(); DataOutputStream datout = new DataOutputStream(out); InputStream in = socket.getInputStream(); DataInputStream datain = new DataInputStream(in); Scanner scanner = new Scanner(System.in); while (true){ System.out.println("客户端说:" + datain.readUTF()); System.out.println("服务器端输入:"); String s = scanner.next(); try { datout.writeUTF(s); } catch (IOException e) { e.printStackTrace(); System.out.println("客户端把你删了"); } System.out.println("服务器说"+datain.readUTF()); } } }
UDP编程
将数据都封装到一个数据包中,包含数据源,目标,数据
每次就只管发送,发送失败或者成功,都不知道
速度快,但是不安全
类 DatagramSocket 和 DatagramPacket 实现了基于 UDP 协议网络程序。
例:
发送端
package com.ffyc.java.day2UDP; import java.io.IOException; import java.net.*; //发送端 public class Send { public static void main(String[] args) throws IOException { //负责发送和接收数据端 DatagramSocket datagramSocket = new DatagramSocket(); //数据报的封装 String s = "你好接收端"; DatagramPacket datagramPacket = new DatagramPacket(s.getBytes(),s.getBytes().length, InetAddress.getByName("127.0.0.1"),9999); datagramSocket.send(datagramPacket);//发送出去 datagramSocket.close();//关闭 } }
接收端
package com.ffyc.java.day2UDP; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; //接收端 public class Receive { public static void main(String[] args) throws IOException { DatagramSocket datagramSocket = new DatagramSocket(9999); byte[] b = new byte[1024]; DatagramPacket datagramPacket = new DatagramPacket(b,b.length); datagramSocket.receive(datagramPacket); String s = new String(datagramPacket.getData(),0,datagramPacket.getLength()); System.out.println(s); } }