Java第十三章网络编程

网络编程:

IP地址:InetAddress

》唯一的标识

端口号:标识正在计算机运行的进程

0~65535其中0~1023被预先定义

端口号与IP地址的组合得出一个网络套接字。

/**
 * InetAddress:位于java.net包下
 * 1.InetAddress用来代表IP地址,一个InetAddress的对象就代表着一个IP地址
 * 2.如何创建InetAddress的对象,getByName(String host)
 * 3.getHostName():获取IP地址对应的域名
 * 4.getHostAddress():获取IP地址
 */
public class NetADDress {
    public static void main(String[] args) throws UnknownHostException {
        //创建一个InetAddress对象,getByName()
        InetAddress inetAddress = InetAddress.getByName("www.baidu.com");//域名或IP地址
        System.out.println(inetAddress);
        //两个方法
        System.out.println(inetAddress.getHostName());
        System.out.println(inetAddress.getHostAddress());
        //获得本机的IP:getLocalHost()
        InetAddress inetAddress1 = InetAddress.getLocalHost();
        System.out.println(inetAddress1);
        System.out.println(inetAddress1.getHostName());
        System.out.println(inetAddress1.getHostAddress());
    }
}

 

 TCP和UDP

 TCP协议:

》使用TCP协议前,须先建立TCP连接,形成传输数据通道

》传输前,采用“三次握手”方式,是可靠的

》TCP协议进行通信的两个应用进程:客户端、服务器

》传输完毕,须释放已建立的连接,效率低

UDP协议:

》将数据、源、目的封装成数据包,不需要建立连接

》每个数据包的大小限制在64K内

》因无需连接,故是不可靠的

》发送数据结束时无需释放资源,速度快

 

