网络编程—-TCP、UDP、URL

简介

网络编程就是如何在程序中实现两台计算机的通信。

TCP实现聊天

TCP实现聊天功能需要两个端口,客户端和服务器

直接上代码,细节以及代码解释都在代码的注释中

客户端

package demo01;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

// 客户端
// 1. 连接服务器Socket
// 2. 发送信息
public class TcpClient {
    public static void main(String[] args) {
        OutputStream os = null;
        Socket socket = null;
        try {
            //服务ip
            InetAddress ip = InetAddress.getByName("127.0.0.1");
            //服务端口
            int port = 7788;
            //通过ip和端口号连接服务器
            socket = new Socket(ip, port);
            //通过流发送信息
            os = socket.getOutputStream();
            os.write("你好啊".getBytes());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭流和连接服务,避免资源浪费
            if (os != null) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
    }
}

复制代码

服务器

package demo01;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

// 服务端
// 建立服务端口
// 等待用户的连接
// 接收用户发送的信息
// 关闭流
public class TcpServer {
    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        Socket socket = null;
        InputStream is = null;
        ByteArrayOutputStream baos = null;
        try {
            // 建立服务端口
            serverSocket = new ServerSocket(7788);
            // 等待用户的连接, accept 接收连接
            socket = serverSocket.accept();

            // 接受用户发送的信息
            is = socket.getInputStream();
            // 通过 ByteArrayOutputStream 流 打印信息
            baos = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len;
            while ((len = is.read(buffer)) != -1) {
                baos.write(buffer, 0, len);
            }
            System.out.println(baos.toString());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (baos != null) {
                try {
                    baos.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();
                }
            }
        }
    }
}

复制代码

测试: 先打开服务端的服务,然后再打开客户端进行访问,服务端收到客户端发送的信息

image.png

TCP实现文件上传

客户端

package demo02;

// 文件上传

// 客户端
/*
    1. 得到服务器端口和ip地址
    2. 连接服务端
    3. 上传文件
    4. 告诉服务端,发送文件完成
    5. 得到服务器接收完的信息
    6. 关闭资源
 */

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;

