网络编程
网络模型:
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();//打开连接