java基础15:网络编程

本文详细介绍Java网络编程的基础知识,包括网络模型、通讯要素、UDP与TCP传输方式,并给出具体示例代码,帮助读者掌握Java网络编程的核心概念和技术。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 一、概述


注:以前软考的时候总结过一篇关于网络的基本知识,大家可以参考一下http://blog.youkuaiyun.com/jin870132690/article/details/41597135


只要接触过网络的人就不会不知道网络的重要性,网络编程指的是编写与其他计算机进行通信的程序。java已经将网络程序所需的东西封装成了不同的类。大大简化了我们的编程的难度。

1、网络模型

网络模型包括OSI七层模型和TCP\IP模型


2、通讯要素

1、IP地址

它是网络中的设备标识,分为ipv4和ipv6,常见的ip4地址分ABC三类

IP地址在java中对应的类是InetAddress

  1. <span style="font-size:14px;">        //获取本地主机名  
  2.         InetAddress ip = InetAddress.getLocalHost();  
  3.           
  4.         //根据主机名或者ip,获取Ip地址  
  5.         ip = InetAddress.getByName("www.baidu.com");  
  6.           
  7.         //有的时候主机可能不唯一,用getAllByName();  
  8. //      InetAddress[] ip2 = InetAddress.getAllByName(ip.getHostName());  
  9. //      for (InetAddress inetAddress : ip2) {  
  10. //          System.out.println(inetAddress);  
  11.           
  12.         System.out.println("address:" + ip.getHostAddress());  
  13.         System.out.println("name:" + ip.getHostName());</span>  


2、端口号

端口号用于识别不同的进程,有效端口号为0-65535,其中0-1024是系统使用或保留端口号,尽量不要使用

3、通讯协议 

即通信规则,包含TCP和UDP协议


UDP是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去。适用于一次只传送少量数据、对可靠性要求不高的应用环境

常用于UDP连接的比如说在线视频语音聊天等应用环境,对可靠性要求低,丢失一点数据也无所谓。


TCP是基于连接的协议,也就是说,在正式收发数据前,要进行三次握手,确保和对方建立可靠的连接。

 TCP协议能为应用程序提供可靠的通信连接,对可靠性要求高的数据通信系统往往使用TCP协议传输数据。

TCP协议一般用于文件传输、收发邮件等对数据准确性要求较高的活动。


 二、UDP传输


1, 接收端与发送端交互过程

接收数据包

a,通过DatagramSocket创建发送端

b,将要发送的数据封装在DatagramPacket包中

c,调用send方法发送。

接收数据包

a,通过DatagramSocket创建接收端

b,将受到的数据封装在DatagramPacket包中

c,通过recive接收包


2、举例:聊天室

接收端

  1. <span style="font-size:14px;">package jinfulin.UDP.Demo;  
  2.   
  3. import java.io.IOException;  
  4. import java.net.DatagramPacket;  
  5. import java.net.DatagramSocket;  
  6.   
  7. public class UDPReDemo {  
  8.     /* 
  9.      * 需求:创建接收端并接收文字 分析:  
  10.      * 1,建立socket服务,  
  11.      * 2,建立packet包 
  12.      *  3,将接收到的数据封装在packet中 
  13.      *   4,读取包中的内容 
  14.      * 5,关闭服务 
  15.      */  
  16.     public static void main(String[] args) throws IOException {  
  17.         System.out.println("接收端已启动");  
  18.         while (true)// 接收端一直启动  
  19.         {  
  20.             // 1,建立socket服务  
  21.             DatagramSocket ds = new DatagramSocket(12000);  
  22.             // 2,建立packet包  
  23.             byte[] buf = new byte[1024];  
  24.             DatagramPacket dp = new DatagramPacket(buf, buf.length);  
  25.             // 3,接收数据包  
  26.             ds.receive(dp);  
  27.             // 4,读取包中的内容  
  28.             String ip = dp.getAddress().getHostAddress();  
  29.             // String name = dp.getAddress().getHostName();  
  30.             // int pot = dp.getPort();  
  31.             String txt = new String(dp.getData(), 0, dp.getLength());  
  32.   
  33.             System.out.println(ip + ":::::" + txt);  
  34.              ds.close();  
  35.         }  
  36.     }  
  37.   
  38. }  
  39. </span>  