public class TcpClient {
    public static void main(String[] args) {
        Socket socket = null;
        FileInputStream fileInputStream = null;
        OutputStream outputStream = null;
        InputStream inputStream = null;
        ByteArrayOutputStream baos = null;
        try {
            // 得到服务器端口和ip地址
            InetAddress ip = InetAddress.getByName("127.0.0.1");
            int port = 7899;
            // 连接服务端
            socket = new Socket(ip, port);
            // 上传文件
            fileInputStream = new FileInputStream(new File("3.jpg"));//读取文件
            outputStream = socket.getOutputStream();// 输出流

            byte[] buffer = new byte[1024];
            int len;
            while ((len = fileInputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, len); // 写出文件
            }
            //告诉服务端,发送文件完成
            socket.shutdownOutput();

            // 得到服务器接收完的信息
            inputStream = socket.getInputStream();
            baos = new ByteArrayOutputStream();
            byte[] buffer1 = new byte[1024];
            int len1;
            while ((len1 = inputStream.read(buffer1)) != -1) {
                baos.write(buffer1, 0, len1);
            }
            System.out.println(baos.toString());// 打印信息

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            if (baos!=null){
                try {
                    baos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fileInputStream != null) {
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

复制代码

服务端

package demo02;

//文件上传

//服务端

/*
    1. 创建服务端口
    2. 等待用户连接
    3. 接收用户上传的文件
    4. 通知用户,已经接收到文件的信息
    5. 关闭资源
 */

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {
    public static void main(String[] args) {
        ServerSocket serverSocket=null;
        Socket socket = null;
        FileOutputStream fileOutputStream=null;
        InputStream inputStream= null;
        OutputStream outputStream=null;
        try {
            // 创建服务端口
            serverSocket = new ServerSocket(7899);
            // 等待用户连接
             socket = serverSocket.accept();
            //接收用户上传的文件  kity.jpg为你下载后的文件名
            fileOutputStream = new FileOutputStream(new File("kity.jpg"));
            inputStream = socket.getInputStream();//输入流

            byte[] buffer = new byte[1024];
            int len;
            while((len=inputStream.read(buffer))!=-1){
                fileOutputStream.write(buffer,0,len);
            }

            // 通知用户,已经接收到文件的信息
            outputStream = socket.getOutputStream();
            outputStream.write("接收到上传的文件".getBytes());

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            if (outputStream!=null){
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (inputStream!=null){
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fileOutputStream!=null){
                try {
                    fileOutputStream.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();
                }
            }
        }
    }
}

复制代码

image.png

UDP实现发送信息

客户端

package demo03;

import java.net.*;

// 发送消息
/*
    1. 建立一个datagramSocket
    2. 建个包 包里面存放发送的信息
    3. 发送包
    4. 关闭流
 */
public class UdpClient {
    public static void main(String[] args) throws Exception {
        // 建立一个datagramSocket
        DatagramSocket datagramSocket = new DatagramSocket();

        //发送的信息
        String message = "UDP发送信息";
        InetAddress ip = InetAddress.getByName("127.0.0.1");
        int port = 9999;
        // 建个包
        DatagramPacket datagramPacket = new DatagramPacket(message.getBytes(),0,message.getBytes().length,ip,port);
        //发送包
        datagramSocket.send(datagramPacket);

        // 关闭流
        datagramSocket.close();
    }
}

复制代码

服务端

package demo03;

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

//等待客户端连接
/*
    1. 开放端口
    2. 接收数据包
    3. 阻塞接收
    4. 打印接收到的消息
    5. 关闭流
 */
public class UdpServer {
    public static void main(String[] args) throws Exception {
        // 开放端口
        DatagramSocket datagramSocket = new DatagramSocket(9999);
        // 接收数据包
        byte[] buffer = new byte[1024];
        DatagramPacket datagramPacket = new DatagramPacket(buffer,0,buffer.length);
        //阻塞接收
        datagramSocket.receive(datagramPacket);
        // 打印接收到的消息
        System.out.println(datagramPacket.getAddress().getHostAddress());
        System.out.println(new String(datagramPacket.getData(),0,datagramPacket.getLength()));
        // 关闭流
        datagramSocket.close();
    }
}

复制代码

image.png

UDP实现循环发送信息

客户端

package demo04;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.*;

public class UdpClient {
    public static void main(String[] args) throws Exception {
        DatagramSocket datagramSocket = new DatagramSocket(8888);

        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));

        // 循环发送信息
        while(true){
            String data = bufferedReader.readLine();
            byte[] bytes = data.getBytes();
            InetAddress ip = InetAddress.getByName("127.0.0.1");
            int port = 7777;

            DatagramPacket datagramPacket = new DatagramPacket(bytes,0,bytes.length,ip,port);
            datagramSocket.send(datagramPacket);

            if (data.equals("bye")){
                break;
            }
        }

        bufferedReader.close();
        datagramSocket.close();

    }
}

复制代码

服务端


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

public class UdpServer {
    public static void main(String[] args) throws Exception {
        DatagramSocket datagramSocket = new DatagramSocket(7777);

        //循环接收信息
        while(true){
            byte[] bytes = new byte[1024];
            DatagramPacket datagramPacket = new DatagramPacket(bytes,0,bytes.length);
            datagramSocket.receive(datagramPacket);
            // 接收到的信息
            byte[] data = datagramPacket.getData();
            // 将接收到的信息转化为字符串
            String receive = new String(data, 0, datagramPacket.getLength());
            System.out.println(receive);
            if (receive.equals("bye")){
                break;
            }
        }
        datagramSocket.close();
    }
}

复制代码

客户端发送信息

image.png

服务端接收消息

image.png

UDP实现聊天功能

发送端工具类

package demo05;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;

// 发送信息的工具类
public class ChatSend implements Runnable{
    DatagramSocket datagramSocket = null;
    BufferedReader bufferedReader = null;

    private int formPort;//发送者端口
    private String toIP;//发送到哪里
    private int toPort;//接收者端口

    public ChatSend(int formPort, String toIP, int toPort) {
        this.formPort = formPort;
        this.toIP = toIP;
        this.toPort = toPort;

        try {
            datagramSocket = new DatagramSocket(formPort);
            bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {

        while(true){
            try {
                String data = bufferedReader.readLine();
                byte[] bytes = data.getBytes();

                DatagramPacket datagramPacket = new DatagramPacket(bytes,0,bytes.length,new InetSocketAddress(this.toIP,this.toPort));
                datagramSocket.send(datagramPacket);
                if (data.equals("bye")){
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        try {
            bufferedReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        datagramSocket.close();

    }
}

复制代码

接收端工具类

package demo05;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

// 接收信息的工具类
public class ChatReceive implements Runnable{
    DatagramSocket datagramSocket = null;
    private int port; // 开放的接收端口
    private String messageFrom;//谁发送的

    public ChatReceive(int port, String messageFrom) {
        this.port = port;
        this.messageFrom = messageFrom;
        try {
            datagramSocket = new DatagramSocket(this.port);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {

        while(true){
            byte[] bytes = new byte[1024];
            DatagramPacket datagramPacket = new DatagramPacket(bytes,0,bytes.length);
            try {
                datagramSocket.receive(datagramPacket);
            } catch (IOException e) {
                e.printStackTrace();
            }
            byte[] data = datagramPacket.getData();
            String receive = new String(data, 0, datagramPacket.getLength());
            System.out.println(messageFrom+":"+receive);
            if (receive.equals("bye")){
                break;
            }
        }
        datagramSocket.close();
    }
}

复制代码

聊天对象A

package demo05;

public class teacher {
    public static void main(String[] args) {
        new Thread(new ChatSend(5555,"localhost",3333)).start();
        new Thread(new ChatReceive(2222,"Student")).start();
    }
}

复制代码

聊天对象B

package demo05;
/*
    ChatSend:从A端口发送到B端口
    ChatReceive:开放C端口

    学生从1111端口发送给老师开放的2222端口,同时开放3333端口让老师访问
    老师从4444端口发送给学生开放的3333端口,同时开放2222端口让学生访问

 */
public class student {
    public static void main(String[] args) {
        new Thread(new ChatSend(1111,"localhost",2222)).start();
        new Thread(new ChatReceive(3333,"Teacher")).start();
    }
}

复制代码

image.png

image.png

URL下载

通过资源所在地址,下载资源,比如说音乐

package demo06;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

public class URLDownload {
    public static void main(String[] args) throws Exception {
        // 资源下载地址  这里下载一首歌 URL里面填写的是歌所在的地址
        URL url = new URL("https://m801.music.126.net/20210511221102/9eddb962693b3e07a99d444cf05d8921/jdyyaac/5252/0f09/0e0b/e824f0ca5a8c5dcae8509aa056e2fa04.m4a");
        // 连接到这个资源的地址
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
        //  下载
        InputStream inputStream = urlConnection.getInputStream();
        FileOutputStream fileOutputStream = new FileOutputStream("music1.m4a");
        byte[] buffer = new byte[1024];
        int len;
        while ((len=inputStream.read(buffer))!=-1){
            fileOutputStream.write(buffer,0,len);
        }
        // 关闭资源
        fileOutputStream.close();
        inputStream.close();
        urlConnection.disconnect();
    }
}

复制代码

image.png

然后通过格式工厂,你就可以把歌转换为MP3格式了。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享