java第二十一天(网络编程)

91.网络编程java

(1)网络模型编程

OSI模型:七层协议安全

TCP/IP模型:经常使用服务器

(2)网络通讯三要素网络

第一:ip地址socket

使用dos命令查看ip地址,ipconfig.net

ip最大值是233.255.255.255,可设置区间1.0.0.0-233.255.255.2553d

用dos命令查看主机是否互通的,ping 域名\ip地址server

回环地址:127.0.0.1对象

 第二 端口号,用于标识进程的逻辑地址,不一样的进程端口不一样

dos命令查看端口号,netstat-ano

第三,协议

常见的有两种协议:

TCP和UDP协议

UDP:

将数据源和目的地封装到数据包中,不须要创建链接。

每一个数据包的大小限制在64k。

由于不创建链接,因此安全性差,速度快。

TCP:

创建链接造成传输数据的通道,而后再传输数据,经过三次的握手。

安全性高,效率低。 

(3)InetAdress类

单例模式(没有构造器),不能直接new,根据静态方法来返回该对象

getByName(String name)根据已知的给定的主机名肯定主机的IP地址

import java.net.InetAddress;
import java.net.UnknownHostException;

public class InetAdressDemo {
    public static void main(String[] args) throws UnknownHostException {
        //经过静态方法返回InetAddress的对象
        InetAddress localHost = InetAddress.getLocalHost();
        //得到IP地址的字符串
        String hostAddress = localHost.getHostAddress();
        System.out.println("IP地址是"+hostAddress);
        //得到IP地址中的主机的名字
        String hostName = localHost.getHostName();
        System.out.println("主机名是"+hostName);
        //根据给定的主机名返回该对象
        InetAddress byName = InetAddress.getByName("C64-20190318DQZ");
        String hostAddress1 = byName.getHostAddress();
        String hostName1 = byName.getHostName();
        System.out.println("IP地址是"+hostAddress1);
        System.out.println("IP地址是"+hostName1);
    }
}

(4)UDP通讯

分两个部分

服务端步骤

第一步:建立socket服务对象(须要作关闭)

DatagramSocket(int port)

第二步:接收数据,用DataGrampacket表示数据包

DataGramPacket(byte[] buf,int length)

第三步:解析数据包

接收数据 receive(),程序到此阻塞有数据接收则继续

得到客户端的ip,getAdress();

得到数据 getData();

得到长度 getLength();

import java.net.*;

public class UdpServer {
    public static void main(String[] args){
        //服务器端步骤一,建立Socket服务对象(须要作关闭)
        DatagramSocket socket = null;

        try {
            socket=new DatagramSocket(10000);
            //步骤二,建立接收数据包
            byte[] buf=new byte[1024];
            DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length);
            System.out.println("服务端开始启动,等待客户端发送内容");
            //步骤三,解析数据
            socket.receive(datagramPacket);//程序到此阻塞,有数据传入继续
            //得到客户端的ip
            InetAddress inetAddress = datagramPacket.getAddress();
            //得到数据
            byte[] data = datagramPacket.getData();
            int length=datagramPacket.getLength();
            String s=new String(data,0,length);
            System.out.println(inetAddress.getHostAddress()+"发送的内容是"+s+"      长度是"+length);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(socket!=null){
                socket.close();
            }

        }

    }
}

客户端步骤:

第一步:建立DatagramSocket不用给端口(需关闭)

第二步:建立数据包

DatagramPacket(byte[] buf,int length,InetAddress address,int port)

第三步:发送数据包

send();

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UdpClient {
    public static void main(String[] args){
        //服务器端步骤一,建立Socket服务对象(须要作关闭,不用给端口)
        DatagramSocket socket = null;

        try {
            socket=new DatagramSocket();
            //步骤二,建立数据包
            String s="爱我中华!";
            byte[] buf=s.getBytes();
            DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length,InetAddress.getByName("192.168.1.11"),10000);
            //步骤三,发送数据包
            socket.send(datagramPacket);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(socket!=null){
                socket.close();
            }

        }

    }
}

先运行服务端再运行客户端,服务端就显示出来了

拓展:

注意字符字节的转换,从控制台输入的东西是以字节流方式存在的,让程序实现从控制台输入数据接收

