Java网络编程Socket的使用

网络编程

TCP协议

  1. 客户端
    • 连接服务器Socket
    • 发送消息
    public static void main(String[] args) {
        Socket socket = null;
        OutputStream outputStream = null;

        try {
            // 1.要知道服务器地址,端口号
            InetAddress address = InetAddress.getByName("127.0.0.1");
            int port = 8080;
            // 2.创建Socket连接
            socket = new Socket(address,port);
            // 3.发送消息
            outputStream = socket.getOutputStream();
            outputStream.write("select * from student".getBytes());

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (socket!=null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (outputStream!=null){
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
  1. 服务端
    • 简历服务器端口 ServerSocket
    • 等待用户的连接 accept
    • 接收用户的消息
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = null;
        Socket socket = null;
        InputStream inputStream = null;
        ByteArrayOutputStream bos = null;
        try {
            // 1.创建服务端地址,给定端口号
            serverSocket = new ServerSocket(8080);
            // 2.等待连接
            socket = serverSocket.accept();
            // 3.读取客户端消息
            inputStream = socket.getInputStream();
            // 4.建立管道流
            bos = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len;
            while ((len=inputStream.read(buffer))!=-1){
                bos.write(buffer,0,len);
            }

            String s = bos.toString();
            System.out.println(s);

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (serverSocket!=null){
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (socket!=null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (inputStream!=null){
                inputStream.close();
            }
            if (bos!=null){
                bos.close();
            }
        }
    }

文件上传

客户端

    public static void main(String[] args) throws IOException {
        // 获取服务地址端口建立连接
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),8080);
        // 创建一个输出流
        OutputStream outputStream = socket.getOutputStream();
        // 读取文件
        FileInputStream fileInputStream = new FileInputStream("0_001551.jpg");
        // 写出文件
        byte[] buffer = new byte[1024];
        int len;
        while ((len=fileInputStream.read(buffer))!=-1){
            outputStream.write(buffer,0,len);
        }

        // 通知服务器,已经发送完毕
        socket.shutdownOutput();

        // 确定服务器接收完毕,才能断开连接
        InputStream inputStream = socket.getInputStream();
        // 创建管道
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        byte[] buffer2 = new byte[256];
        int len2;
        while ((len2=inputStream.read(buffer2))!=-1){
            bos.write(buffer,0,len2);
        }

        String s = bos.toString();
        System.out.println(s);

        // 关闭连接
        inputStream.close();
        bos.close();
        socket.close();
        outputStream.close();
        fileInputStream.close();

    }

服务端

    public static void main(String[] args) throws IOException {
        // 创建服务
        ServerSocket serverSocket = new ServerSocket(8080);
        // 监听客户端的连接
        Socket socket = serverSocket.accept();
        // 获取输入流
        InputStream inputStream = socket.getInputStream();

        // 文件输出
        FileOutputStream outputStream = new FileOutputStream("CopyFile.jpg");
        byte[] buffer = new byte[1024];
        int len;
        while ((len=inputStream.read(buffer))!=-1){
            outputStream.write(buffer,0,len);
        }

        // 通知客户端,我接收完毕
        OutputStream outputStream1 = socket.getOutputStream();
        outputStream1.write("yes".getBytes());

        // 关闭连接
        outputStream1.close();
        outputStream.close();
        inputStream.close();
        socket.close();
        serverSocket.close();
    }

Tomcat

服务端

  • 自定义S
  • Tomcat服务器S :Java后台开发

客户端

  • 自定义C
  • 浏览器B

UDP协议

  • 发消息:不需要连接,只需要知道地址

发送端

    public static void main(String[] args) throws IOException {
        // 1.建立一个Socket
        DatagramSocket socket = new DatagramSocket();

        // 2.消息,地址,端口
        String msg = "你好,服务器!";
        InetAddress localhost = InetAddress.getByName("localhost");
        int port = 9090;

        // 3.建包
        DatagramPacket packet = new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,localhost,port);

        // 4.发送
        socket.send(packet);

        // 关闭资源
        socket.close();
    }

接收端

    public static void main(String[] args) throws IOException {
        // 1.开发端口
        DatagramSocket socket = new DatagramSocket(9090);

        // 2.接收数据包
        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);

        // 3.阻塞接收
        socket.receive(packet);

        // 查看
        String s = new String(packet.getData(),0,packet.getData().length);

        System.out.println(s);

        // 关闭资源
        socket.close();
    }

咨询聊天循环发送

发送端

    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket(8888);

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

        while (true) {
            String data = "QQ1: " + reader.readLine();

            byte[] datas = data.getBytes();

            DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, InetAddress.getByName("localhost"), 6666);

            socket.send(packet);
            if (data.equals("byte")){
                break;
            }
        }

        socket.close();
    }

