网络编程

2020-06-10  本文已影响0人  寂静的春天1988

网络编程就是:实现网络互联的不同计算机上运行的程序间可以进行数据交换

网络模型:网络间通信的规则

1、OSI参考模型
2、TCP/IP参考模型


image.png

网络编程三要素:ip地址,端口,协议。

InetAddress类

java为了更方便的操作ip地址,提供了InetAddress类。

协议:通信的规则

1、UDP协议
把数据打包,数据有限制(64K),不建立连接,速度快,不可靠。

2、TCP协议
建立连接,形成传输数据的通道,在连接的过程中进行大数据量的传输,通过三次握手完成连接,是可靠协议,必须建立连接,效率稍低。

Socket

Socket:包含了IP地址和端口号
原理:
1、通信两端都有socket
2、网络通信其实就是socket间的通信
3、数据在两个socket间通过IO传输

/**
 * UDP协议发送Demo
 */
public class Demo {
    
    
    
    public static void main(String[] args) throws Exception {
        // 1、创建UDP协议Socket对象
        DatagramSocket ds=new DatagramSocket();
        // 2、数据打包
        byte[] by="hello,UDP协议".getBytes();
        InetAddress address=InetAddress.getByName("192.168.24.28");
        DatagramPacket dp=new DatagramPacket(by, by.length, address, 10086);
        // 3、发送数据
        ds.send(dp);
        // 4、释放资源
        ds.close();

    }
}
/**
 * UDP协议接收demo
 *
 */
public class Demo1 {
    public static void main(String[] args) throws Exception {
        //创建对象
        DatagramSocket ds = new DatagramSocket(10086);
        byte[] bytes=new byte[1024];
        DatagramPacket dp=new DatagramPacket(bytes, bytes.length);
        // 接收数据包
        ds.receive(dp);
        // 解析数据包
        byte[] data=dp.getData();
        System.out.println(new String(data,0,dp.getLength()));
        // 释放资源
        ds.close();
    }
}

注意:需要先运行接收端,再运行发送端。

/**
 * TCP协议发送Demo(客户端)
 */
public class Demo {

    public static void main(String[] args) throws Exception {
        // 1、创建Socket对象
        Socket socket = new Socket("192.168.24.28", 10086);
        // 2、获取输出流,写数据
        OutputStream out = socket.getOutputStream();
        out.write("你好 TCP!".getBytes());
        
        //3、获取输入流(接收服务端响应)
        InputStream is = socket.getInputStream();
        // 释放资源
        byte[] bytes = new byte[1024];
        int len = is.read(bytes);
        System.out.println(new String(bytes, 0, len));
        
        // 4、释放资源
        out.close();
        socket.close();
    }
}
/**
 * TCP协议接收demo
 *
 */
public class Demo1 {
    public static void main(String[] args) throws Exception {
        // 创建服务端Socket对象
        ServerSocket serverSocket = new ServerSocket(10086);

        // 监听客户端连接,并返回Socket对象
        Socket socket = serverSocket.accept();
        // 获取输出流
        InputStream is = socket.getInputStream();
        byte[] bytes = new byte[1024];
        int len = is.read(bytes);
        System.out.println(new String(bytes, 0, len));
        // 返回响应
        OutputStream out=socket.getOutputStream();
        out.write("收到了!".getBytes());
        // 释放资源
        is.close();
        out.close();
        socket.close();
        // 服务端不要关闭
    }
}

多线程更改代码

/**
 * TCP协议发送Demo(客户端)
 */
public class Demo {

    public static void main(String[] args) throws Exception {
        // 1、创建Socket对象
        Socket socket = new Socket("192.168.24.28", 10086);
        // 2、获取输出流,写数据
        OutputStream out = socket.getOutputStream();
        out.write("你好 TCP!".getBytes());
        
        //3、获取输入流(接收服务端响应)
        InputStream is = socket.getInputStream();
        // 释放资源
        byte[] bytes = new byte[1024];
        int len = is.read(bytes);
        System.out.println(new String(bytes, 0, len));
        
        // 4、释放资源
        out.close();
        socket.close();
    }
}
/**
 * TCP协议接收demo
 *
 */
public class Demo1 {
    public static void main(String[] args) throws Exception {
        // 创建服务端Socket对象
        ServerSocket serverSocket = new ServerSocket(10086);
        
        while(true) {
            // 监听客户端连接,并返回Socket对象
            Socket socket = serverSocket.accept();
            new Thread(new GetThread(socket)).start();
        }
        
        
    }
}
public class GetThread implements Runnable {

    private Socket socket;

    public GetThread(Socket socket) {
        this.socket=socket;
    }

    @Override
    public void run() {

        // 获取输出流
        InputStream is = null;
        OutputStream out = null;
        try {
            is = socket.getInputStream();
            byte[] bytes = new byte[1024];
            int len = is.read(bytes);
            System.out.println(new String(bytes, 0, len));
            // 返回响应
            out=socket.getOutputStream();
            out.write("收到了!".getBytes());

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            // 释放资源
            try {
                if(is!=null) {
                    is.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if(out!=null) {
                    out.close();
                }
                
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if(socket!=null) {
                    socket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            // 服务端不要关闭
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读