java第二十一天(网络编程)
91.网络编程
(1)网络模型
OSI模型:七层协议
TCP/IP模型:常用
(2)网络通信三要素
第一:ip地址
使用dos命令查看ip地址,ipconfig
ip最大值是233.255.255.255,可设置区间1.0.0.0-233.255.255.255
用dos命令查看主机是否互通的,ping 域名\ip地址
回环地址: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(); } } } }
(adsbygoogle = window.adsbygoogle || []).push({});
- 黑马程序员——Java基础->网络编程(UDP)
- Java学习笔记——网络编程、反射
- Java基础—网络编程【OSI/RM TCP/IP】【网络通信三要素】【UDP传输 & TCP传输】【DNS域名解析】
- Java学习第二十一天
- java 网络编程TCP
- Java学习总结第二十一天Java集合概述
- Java 网络编程(二)
- JAVA基础——网络编程
- 尚硅谷java——网络编程
- java 利用TCP协议从客户端向服务器端发送文件.(网络编程)
- 尚硅谷java学习笔记——14.网络编程
- Java 基于TCP的Socket网络编程的入门及示例
- 黑马程序员——Java基础—网络编程(一)
- 黑马程序员 —— Java高级视频_IO输入与输出(第二十一天)
- 黑马程序员-----java基础(网络编程)
- 黑马程序员 Java面向对象——(网络编程)
- 黑马程序员_java学习日记_Java高新技术_网络编程
- Java——网络编程——TCP
- java基础第十二天——网络编程,反射
- Java——网络编程