Java基础_11_网络编程
2016-01-21 19:21
501 查看
_____网络编程_____
TCP/IP模型由上至下主要分为:应用层,传输层,网际层和主机到网络层,一般开发是处于传输层和网际层,应用层为:FTP和HTTP协议等,传输层为:UDP和TCP等,网际层为:IP。用户在应用层发送的数据经过层层包装到最下面的物理层发送,到达目的地的时再逐层拆包。我们编程人员需要做的就是传输层和网际层。
概述
在现在忘得网络模型中,最常见的就是TCP/IP模型TCP/IP模型由上至下主要分为:应用层,传输层,网际层和主机到网络层,一般开发是处于传输层和网际层,应用层为:FTP和HTTP协议等,传输层为:UDP和TCP等,网际层为:IP。用户在应用层发送的数据经过层层包装到最下面的物理层发送,到达目的地的时再逐层拆包。我们编程人员需要做的就是传输层和网际层。
IP地址
Java将Ip地址单独封装成了一个类InetAddress,此类几乎包含所有IP地址的信息。简单操作演示:
//获取本地IP对象 InetAddress ia=InetAddress.getLocalHost(); //通过本地IP对象获取IP地址 String address=ia.getHostAddress(); //通过本地IP对象获取主机名称 String name=ia.getHostName(); System.out.println("IP:"+address+"---name="+name); //获取指定主机的IP对象,可以传入域名 ia=InetAddress.getByName("127.0.0.1"); System.out.println("IP:"+ia.getHostAddress()+"---name="+ia.getHostName()); //获取指定域名的所以主机的IP对象 InetAddress[] baidu=InetAddress.getAllByName("www.baidu.com"); for (InetAddress i :baidu) { System.out.println("IP:"+i.getHostAddress()+"---name="+i.getHostAddress()); }
UDP传输
概述:
面向无连接,只要求标明传输目的地发送,不论对放是否在线。特点:
发送和就收数据不需要建立连接,所以不可靠,但是因为无连接所以速度快,但是数据包的大小限制为64KB,适用于视频通讯和聊天等。UDP实现类:DatagramSocket
简单操作演示:
//简单的发送个接收数据包 public class Demo { public static void main(String[] args) throws Exception{ //先开启接受线程等待接受 new Thread(new UdpReceive()).start(); new Thread(new UdpSend()).start(); } } //发送类 class UdpSend implements Runnable { @Override public void run() { DatagramSocket ds = null; try { ds = new DatagramSocket(); byte[] buf = "黑马".getBytes(); //创建需要被发送的包,填写内容,长度,目标ip,端口号 DatagramPacket p = new DatagramPacket(buf, buf.length, InetAddress.getByName("127.0.0.1"), 10000); //通过DatagramSocket对象调用计算机底层硬件发送此包 ds.send(p); } catch (Exception e) { e.printStackTrace(); } finally { if(ds != null) ds.close(); } } } //接收类 class UdpReceive implements Runnable { @Override public void run() { DatagramSocket ds = null; try { //创建一个用于监视10000端口的Socket ds = new DatagramSocket(10000); //此数据数组不能定义太小,否则内容溢出,可以定义到UPD包的上限64KB byte[] buf = new byte[1024<<6]; DatagramPacket p = new DatagramPacket(buf, buf.length); //此方法为阻塞式方法,会一直等待,直到接收到数据 ds.receive(p); //打印数据包的来源和内容 System.out.print(p.getAddress().getHostAddress()+":"+p.getPort()+" :"); System.out.println(new String(p.getData(), 0, p.getLength())); } catch (Exception e) { e.printStackTrace(); } finally { if(ds != null) ds.close(); } } }
TCP传输
概述:
面向连接的,必须连接成功才能传输数据。特点:
收发数据需要建立连接,形成传输数据的通道,所以可靠且没有数据大小限制,但是速度稍慢。在建立连接前要进行三次握手,即:第一次本方发送请求,第二次对方确认连接,第三次本方再次确认连接成功。TCP的实现类:
分为客户端Socket和服务端ServerSocket的两部分。简单的客户端服务端交互演示:
public class Demo { public static void main(String[] args) throws Exception{ //必须要先启动服务端,客户端在创建Socket的时候就会连接服务端,如果连接不上服务端就会抛出java.net.ConnectException异常。 new Thread(new TcpServer()).start(); new Thread(new TcpClient()).start(); } } //客户端 class TcpClient implements Runnable { @Override public void run() { Socket s = null; try { //定义一个客户端,参数为需要连接的服务端地址和端口 s = new Socket("127.0.0.1", 10001); //Socket是通过输入输出流来进行数据传输操作的 OutputStream os = s.getOutputStream(); InputStream is = s.getInputStream(); //向服务端发送数据 os.write("你好,我是客户端发来的第一条信息!".getBytes()); //此方法是在流结尾添加一个结束标识,防止服务端的循环读取一直阻塞。 s.shutdownOutput(); int len = -1; byte[] buf = new byte[1024]; /* * 此方法为阻塞方法,等待服务器返回信息。 * 因为是阻塞,所以当服务端发送完数据后,要是没有判断结束的标志则会一直阻塞, * 所以在服务端返回信息后要再次调用Socket对象的shutdownOutput()方法向流中添加一个结束标识。 */ while((len=is.read(buf)) != -1) System.out.println("客户端:"+new String(buf, 0, len)); } catch (Exception e) { e.printStackTrace(); } finally { if(s != null) try { s.close(); } catch (IOException e) { e.printStackTrace(); } System.out.println("客户端已关闭"); } } } //服务端 class TcpServer implements Runnable { @Override public void run() { ServerSocket ss = null; Socket s = null; try { //创建监视10001端口的服务端 ss = new ServerSocket(10001); //此方法为阻塞方法,等待有客户端的接入 s = ss.accept(); OutputStream os = s.getOutputStream(); InputStream is = s.getInputStream(); int len = -1; byte[] buf = new byte[1024]; //读取客户端发来的数据 while((len=is.read(buf)) != -1) System.out.println("服务端:"+new String(buf, 0, len)); //向客户端返回数据 os.write("客户端你好,我已经收到你的信息!".getBytes()); s.shutdownOutput(); } catch (Exception e) { e.printStackTrace(); } finally { if(ss != null) try { ss.close(); } catch (IOException e) { e.printStackTrace(); } if(s != null) try { s.close(); } catch (IOException e) { e.printStackTrace(); } System.out.println("服务端已关闭"); } } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树