.Net转Java自学之路—基础巩固篇十七(网络编程、Tomcat、URL)
网络编程
网络模型:
OSI模型:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。
TCP/IP模型:应用层、传输层、网际层、数据链路层。
网络通讯最基本的三大要素:IP地址、端口号、传输协议。
网络编程主要作用于:传输层、网际层。
IP地址:
/* * IP地址: * InetAddress类 import java.net.*; */ InetAddress ip = InetAddress.getLocalHost(); ip.getHostAddress();//本地IP地址 ip.getHostName();//本地主机名 ip=InetAddress.getByName("ip地址/域名");//没有连接成功会报 UnknowHostException 未知主异常 ip.getHostAddress();//指定机器的IP地址 ip.getHostName();//指定机器的主机名 getAllByName(strHost);//获取一个主机对应的所有IP地址
端口号:
逻辑端口就是给应用程序分配的一个数字标识。
传输协议:
通讯规则。常见的协议有:TCP、UDP。
UDP:将数据及技术员和目的封装成数据包中,不需要建立连接。数据包的大小限制在64k内。因为不需要建立连接,所以速度快;但 是不可靠协议。
TCP:需要建立连接,形成传输数据的通道。在连接中可以进行大数据量传输。效率低、速度相对慢,但 是可靠协议。
Socket机制:
网络编程也就是Socket编程。Socket就是为网络服务提供的一种机制。
网络通信就是Socket间的通信,数据是在俩个Socket间的IO传输。
UDP:
关联的对象:DatagramSocket、Datagrampacket
//发送端 DatagramSocket ds = new DatagramSocket(); byte[] bytes = "数据内容".getBytes(); DatagramPacket dp = new DatagramPacket(bytes,bytes.length,InetAddress.getByName("IP地址"),端口号);//发送数据 ds.send(dp);//通过udp的Socket服务中的功能,完成数据包的发送。 ds.close(); /*接收端: *在建立udpSocket服务时,需要该应用程序定义数字标识,也就是端口,也就是说,让该应用程序监听一个端口,只要是这个端口发送的数据,该应用程序就可以进行处理。 */ DatagramSocket ds = new DatagramSocket(int); //预先定义好一个数据包,用于存储接收到的数据;因为数据包中必须有一个容器存储这些数据。所以要先定义字节数据。 byte[] buf = new byte[1024]; DatagramPacket dp=new DatagramPacket(buf,buf.length); //使用Socket服务的receive()将接收到的数据存储到数据包中。该方法是堵塞式方法 ds.receive(dp); //获取数据内容。地址、端口、数据主体 String strText=new String(dp.getData(),0,dp.getLength());
TCP:
面向连接、可靠的协议
客户端:Socket
服务器端:ServerSocket
服务器端没有直接流对象,通过accept()获取客户端对象
//客户端 Socket sk=new Socket("IP地址",端口号); OutputStream out=sk.getOutputStream();//获取Socket的输出流 out.write("数据内容".getBytes()); sk.close(); //服务器端 ServerSocket ss=new ServerSocket(端口); Socket sk=ss.accept();//该方法式堵塞式方法 String ip=sk.getInetAddress.getHostAddress(); InputStream in=sk.getInputStream();//获取客户端发送的输入流 byte[] bytes=new byte[1024]; int len=in.read(bytes); String str=new String(bytes,0,len); sk.close(); ss.close();
TCP传输容易出现客户端和服务端都等待的情况;因为客户端和服务器端有阻塞式方法存在,比如 read()、readLine() 。所以要定义结束标记。
read() 定义-1为结束标记。readLine() 定义回车和-1为结束标记。
实例:上传
//客户端 Socket s=new Socket("ip",端口号); BufferedReader bufr=new BufferedReader(new FileReader(path)); PrintWriter pw=new PrintWriter(new getOutputStream(),true); String line=null; while((line=bufr.readLine())!=null){ pw.println(line); } s.shutdownOutput();//结束标记 BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream())); String str=bufIn.readLine(); System.out.println(str); bufr.close(); s.close(); //服务端 ServerSocket ss=new ServerSocket(端口号); Socket s=ss.accept(); BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream())); PrintWriter pw=new PrintWriter(new FileWriter(path),true); String line=null; while((line=bufIn.readLine())!=null){ pw.println(line); } PrintWriter pwOut=new PrintWriter(s.getOutputStream(),true); pwOut.println("成功"); pw.close(); s.close(); ss.close();
实例:TCP上传图片
1 import java.io.*; 2 import java.net.*; 3 4 Class UploadServer{ 5 public static void main(String[] args) throws Exception { 6 ServerSocket ss=new ServerSocket(端口号); 7 While(true){ 8 Socket s=ss.accept(); 9 new Thread(new PicThread(s)).start(); 10 } 11 } 12 } 13 14 Class UploadClient{ 15 public static void main(String[] args) throws Exceptin { 16 Socket s=new Socket(ip,端口号); 17 FileInputStream fis=new FileInputStream(file); 18 OutputStream out=s.getOutputStream(); 19 byte[] bytes=new byte[1024*n]; 20 int len=0; 21 while((len=fis.read(bytes))!=-1){ 22 out.writer(bytes,0,len); 23 } 24 s.shtdownOutput();//结束标记 25 InputStream in=s.getInputStream(); 26 byte[] buf=new byte[1024]; 27 len=in.read(buf); 28 String str=new String(buf,0,len); 29 System.out.println(sttr); 30 fis.close(); 31 s.close(); 32 } 33 } 34 35 Class PicThread implements Runnable { 36 private Socket s; 37 PicThread(Socket s){ 38 this.s=s; 39 } 40 41 public void run(){ 42 int count=1; 43 String ip=s.getInetAddress().getHostAddress(); 44 try{ 45 //获取客户端发送的数据 46 InputStream in=s.getInputStream(); 47 byte[] bytes=new byte[1024*n]; 48 //定义目的,接收数据写入文件 49 File dir=new File(Path); 50 if(!dir.exists()) dir.mkdir(); 51 File file=new File(dir,ip+(count++)+".jpg"); 52 while(file.exists()){ 53 file=new File(dir,ip+(count++)+".jpg"); 54 } 55 FileOutputStream fos=new FileOutputStream(file); 56 int len=0; 57 while((len=in.read(buf))!=-1){ 58 fos.write(bytes,0,len); 59 } 60 61 OutputStream out=s.getOutputStream(); 62 out.write("成功"); 63 fos.close();s.close(); 64 }catch(Exception ex){ 65 throw new RuntimeException(ip+"失败"); 66 } 67 } 68 }
Tomcat:
服务器端应用。地址栏输入http://IP:端口号(server.xml中配置的端口号)可以访问tomcat服务器的指定资源
访问tomcat中的自定义资源:
只要在tomcat服务器的webapps目录下定义的应用程序即可。
启动:
bin文件夹下 打开startup.bat 启动tomcat。
若启动startup.bat后窗口一闪即消失:
检查JAVA_HOME环境变量配置是否正确
关闭:
bin文件夹下 打开shutdown.bat 关闭tomcat
配置端口号:
在server.xml中配置<Connector port="配置端口号" ..../>
配置外部应用:
1、在server.xml中配置在<Host .....></Host>中加入
<Context path="文件夹名称" docbase="路径" />
2、conf/cataline/localhost 下创建一个xml文件,并录入:
<Context docBase="路径" />
映射虚拟主机:
1、修改端口号为80
2、修改hosts文件,添加对象的绑定关系
路径c:\WINDOWS\system32\drivers\etc
3、在server.xml文件中添加一个<Host>
URI、URL、URN:
URI:统一资源标识符
URL:统一资源定位符
URN:统一资源名称
每个URL都是URI,但不一定每一个URI都是URL。应为URI还包含了一个子类URN,URN命名资源但不指定如何定位资源。
URL类:
//常用方法 boolean equals(Object);//URL是否等于另一个对象 getAuthority();//获取URL的授权部分 Object getContent();//获取URL内容 int getDefaultPort();//获取URL关联协议的默认端口号 getFile();//获取URL的文件名 getHost();//获取URL的主机名 getPath();//获取URL的路径部分 int getPort();//获取URL的端口号 getProtocol();//获取URL的协议名称 getQuery();//获取URL的查询部分(参数信息) getRef();//获取URL的锚点 URLConnection openConnection();//打开连接