黑马程序员_java10_网络编程
来源:互联网 发布:2016年淘宝还能刷单吗 编辑:程序博客网 时间:2024/05/16 05:31
——- android培训、java培训、期待与您交流! ———-
在java网络编程中TCP/IP是最重要的模型之一。TCP/IP模型是一系列网络协议的总称,这些协议都有自己的目的。TCP/IP协议可以分为四层,分别是应用层,传输层,网络层,链路层。
应用层
应用层为用户提供所需要的各种服务,负责传送各种最终的形态的数据,是直接与用户打交道的层,典型的协议包括HTTP,FTP等。
传输层
传输层为应用层实体提供端到端的通信功能,该层定义了两种重要的协议:传输控制协议()TCP和用户数据包协议(UDP)。其中,TCP提供的是一种可靠的面向连接的数据传输服务;UDP是提供一种不可靠的数据传输服务。
网络层
网络层主要解决主机到主机的的通信问题。该层有4中主要的协议:网络协议(IP),地址解析协议(ARP),互联网组管理协议(IGMP),其中IP是是网络层最重要的协议。
链路层
链路层是负责建立电路连接,是整个网络的物理基础,典型的协议包括以太网等。
依靠网络层的IP,即提供主机IP地址找到主机的问题,我们解决了在网络中找到一台或者多台主机的问题。
Socket
Socket 通常称为套接字,应用程序通常通过Socket向网络发出请求或者应答网络请求,一个套接字由一个IP地址和一个端口号唯一确定的。
在java中提供了Socket和ServerSocket两种类,分别用来表示双向连接的客户端和服务端,服务端和客户端中都提供了很多的构造函数,方便创建对象。
Socket(InetAddress address,int port)Socket (InetAddress,int port ,boolean stream)Socket(String host,int port)Socket (String host ,int port ,boolean stream)
上面的构造函数时Socket类中构造函数的一部分,其中常用的参数就是address,host,port等。其中address蚕食表示双相连接中另一方的IP地址。,host参数表示另一方的主机名,port表示端口号。stream指明Socket是流还是数据包。
Socket s=new Socket("127.0.0.1",8000);
上述代码中 127.0.0.1 表示客户端要连接的服务器的IP地址,8000是客户端连接的服务器的端口号。在选择端口号时,要小心一点,因为每一个端口号表示提供一种特定的服务,只有给出正确的端口号,才能获得相应的服务。
ServerSocket ss=new ServerSocket(8000);
上述代码中使用8000端口号创建ServerSocket 对象。当服务器端启动了服务后,就可以接受客户端的请求了,使用的代码如下Socket s=ss.accpt();
上面的代码中使用ServerSocket类中accpt方法接受客户端的请求,并返回一个Socket对象,该Socket对象与客户端发出请求的Socket对象对应,可以用来进行数据的传输。
socket 类中方法用来获取输入流和输出流。
InputStream getInputStream(): 获取当前Socket对象相关的输入流,可以进行读取数据的操作。
OutputStream getOutputStream() :获取当前Socket对象相应的输入流,可以进行相应的写数据。
由于客户端总是创建一个Socket对象发出请求,而服务器获取请求后总是返回一个Socket对象,所以在客户端与服务器端都是可以使用Socket对象的getInputStream() 和getOutputStream()方法获取通信中的输入流和输出流,进行数据的传输。
import java.io.*;import java.net.*;class Client2 { public static void main(String[] args) throws Exception { Socket s=new Socket("192.168.0.116",10000); OutputStream out=s.getOutputStream(); out.write("Server hello".getBytes()); InputStream in=s.getInputStream(); byte[] by=new byte[1024]; int len=in.read(by); System.out.println(new String(by,0,len)); s.close(); }}class Server{ public static void main(String[] args)throws Exception { ServerSocket ss=new ServerSocket(10000); Socket s=ss.accept(); String ip=s.getInetAddress().getHostAddress(); System.out.println(ip+".....Connected"); InputStream in=s.getInputStream(); byte[] by=new byte[1024]; int len=in.read(by); System.out.println(new String(by,0,len)); OutputStream out=s.getOutputStream(); Thread.sleep(10000); out.write("accept is ok".getBytes()); s.close(); ss.close(); }}
UDP
UDP不能保证可靠的传输,java中提供了DatagramSocket和DatagramPacket 两种类,用来支持数据报的通信。DatagramSocket用来在程序之间建立传送数据报的通信连接。DatagramPacket则用来表示一个数据报。用数据报凡是进行网络编程是,无论是客户端还是服务器端都要建立一个DatagramSocket对象,用来接收或发送数据报,然后使用DatagramPacket对象作为传输数据的载体。
DatagramSocket类定义的构造函数,可以方便创建对象。
DatagramSocket()DatagramSocket(int port)DatagramSocket(int port,InetAddress address)
构造函数中port代表端口。address代表本地地址。
DatagramPacket中的构造函数,方便创建对象。
DatagramPacket(byte byf[] ,int length)DatagramPacket(byte buf[],int length,InetAddress address,int port)DatagramPacket(byte buf[] ,int offSet,int length)DatagramPacket(byte buf[] ,int offset,int length,InetAddress address,int port)
构造函数中的常数参数是一个数组,用啦存放数据报数据。length表示数据报中数据的长度,address和port表示目的地址和端口。offset表示数据报的位移量。
import java.io.*;import java.net.*;class SendDemo2{ public static void main(String[] args) throws Exception { DatagramSocket da=new DatagramSocket(); BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in)); String line=null; while ((line=bufr.readLine())!=null) { if ("886".equals(line)) { break; } byte[] by=line.getBytes(); DatagramPacket dp=new DatagramPacket(by,by.length,InetAddress.getByName("192.168.0.109"),10003); da.send(dp); } da.close(); }}class RecDemo2 { public static void main(String[] args)throws Exception { DatagramSocket ds=new DatagramSocket(10003); while (true) { byte[] by=new byte[1024]; DatagramPacket dp=new DatagramPacket(by,by.length); ds.receive(dp); String ip=dp.getAddress().getHostAddress(); String data=new String(dp.getData(),0,dp.getLength()); System.out.println(ip+"::"+data); } }}
- 黑马程序员_java10_网络编程
- 【黑马程序员】网络编程
- 黑马程序员 网络编程
- 黑马程序员:网络编程
- 黑马程序员-------网络编程
- 黑马程序员-网络编程
- 黑马程序员:网络编程
- 黑马程序员--网络编程
- 黑马程序员--网络编程
- 黑马程序员-网络编程
- 黑马程序员-------网络编程
- 黑马程序员-网络编程
- 黑马程序员-----网络编程
- 黑马程序员-网络编程
- 黑马程序员-网络编程
- 黑马程序员 网络编程
- 黑马程序员----- 网络编程
- 黑马程序员 网络编程
- uva 11183 Teen Girl Squad (最小树形图)
- Xcode 6 LaunchImage 载入界面标准大小
- 乘方算法
- 根据银行卡号来获取银行名称-java
- OVER(PARTITION BY)函数用法
- 黑马程序员_java10_网络编程
- 关于mediaplayer
- loss functions for NN
- lintcode-组合-152
- mybatis 在oracle数据库中插入数据时获取自增ID
- java多线程 并发编程
- struts2 拦截器例子
- 推荐系统的那点事
- 如果你现在开始学习Android