黑马程序员_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);        }    }}
0 0
原创粉丝点击