网络编程

277 阅读3分钟

网络编程(在网络上实现IO的传输)

涉及计算机网络的知识

\

image.png

image.png

image.png

image.png

一.网络编程有两个主要问题

1.如何准确定位网络上一台或多台主机,定位主机上的特定的应用 2.找到主机后如何高效地进行数据传输

二.网络通信要素概述

1.IP和端口号 2.提供网络通信协议:TCP/IP参考模型(应用层,传输层,网络层,物理+数据链路层)

三.通信要素1:IP

1.IP:

image.png 2.在java中用InetAddress类代表IP

3.IP分类:IPV4和IPV6;万维网和局域网

4.域名:www.baidu.com www.mi.com

image.png 5.本地回路地址:127.0.0.1 对应着localhost

6.如何实例化InetAddress:两个方法:getName(String host),getLocalHost

两个常用方法:getHostName()getHostAddress()

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

要求:不同的进程有不同的端口号

\

image.png

网络通信要素2:网络协议

image.png

image.png

image.png TCP:打电话(需要双方都在)

UDP:发短信,打电报(不需要对方在)

image.png

三次握手,四次挥手(重点中的重点)

image.png

练习1:客户端发送信息给服务端,服务端将数据显示在控制台上

实现TCP的网络编程
例子1:客户端发送信息给服务端,服务端将数据显示在控制台上
 */
public class TCPTest1 {
    //客户端
    @Test
    public void client() throws IOException {
        //1.创建Socket对象,指明服务器端的ip和端口号
        InetAddress inet = InetAddress.getByName("127.0.0.1");
        Socket socket = new Socket(inet,8899);
        //2.获取一个输出流,用于输出数据
        OutputStream os = socket.getOutputStream();
        //3.写出数据的操作
        os.write("你好,我是客户端MM".getBytes());
        //4.资源的关闭
        socket.close();
        os.close();
    }
    //服务端
    @Test
    public void server() throws IOException {
        //1.创建服务器端的ServerSocket,指明自己的端口号
        ServerSocket ss = new ServerSocket(8899);
        //2.调用accapt()表明接收来自于客户端的socket
        Socket socket = ss.accept();
        //3.获取输入流
        InputStream is = socket.getInputStream();
        //不建议下面这种方式:因为可能会出现乱码
//        byte[] buffer = new byte[20];
//        int len;
//        while((len=is.read(buffer))!=-1){
//            String str = new String(buffer,0,len);
//            System.out.println(str);
        //读取输入流中的数据
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buffer = new byte[5];
        int len;
        while((len = is.read(buffer))!=-1){
            baos.write(buffer,0,len);
        }
        System.out.println(baos.toString());
        System.out.println("收到了来自"+ socket.getInetAddress().getHostAddress());
        //5.关闭资源
        baos.close();
        is.close();
        socket.close();
        ss.close();
    }

练习2:客户端发送文件给服务端,服务端将文件保存在本地

//例题2:客户端发送文件给服务端,服务端将文件保存在本地
public class TCPtest2 {
    @Test
    public void client() throws IOException {
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9090);
        OutputStream os = socket.getOutputStream();
        FileInputStream fis =new FileInputStream("小哀.jpg");
        byte[]buffer = new byte[1024];
        int len;
        while((len=fis.read(buffer))!=-1){
            os.write(buffer,0,len);
        }
        fis.close();
        os.close();
        socket.close();
    }

    @Test
    public void server() throws IOException {
        ServerSocket ss = new ServerSocket(9090);
        Socket socket = ss.accept();
        InputStream is = socket.getInputStream();
        FileOutputStream fos = new FileOutputStream(new File("小哀5.jpg"));
        byte[]buffer = new byte[1024];
        int len;
        while((len=is.read(buffer))!=-1){
            fos.write(buffer,0,len);
        }
        fos.close();
        is.close();
        socket.close();
        ss.close();
    }

练习3:从客户端发送文件到服务端,服务端保存到本地,并返回“发送成功”到客户端,并关闭相应的连接

//例题3:从客户端发送文件到服务端,服务端保存到本地,并返回“发送成功”到客户端,并关闭相应的连接
public class TCOtest3 {
    public void client() throws IOException {
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),21312);
        OutputStream os = socket.getOutputStream();
        FileInputStream fis =new FileInputStream("小哀.jpg");
        byte[]buffer = new byte[1024];
        int len;
        while((len=fis.read(buffer))!=-1){
            os.write(buffer,0,len);
        }
        //关闭数据的输出
        socket.shutdownOutput();
        //接收来自于服务器端的数据,并显示到控制台上
        InputStream is = socket.getInputStream();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] bufferr = new byte[5];
        int lenn;
        while((lenn = is.read(bufferr))!=-1){
            baos.write(bufferr,0,lenn);
        }
        System.out.println(baos.toString());

        fis.close();
        os.close();
        socket.close();
        baos.close();
    }
    @Test
    public void server() throws IOException {
        ServerSocket ss = new ServerSocket(21312);
        Socket socket = ss.accept();
        InputStream is = socket.getInputStream();
        FileOutputStream fos = new FileOutputStream(new File("小哀6.jpg"));
        byte[]buffer = new byte[1024];
        int len;
        while((len=is.read(buffer))!=-1){
            fos.write(buffer,0,len);
        }
        //服务器端给予客户端反馈
        OutputStream os = socket.getOutputStream();
        os.write("你好,小哀,我已收到你的照片".getBytes());

        fos.close();
        is.close();
        socket.close();
        ss.close();
        os.close();
    }

image.png

//发送端,例子
    @Test
    public void sender() throws IOException {
        DatagramSocket socket = new DatagramSocket();
        String str = "我是UDP方式发射的导弹";
        byte[] data = str.getBytes();
        InetAddress inet = InetAddress.getLocalHost();
        DatagramPacket packet = new DatagramPacket(data,0,data.length,inet,9090);
        socket.send(packet);
        socket.close();
    }
    //接收端
    @Test
    public void receiver()throws IOException{
        DatagramSocket socket = new DatagramSocket(9090);
        byte[]buffer=new byte[100];
        DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
        socket.receive(packet);
        System.out.println(new String(packet.getData(),0,packet.getLength()));
        socket.close();
    }
}

URL编程

image.png

image.png

image.png 可以分析一波,对后面的javaweb很有帮助