91.网络编程java
(1)网络模型编程
OSI模型:七层协议安全
TCP/IP模型:经常使用服务器
(2)网络通讯三要素网络
第一:ip地址socket
使用dos命令查看ip地址,ipconfig.net
ip最大值是233.255.255.255,可设置区间1.0.0.0-233.255.255.2553d
用dos命令查看主机是否互通的,ping 域名\ip地址server
回环地址:127.0.0.1对象
第二 端口号,用于标识进程的逻辑地址,不一样的进程端口不一样
dos命令查看端口号,netstat-ano
第三,协议
常见的有两种协议:
TCP和UDP协议
UDP:
将数据源和目的地封装到数据包中,不须要创建链接。
每一个数据包的大小限制在64k。
由于不创建链接,因此安全性差,速度快。
TCP:
创建链接造成传输数据的通道,而后再传输数据,经过三次的握手。
安全性高,效率低。
(3)InetAdress类
单例模式(没有构造器),不能直接new,根据静态方法来返回该对象
getByName(String name)根据已知的给定的主机名肯定主机的IP地址
import java.net.InetAddress; import java.net.UnknownHostException; public class InetAdressDemo { public static void main(String[] args) throws UnknownHostException { //经过静态方法返回InetAddress的对象 InetAddress localHost = InetAddress.getLocalHost(); //得到IP地址的字符串 String hostAddress = localHost.getHostAddress(); System.out.println("IP地址是"+hostAddress); //得到IP地址中的主机的名字 String hostName = localHost.getHostName(); System.out.println("主机名是"+hostName); //根据给定的主机名返回该对象 InetAddress byName = InetAddress.getByName("C64-20190318DQZ"); String hostAddress1 = byName.getHostAddress(); String hostName1 = byName.getHostName(); System.out.println("IP地址是"+hostAddress1); System.out.println("IP地址是"+hostName1); } }
(4)UDP通讯
分两个部分
服务端步骤
第一步:建立socket服务对象(须要作关闭)
DatagramSocket(int port)
第二步:接收数据,用DataGrampacket表示数据包
DataGramPacket(byte[] buf,int length)
第三步:解析数据包
接收数据 receive(),程序到此阻塞有数据接收则继续
得到客户端的ip,getAdress();
得到数据 getData();
得到长度 getLength();
import java.net.*; public class UdpServer { public static void main(String[] args){ //服务器端步骤一,建立Socket服务对象(须要作关闭) DatagramSocket socket = null; try { socket=new DatagramSocket(10000); //步骤二,建立接收数据包 byte[] buf=new byte[1024]; DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length); System.out.println("服务端开始启动,等待客户端发送内容"); //步骤三,解析数据 socket.receive(datagramPacket);//程序到此阻塞,有数据传入继续 //得到客户端的ip InetAddress inetAddress = datagramPacket.getAddress(); //得到数据 byte[] data = datagramPacket.getData(); int length=datagramPacket.getLength(); String s=new String(data,0,length); System.out.println(inetAddress.getHostAddress()+"发送的内容是"+s+" 长度是"+length); } catch (Exception e) { e.printStackTrace(); } finally { if(socket!=null){ socket.close(); } } } }
客户端步骤:
第一步:建立DatagramSocket不用给端口(需关闭)
第二步:建立数据包
DatagramPacket(byte[] buf,int length,InetAddress address,int port)
第三步:发送数据包
send();
import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class UdpClient { public static void main(String[] args){ //服务器端步骤一,建立Socket服务对象(须要作关闭,不用给端口) DatagramSocket socket = null; try { socket=new DatagramSocket(); //步骤二,建立数据包 String s="爱我中华!"; byte[] buf=s.getBytes(); DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length,InetAddress.getByName("192.168.1.11"),10000); //步骤三,发送数据包 socket.send(datagramPacket); } catch (Exception e) { e.printStackTrace(); } finally { if(socket!=null){ socket.close(); } } } }
先运行服务端再运行客户端,服务端就显示出来了
拓展:
注意字符字节的转换,从控制台输入的东西是以字节流方式存在的,让程序实现从控制台输入数据接收
用BufferReader,不断接收使用While(true)
import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class UdpServer { public static void main(String[] args){ //服务器端步骤一,建立Socket服务对象(须要作关闭) DatagramSocket socket = null; try { socket=new DatagramSocket(10000); //步骤二,建立接收数据包 byte[] buf=new byte[1024]; DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length); System.out.println("服务端开始启动,等待客户端发送内容"); //步骤三,解析数据 while(true){ socket.receive(datagramPacket);//程序到此阻塞,有数据传入继续 //得到客户端的ip InetAddress inetAddress = datagramPacket.getAddress(); //得到数据 byte[] data = datagramPacket.getData(); int length=datagramPacket.getLength(); String s=new String(data,0,length); System.out.println(inetAddress.getHostAddress()+"发送的内容是: "+s); } } catch (Exception e) { e.printStackTrace(); } finally { if(socket!=null){ socket.close(); } } } }
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class UdpClient { public static void main(String[] args){ //服务器端步骤一,建立Socket服务对象(须要作关闭,不用给端口) DatagramSocket socket = null; BufferedReader reader=null; try { socket=new DatagramSocket(); //注意从控制台输入的内容是以字节流的方式存储的,因此读取的是字节流,为了更方便显示把字节流转换成字符流 reader=new BufferedReader(new InputStreamReader(System.in)); //步骤二,建立数据包 String s=null; //使其不断接收使用While(true) while((s=reader.readLine())!=null){ //设置退出循环的标识 if("exit".equals(s)){ break; }else{ byte[] buf=s.getBytes(); DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length,InetAddress.getByName("192.168.1.11"),10000); //步骤三,发送数据包 socket.send(datagramPacket); } } System.out.println("退出客户端"); } catch (Exception e) { e.printStackTrace(); } finally { if(socket!=null){ socket.close(); } try { if(reader!=null){ reader.close(); } } catch (IOException e) { e.printStackTrace(); } } } }
TCP通讯
服务端
第一步:建立Socket对象指定端口(需关闭)
ServerSocket(int port);
第二步:监听接收客户端对象Socket(也须要关闭)
Socket accept();
第三步:得到流对象
getInputStream(); BfferedReader
第四步:读取数据
第五步:得到客户端的IP地址
getHostAdress();
import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; public class TcpServer { public static void main(String[] args) { //步骤一,建立服务端ServerSocket对象,指定端口(须要关闭) ServerSocket serverSocket = null; BufferedReader reader=null; //步骤二,建立监听接收客户端对象Socket Socket socket=null; try { serverSocket= new ServerSocket(9999); socket=serverSocket.accept(); //步骤三,得到流对象,注意字节流字符流的转换 reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); //步骤四,读取数据 String s = reader.readLine(); //步骤五,得到客户端的ip地址 InetAddress inetAddress = socket.getInetAddress(); System.out.println(inetAddress.getHostAddress()+"发送的内容是: "+s); } catch (Exception e) { e.printStackTrace(); } finally { try { if(serverSocket!=null){ serverSocket.close(); } if(socket!=null){ socket.close(); } if(reader!=null){ reader.close(); } } catch (Exception e) { e.printStackTrace(); } } } }
客户端
第一步:建立请求的Socket(需关闭)
Socket(String host,int port)
第二步:得到输出流
getOutputStream(); BufferedWriter
第三步:写数据
第四步:释放资源
import java.io.BufferedWriter; import java.io.OutputStreamWriter; import java.net.Socket; public class TcpClient { public static void main(String[] args) { //步骤一,建立Socket对象,指定ip和端口(须要关闭) Socket socket=null; BufferedWriter writer=null; try { socket=new Socket("192.168.1.11",9999); //步骤三,得到输出流对象,注意字节流字符流的转换 writer= new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); //步骤四,写数据 writer.write("爱我中华"); writer.newLine();//换行 writer.flush();//刷新 } catch (Exception e) { e.printStackTrace(); } finally { try { if(socket!=null){ socket.close(); } if(writer!=null){ writer.close(); } } catch (Exception e) { e.printStackTrace(); } } } }
拓展:实现TCP从控制台输入数据
加一个BufferReader,用While(true)搭配if...breakv
import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; public class TcpServer1 { public static void main(String[] args) { //步骤一,建立服务端ServerSocket对象,指定端口(须要关闭) ServerSocket serverSocket = null; BufferedReader reader=null; //步骤二,建立监听接收客户端对象Socket Socket socket=null; try { serverSocket= new ServerSocket(9999); socket=serverSocket.accept(); //步骤三,得到流对象,注意字节流字符流的转换 reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); String s=null; //步骤四,读取数据 while (true){ if((s=reader.readLine())==null){ break; }else{ //步骤五,得到客户端的ip地址 InetAddress inetAddress = socket.getInetAddress(); System.out.println(inetAddress.getHostAddress()+"发送的内容是: "+s); } } System.out.println("退出服务端"); } catch (Exception e) { e.printStackTrace(); } finally { try { if(serverSocket!=null){ serverSocket.close(); } if(socket!=null){ socket.close(); } if(reader!=null){ reader.close(); } } catch (Exception e) { e.printStackTrace(); } } } }
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Socket; public class TcpClient1 { public static void main(String[] args) { //步骤一,建立Socket对象,指定ip和端口(须要关闭) Socket socket=null; BufferedWriter writer=null; BufferedReader reader=null; try { socket=new Socket("192.168.1.11",9999); String s =null; reader=new BufferedReader(new InputStreamReader(System.in)); //步骤三,得到输出流对象,注意字节流字符流的转换 writer= new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); while ((s=reader.readLine())!=null){ if("exit".equals(s)){ break; }else{ //步骤四,写数据 writer.write(s); writer.newLine();//换行 writer.flush();//刷新 } } System.out.println("退出客户端程序"); } catch (Exception e) { e.printStackTrace(); } finally { try { if(socket!=null){ socket.close(); } if(writer!=null){ writer.close(); } } catch (Exception e) { e.printStackTrace(); } } } }