接收端

    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket(6666);

        while (true) {
            //准备容器
            byte[] buffer = new byte[1024];
            DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
            socket.receive(packet);//阻塞接收包裹

            //断开连接
            byte[] data = packet.getData();
            String msg = new String(data,0,data.length);
            //打印消息
            System.out.println(msg.trim());

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

        }
        socket.close();
    }

在线聊天

创建封装发送消息的线程,继承Runnable

public class TaskSend implements Runnable{

    private int startPort;
    private String toIP;
    private int toPort;
    private String myRole;
    DatagramSocket socket = null;
    BufferedReader reader = null;

    public TaskSend(int startPort,String toIP,int toPort,String myRole){
        this.startPort = startPort;
        this.toIP = toIP;
        this.toPort = toPort;
        this.myRole = myRole;

        try {
            socket = new DatagramSocket(this.startPort);
            reader = new BufferedReader(new InputStreamReader(System.in));
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {


            while (true) {
                try {
                    String data = this.myRole + ":" + reader.readLine();

                    byte[] datas = data.getBytes();

                    DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, InetAddress.getByName(this.toIP), this.toPort);

                    socket.send(packet);
                    if (data.equals("byte")){
                        break;
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }


        socket.close();
    }
}

创建封装消息线程,继承Runnable接口

public class TaskReceive implements Runnable{
    DatagramSocket socket = null;
    private int port;

    public TaskReceive(int port) {
        this.port = port;
        try {
            socket = new DatagramSocket(port);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {

        while (true) {
            try {
                //准备容器
                byte[] buffer = new byte[1024];
                DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
                socket.receive(packet);//阻塞接收包裹

                //断开连接
                byte[] data = packet.getData();
                String msg = new String(data,0,data.length);
                //打印消息
                System.out.println(msg.trim());

                if (msg.equals("bye")){
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
        socket.close();
    }
}

创建两个客户端,并且创建发送和接收线程

学生端

public class TaskStudent {
    public static void main(String[] args) {
        //开启两个线程
        new Thread(new TaskSend(6666,"localhost",8888,"学生")).start();
        new Thread(new TaskReceive(4444)).start();
    }
}

老师端

public class TaskTeacher {
    public static void main(String[] args) {
        //开启两个线程
        new Thread(new TaskSend(5555,"localhost",4444,"老师")).start();
        new Thread(new TaskReceive(8888)).start();
    }
}

在这里插入图片描述

URL

https://www.baidu.com/

统一资源定位符:定位互联网上的某一个资源

DNS域名解析 www.baidu.com xxx.x…x…x

协议://ip地址:端口/项目名/资源
    public static void main(String[] args) throws MalformedURLException {

        URL url = new URL("http://localhost:8080/yingsen/index.jsp?username=yingsen&passwword=123");

        System.out.println(url.getProtocol()); // 获取协议
        System.out.println(url.getHost()); // 获取主机ip
        System.out.println(url.getPort()); // 获取端口
        System.out.println(url.getPath()); // 获取路径
        System.out.println(url.getFile()); // 获取文件
        System.out.println(url.getQuery()); // 获取参数

    }

在这里插入图片描述

下载资源

    public static void main(String[] args) throws IOException {
        URL url = new URL("http://localhost:8080/yingsen/query.txt");

        HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();

        InputStream inputStream = urlConnection.getInputStream();

        FileOutputStream outputStream = new FileOutputStream("copyText.txt");

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

        outputStream.close();
        inputStream.close();
        urlConnection.disconnect();
    }

获取一个网络图片

    public static void main(String[] args) throws IOException {
        // 一个图片的地址
        URL url = new URL("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.jj20.com%2Fup%2Fallimg%2F1115%2F0ZR1095111%2F210ZP95111-7-1200.jpg&refer=http%3A%2F%2Fimg.jj20.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1660662153&t=c95d31d0bcb090c9e9c068473d58edd9");
        // 连接
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
        // 获取输入流
        InputStream inputStream = urlConnection.getInputStream();
        // 文件输出流
        FileOutputStream fileOutputStream = new FileOutputStream("baidu.jpg");
        // 循环写出
        byte[] buffer = new byte[1024];
        int len;
        while ((len=inputStream.read(buffer))!=-1) {
            fileOutputStream.write(buffer,0,len);
        }
        // 关闭资源
        fileOutputStream.close();
        inputStream.close();
        urlConnection.disconnect();
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值