发送端

  1. <span style="font-size:14px;">package jinfulin.UDP.Demo;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.IOException;  
  5. import java.io.InputStreamReader;  
  6. import java.net.DatagramPacket;  
  7. import java.net.DatagramSocket;  
  8. import java.net.InetAddress;  
  9.   
  10.   
  11. public class UDPSendDemo {  
  12.     /* 
  13.      * 需求:创建发送端并发送文字 
  14.      * 思路:1,建立socket服务 
  15.      *      2,建立发送的数据 
  16.      *      3,将发送的数据封装在packet包中 
  17.      *      4,发送数据 
  18.      *      5,关闭 
  19.      *  
  20.      */  
  21.     public static void main(String[] args) throws IOException {  
  22.         System.out.println("发送端已启动");  
  23.         //1,建立socket服务  
  24.         DatagramSocket ds = new DatagramSocket(8888);  
  25.           
  26.         BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));  
  27.         String line = null;  
  28.         while ((line = bufr.readLine()) != null)  
  29.         {  
  30.             //2,建立发送的数据  
  31. //          String str = "金福林";  
  32. //          byte[] buf = str.getBytes();  
  33.             byte[] buf = line.getBytes();  
  34.             //3,将发送的数据封装在packet包中  
  35.             DatagramPacket dp = new DatagramPacket(  
  36.                     buf,buf.length,InetAddress.getByName("110.251.19.2"),12000);  
  37.             //,发送数据  
  38.             ds.send(dp);  
  39.             if("over".equals(line)){  
  40.                 break;  
  41.             }  
  42.         }  
  43.         //5,关闭  
  44.         ds.close();  
  45.     }  
  46.   
  47. }  
  48. </span>  




 三、TCP传输


1、Socket与ServerSocket

1,Socket

Socket为套接字的意思,你也可以把它理解为插座或者港口。

套接字用于将应用程序与端口连接起来,是一个假想的连接装置。




2,ServerSocket

ServerSocket表示服务器端的套接字,其主要功能是等待来着网络的请求,它可以通过制定的端口来等待连接的套接字。




2、服务器与客户端交互的过程


a,服务端创建一个ServerSocket,调用accept()方法等待客户机。

b,客户机创建一个Socket请求与用户连接。

c,服务器接收客户端的请求,同时建立一个新的Socket与客户建立联系,服务器继续等待新的请求


3、示例(上传图片):

客户端

  1. <span style="font-size:14px;">package jinfulin.TCP.Test.UpLoadPic;  
  2.   
  3. import java.io.BufferedInputStream;  
  4. import java.io.BufferedOutputStream;  
  5. import java.io.BufferedReader;  
  6. import java.io.FileInputStream;  
  7. import java.io.IOException;  
  8. import java.io.InputStream;  
  9. import java.io.InputStreamReader;  
  10. import java.io.OutputStream;  
  11. import java.net.Socket;  
  12.   
  13.   
  14. /* 
  15.  * 上传图片的客户端 
  16.  */  
  17. public class UpLoadpicClient {  
  18.     //思路:  
  19.     //1,创建Socket(插座)  
  20.     //2,创建源:本地某个图片  
  21.     //3,创建目的:服务端  
  22.     //4,加缓冲区将写入流中  
  23.     //5,创建读取流  
  24.     //6,读取服务器返回的数据  
  25.     //7,关闭资源  
  26.     public static void main(String[] args) throws IOException {  
  27.         //1,创建Socket(插座)  
  28.         Socket s = new Socket("127.0.0.1"8881);  
  29.           
  30.         //2,创建源:本地某个图片  
  31.         FileInputStream pic = new FileInputStream("f:\\111.jpg");  
  32.           
  33.         //3,创建目的:服务端(输出流)  
  34.         OutputStream out = s.getOutputStream();  
  35.         BufferedOutputStream bufout = new BufferedOutputStream(out);  
  36.         //4,加缓冲区将写入流中  
  37.         BufferedInputStream bufIn = new BufferedInputStream(pic);  
  38.         int ch = 0;  
  39.         while((ch = bufIn.read()) != -1){  
  40. //          out.write(ch);  
  41.             bufout.write(ch);  
  42.         }  
  43.         //----告诉服务端这里已经写完  
  44.         s.shutdownOutput();  
  45.           
  46.         //5,创建输入流  
  47.         InputStream in = s.getInputStream();  
  48.         //6,读取服务器返回的数据  
  49.         BufferedReader bufr =new BufferedReader(new InputStreamReader(in));  
  50.         String line = bufr.readLine();  
  51.         System.out.println(line);  
  52.         //7,关闭资源  
  53.         bufIn.close();  
  54.         bufr.close();  
  55.         pic.close();  
  56.         s.close();  
  57.           
  58.     }  
  59.   
  60. }  
  61. </span>  