TCP编程一:客户端给服务器发送消息,服务端输出此信息到控制台上
客户端:
//客户端
    @Test
    public void client(){
        Socket socket = null;
        OutputStream os = null;
        try {
            //1.创建一个Socket的对象,通过构造器指明服务器的IP地址,以及其接受的端口号
            socket = new Socket(InetAddress.getByName("127.0.0.1"),8888);

            //2.getOutputStream(),发送数据,方法返回OutputStream的对象
            os = socket.getOutputStream();

            //3.具体的输出过程
            os.write("我是客户端!hello".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //4.关闭流和Socket对象
            if (os!=null){
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(socket!=null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
  }

 

服务器:

 

//服务器
    @Test
    public void server(){
        ServerSocket serverSocket = null;
        Socket so = null;
        InputStream is = null;
        try {
            //1.创建一个ServerSocket的对象,通过构造器指明自身的端口号
            serverSocket = new ServerSocket(8888);
            //2.调用其accept()方法,返回一个Socket的对象
            so = serverSocket.accept();
            //3.调用Socket对象的getInputStream()获取一个从客户端发送过来的输入流
            is = so.getInputStream();
            //4.对获取的输入流进行操作
            int len;
            byte[] b = new byte[20];
            while((len = is.read(b))!=-1){
                String str = new String(b,0,len);
                System.out.println(str);
            }
            System.out.println("收到来自" + so.getInetAddress().getHostAddress() + "的信息");
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(so!=null){
                try {
                    so.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(is!=null){
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(serverSocket!=null){
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

 

TCP编程二:客户端给服务器发送消息,服务端输出此信息到控制台上,服务器收到信息回复“我已经收到”
客户端:
//客户端
    @Test
    public void client(){
        Socket socket = null;
        OutputStream os = null;
        InputStream is = null;
        try {
            socket = new Socket(InetAddress.getByName("127.0.0.1"),9999);
            os = socket.getOutputStream();
            os.write("我是客户端!".getBytes());
            //shutdownOutput():执行此方法,显式的告诉服务器发送完毕
            socket.shutdownOutput();

            is = socket.getInputStream();
            int len;
            byte[] b = new byte[20];
            while((len = is.read(b))!=-1){
                String str = new String(b,0,len);
                System.out.print(str);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(socket!=null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(os!=null){
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(is!=null){
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

  

服务器:

//服务器
    @Test
    public void server(){

        ServerSocket serverSocket = null;
        Socket socket = null;
        InputStream is = null;
        OutputStream os = null;
        try {
            serverSocket = new ServerSocket(9999);
            socket = serverSocket.accept();
            is = socket.getInputStream();
            int len;
            byte[] b = new byte[20];
            while((len = is.read(b))!=-1){
                String str = new String(b,0,len);
                System.out.print(str);
            }
            System.out.println("服务器收到来自" + socket.getInetAddress().getHostAddress() + "的信息");

            os = socket.getOutputStream();
            os.write("服务器收到信息".getBytes());
            socket.shutdownOutput();

        } catch (IOException e) {
            e.printStackTrace();
        }finally {

            if (socket!=null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(os!=null){
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(is!=null){
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(serverSocket!=null){
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

 

 

TCP编程三:从客户端发送文件给服务器,服务器保存到本地,并返回“发送成功”给客户端,并关闭相关的连接
 //服务器
    @Test
    public void server(){
        ServerSocket serverSocket = null;
        Socket socket = null;
        InputStream is = null;
        FileOutputStream fos = null;
        OutputStream os = null;
        try {
            serverSocket = new ServerSocket(9999);
            socket = serverSocket.accept();
            is = socket.getInputStream();
            //创建照片
            fos = new FileOutputStream(new File("4.jpg"));
            int len;
            byte[] b = new byte[2048];
            while((len = is.read(b))!=-1) {
                fos.write(b,0,len);
            }
            //发送信息
            os = socket.getOutputStream();
            os.write("发送成功".getBytes());
            socket.shutdownOutput();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(fos!=null){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                if (is!=null){
                    try {
                        is.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(socket!=null){
                    try {
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (serverSocket!=null){
                    try {
                        serverSocket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }

    }

  

   //客户端
    @Test
    public void  client(){
        Socket socket = null;
        OutputStream os = null;
        InputStream is = null;
        FileInputStream fis = null;
        try {
            socket = new Socket(InetAddress.getByName("127.0.0.1"),9999);
            os = socket.getOutputStream();
            is = socket.getInputStream();

            //发送照片
            fis = new FileInputStream(new File("1.jpg"));
            int len;
            byte[] b  = new byte[2048];
            while((len = fis.read(b)) != -1){
                os.write(b,0,len);
            }
            socket.shutdownOutput();
            //接受服务器的信息
            while((len = is.read(b))!=-1){
                String str = new String(b,0,len);
                System.out.println(str);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(os!=null) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(fis!=null){
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(socket!=null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

  

UDP网络通信
1.DatagramSocket与DatagramPacket
2.建立发送端,接收端
3.建立数据包
4.调用Socket的发送、接受方法
5.关闭Socket
发送端和接收端是两个独立的运行程序。 

 

    //发送端
    @Test
    public void send(){
        DatagramSocket ds = null;
        try {
            ds = new DatagramSocket();
            byte[] b = "我是发送端,hi好".getBytes();
            DatagramPacket packet = new DatagramPacket(b,b.length,InetAddress.getByName("127.0.0.1"),9090);

            ds.send(packet);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            ds.close();
        }

    }

    //接收端
    @Test
    public void receive(){
        DatagramSocket ds = null;
        try {
            ds = new DatagramSocket(9090);
            byte[] b =new byte[30];
            DatagramPacket packet = new DatagramPacket(b,0,b.length);
            ds.receive(packet);
            String str = new String(b,0,b.length);
            System.out.println(str);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            ds.close();
        }


    }

  

 URL:统一资源定位符,一个URL的对象,对应着互联网上一个资源
可以通过URL的对象调用其相应的方法,将此资源读取("下载")

方法:
》public String getProtocol()获取该URL的协议名
》public String getHost()获取该URL的主机名
》public String getPort()获取该URL的端口号
》public String getPath()获取该URL的文件路径
》public String getFile()获取该URL的文件名
》public String getRef()获取该URL在文件中的相对位置
》public String getQuery()获取该URL的查询名
URL url = new URL("http://www.baidu.com")

//如何将服务端的资源读取进来:openStream()
InputStream is = url.openStream();
byte[] b = new byte[20];
int len;
while((len=is,read(b))!-1){
      String str = new String(b,0,len);   
      System.out.print(str);      
}

//如果既有数据的输入,又有数据的输出,则考虑使用URLConnection
URLConnection urlConn =  url.openConnection();
urlConn.getInputStream()
urlConn.getOutputStream()

  


 

 

posted @ 2019-04-17 17:11  鸿森  阅读(216)  评论(0编辑  收藏  举报