用BufferReader,不断接收使用While(true)

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UdpServer {
    public static void main(String[] args){
        //服务器端步骤一,建立Socket服务对象(须要作关闭)
        DatagramSocket socket = null;

        try {
            socket=new DatagramSocket(10000);
            //步骤二,建立接收数据包
            byte[] buf=new byte[1024];
            DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length);
            System.out.println("服务端开始启动,等待客户端发送内容");
            //步骤三,解析数据
            while(true){
                socket.receive(datagramPacket);//程序到此阻塞,有数据传入继续
                //得到客户端的ip
                InetAddress inetAddress = datagramPacket.getAddress();
                //得到数据
                byte[] data = datagramPacket.getData();
                int length=datagramPacket.getLength();
                String s=new String(data,0,length);
                System.out.println(inetAddress.getHostAddress()+"发送的内容是:     "+s);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(socket!=null){
                socket.close();
            }

        }

    }
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UdpClient {
    public static void main(String[] args){
        //服务器端步骤一,建立Socket服务对象(须要作关闭,不用给端口)
        DatagramSocket socket = null;
        BufferedReader reader=null;
        try {
            socket=new DatagramSocket();
//注意从控制台输入的内容是以字节流的方式存储的,因此读取的是字节流,为了更方便显示把字节流转换成字符流
            reader=new BufferedReader(new InputStreamReader(System.in));
            //步骤二,建立数据包
            String s=null;
            //使其不断接收使用While(true)
            while((s=reader.readLine())!=null){
                //设置退出循环的标识
                if("exit".equals(s)){
                    break;
                }else{
                    byte[] buf=s.getBytes();
                    DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length,InetAddress.getByName("192.168.1.11"),10000);
                    //步骤三,发送数据包
                    socket.send(datagramPacket);
                }
            }
            System.out.println("退出客户端");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(socket!=null){
                socket.close();
            }
            try {
                if(reader!=null){
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

    }
}

TCP通讯

服务端

第一步:建立Socket对象指定端口(需关闭)

ServerSocket(int port);

第二步:监听接收客户端对象Socket(也须要关闭)

Socket accept();

第三步:得到流对象

getInputStream();                BfferedReader

第四步:读取数据

第五步:得到客户端的IP地址

getHostAdress();

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {
    public static void main(String[] args) {
        //步骤一,建立服务端ServerSocket对象,指定端口(须要关闭)
        ServerSocket serverSocket = null;
        BufferedReader reader=null;
        //步骤二,建立监听接收客户端对象Socket
        Socket socket=null;
        try {
            serverSocket= new ServerSocket(9999);
            socket=serverSocket.accept();
            //步骤三,得到流对象,注意字节流字符流的转换
            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            //步骤四,读取数据
            String s = reader.readLine();
            //步骤五,得到客户端的ip地址
            InetAddress inetAddress = socket.getInetAddress();
            System.out.println(inetAddress.getHostAddress()+"发送的内容是:  "+s);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if(serverSocket!=null){
                    serverSocket.close();
                }
                if(socket!=null){
                    socket.close();
                }
                if(reader!=null){
                    reader.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

客户端

第一步:建立请求的Socket(需关闭)

Socket(String host,int port)

第二步:得到输出流

getOutputStream();                BufferedWriter

第三步:写数据

第四步:释放资源

import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class TcpClient {
    public static void main(String[] args) {
        //步骤一,建立Socket对象,指定ip和端口(须要关闭)
        Socket socket=null;
        BufferedWriter writer=null;
        try {
            socket=new Socket("192.168.1.11",9999);
            //步骤三,得到输出流对象,注意字节流字符流的转换
            writer= new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            //步骤四,写数据
            writer.write("爱我中华");
            writer.newLine();//换行
            writer.flush();//刷新
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if(socket!=null){
                    socket.close();
                }
                if(writer!=null){
                    writer.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

拓展:实现TCP从控制台输入数据

加一个BufferReader,用While(true)搭配if...breakv          

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer1 {
    public static void main(String[] args) {
        //步骤一,建立服务端ServerSocket对象,指定端口(须要关闭)
        ServerSocket serverSocket = null;
        BufferedReader reader=null;
        //步骤二,建立监听接收客户端对象Socket
        Socket socket=null;
        try {
            serverSocket= new ServerSocket(9999);

            socket=serverSocket.accept();
            //步骤三,得到流对象,注意字节流字符流的转换
            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String s=null;
            //步骤四,读取数据
            while (true){
                if((s=reader.readLine())==null){
                    break;
                }else{
                    //步骤五,得到客户端的ip地址
                    InetAddress inetAddress = socket.getInetAddress();
                    System.out.println(inetAddress.getHostAddress()+"发送的内容是:  "+s);

                }
            }
            System.out.println("退出服务端");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if(serverSocket!=null){
                    serverSocket.close();
                }
                if(socket!=null){
                    socket.close();
                }
                if(reader!=null){
                    reader.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class TcpClient1 {
    public static void main(String[] args) {
        //步骤一,建立Socket对象,指定ip和端口(须要关闭)
        Socket socket=null;
        BufferedWriter writer=null;
        BufferedReader reader=null;
        try {
            socket=new Socket("192.168.1.11",9999);
            String s =null;
            reader=new BufferedReader(new InputStreamReader(System.in));
            //步骤三,得到输出流对象,注意字节流字符流的转换
            writer= new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            while ((s=reader.readLine())!=null){
                if("exit".equals(s)){
                    break;
                }else{
                    //步骤四,写数据
                    writer.write(s);
                    writer.newLine();//换行
                    writer.flush();//刷新
                }
            }
            System.out.println("退出客户端程序");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if(socket!=null){
                    socket.close();
                }
                if(writer!=null){
                    writer.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

相关文章
相关标签/搜索