.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 }
View Code

 

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();//打开连接

 

posted @ 2018-11-30 01:37  水痕灬  阅读(205)  评论(0编辑  收藏  举报