服务端

  1. <span style="font-size:14px;">package jinfulin.TCP.Test.UpLoadPic;  
  2.   
  3. import java.io.IOException;  
  4. import java.net.ServerSocket;  
  5. import java.net.Socket;  
  6.   
  7. public class UpLoadpicServer {  
  8.   
  9.     public static void main(String[] args) throws IOException {  
  10.         //1,创建服务端插座ServerSocket  
  11.         ServerSocket ss = new ServerSocket(8881);  
  12.           
  13.         while(true){  
  14.             //2,获取客户端  
  15.             Socket s = ss.accept();  
  16.             new Thread(new UpLoadTask(s)).start();  
  17.         }  
  18.   
  19. //      ss.close();  
  20.           
  21.           
  22.     }  
  23.   
  24. }  
  25. </span>  

服务端调用的方法
  1. <span style="font-size:14px;">  
  2. package jinfulin.TCP.Test.UpLoadPic;  
  3.   
  4. import java.io.BufferedInputStream;  
  5. import java.io.File;  
  6. import java.io.FileOutputStream;  
  7. import java.io.InputStream;  
  8. import java.io.OutputStream;  
  9. import java.net.Socket;  
  10.   
  11. /** 
  12.  * @author 金福林 
  13.  * 
  14.  */  
  15. public class UpLoadTask implements Runnable {  
  16.   
  17.     private Socket s;  
  18.     public UpLoadTask(Socket s) {  
  19.         super();  
  20.         this.s = s;  
  21.     }  
  22.   
  23.     public void run() {  
  24.         try {  
  25.             //2.1获取ip地址,ip打印  
  26.             String ip = s.getLocalAddress().getHostAddress();  
  27.             String name = s.getLocalAddress().getHostName();  
  28.             System.out.println(ip + "....");  
  29.               
  30.             //3,源:获取客户端发来的数据(输出流)  
  31.             InputStream in = s.getInputStream();  
  32.               
  33.             //4,目的:将读取到的文件写入一个目录中  
  34.             File dir = new File("f:\\" + name);  
  35.             if(!dir.exists())  
  36.                 dir.mkdirs();  
  37.             File file = new File(dir,"server.jpg");  
  38.             FileOutputStream fos = new FileOutputStream(file);  
  39.             //5,循环写入  
  40.             int ch = 0;  
  41.             BufferedInputStream bufIn = new BufferedInputStream(in);  
  42.             while((ch = bufIn.read()) != -1)  
  43.             {  
  44.                 fos.write(ch);  
  45.             }  
  46.             //6,获取Socket的输出流,将"上传成功"返回给客户端  
  47.             OutputStream out = s.getOutputStream();  
  48.             out.write("上传成功!".getBytes());  
  49.             //7,关闭资源  
  50.             bufIn.close();  
  51.             fos.close();  
  52.             s.close();  
  53.         } catch (Exception e) {  
  54.               
  55.         }             
  56.     }  
  57. }  
  58. </span>  


 四、URL类


类 URL 代表一个统一资源定位符,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。

URL类可以解析客户端给服务端发的请求

常见方法

String getProtocol();//获取协议名称

String getHost();//获取主机名

int getPort();//获取端口号

String getFile();//获取URL文件名

String getPath();//获取此URL的路径部分

String getQuery();//获取此URL的查询部

举例:

  1. <span style="font-size:14px;"><span style="white-space:pre">        </span>String str_url = "http://127.0.0.1:8080/myweb/1.html";  
  2.           
  3.         URL url = new URL(str_url);  
  4.         InputStream in = url.openStream();  
  5.           
  6.         byte[] buf = new byte[1024];  
  7.         int len = in.read(buf);  
  8.           
  9.         String text = new String(buf,0,len);  
  10.         System.out.println(text);  
  11.           
  12.         in.close();</span>  

一、什么是Socket?
Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
在Java中,Socket和ServerSocket类库位于Java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。
在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的并没有差别,不因为在服务器端或在客户端而产生不同级别。
不管是Socket还是ServerSocket它们的工作都是通过Socket类及其子类完成的。
Socket基于TCP链接,数据传输有保障
Socket适用于建立长时间链接
Socket编程通常应用于即时通讯
1.服务器监听
2.客户端发出请求
3.建立链接
4.通信
二、Socket通信实现步骤
1.创建ServerSocket和Socket
2.打开连接Socket的输入/输出流
3.按照协议对Socket进行读写/操作
4.关闭输入输出流、关闭Socket


 五、最后


关于网络的知识还有很多,java主要就应用于web开发, 需要大家以后在实践中反复的练习

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值