ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Socket通讯

2021-07-25 16:32:10  阅读:126  来源: 互联网

标签:通讯 java Socket String new import byte socket


1. TCP

1.1 客户端

package com.june.tcp;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

/**
 * 客户端发送消息
 */
public class MyClient {

    public static void main(String[] args) throws Exception{
        String message = "client发送的消息";
        method1(message);
    }

    private static void method1(String message) throws Exception{
        // 创建socket连接
        Socket socket = new Socket("127.0.0.1", 8080);

        // 准备发送消息
        OutputStream outputStream = socket.getOutputStream();

        // 开始发送消息
        byte[] bytes = message.getBytes(StandardCharsets.UTF_8);
        outputStream.write(bytes);

        // 确认发送完毕
        System.out.println("发送完毕");
        socket.shutdownOutput();

        // 接收server端的响应消息
        while (true){
            InputStream inputStream = socket.getInputStream();
            byte[] bytes2 = new byte[30];
            int len = inputStream.read(bytes2);
            String mes = new String(bytes2, 0, len);
            socket.shutdownInput();
            if (mes.equals("接收完毕")) {
                System.out.println("server端接收完毕了,我可以关闭连接了");
                break;
            }
        }

        // 关闭连接
        socket.close();
    }
}

1.2 服务端

package com.june.tcp;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

/**
 * 服务端接受消息
 */
public class MyServer {
    public static void main(String[] args) throws Exception{
        method1();
    }

    private static void method1() throws Exception{
        // 创建连接,不用知道 ip ,只能使用当前电脑 ip
        ServerSocket serverSocket = new ServerSocket(8080);

        // server端一直监听client端发送的数据
        while (true) {
            // 等待客户端连接
            Socket accept = serverSocket.accept();

            // 准备获取传输的数据
            InputStream inputStream = accept.getInputStream();

            // 开始读取数据
            byte[] bytes = new byte[1024];
            int len = 0;
            StringBuilder stringBuilder = new StringBuilder();
            while((len = inputStream.read(bytes)) != -1 ) {
                String message = new String(bytes, 0, len);
                stringBuilder.append(message);
            }
            // 单次消息读取完成
            System.out.println(stringBuilder);

            // 接收完成,关闭输入流
            accept.shutdownInput();

            // 接收完成,给客户端响应
            OutputStream outputStream = accept.getOutputStream();
            String mes = "接收完毕";
            outputStream.write(mes.getBytes(StandardCharsets.UTF_8));
            accept.shutdownOutput();

            // 关闭本次连接
            accept.close();

        }
    }
}

2.UDP

备注:可用UDP实现聊天,开两个线程,一个用来发送消息,一个用来接收消息。

2.1 UDP发送消息

package com.june.udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;

/**
 * 客户端发送消息
 *      UDP方式无需和发送目标方建立连接,直接发送就行了,有没有人结束不重要,会造成数据丢失
 */
public class MyClient {
    public static void main(String[] args) throws Exception{
        String massage = "client发送的消息";
        method1(massage);
    }

    private static void method1(String massage) throws Exception{
        // 创建socket,如果还想接收数据的话,就指定port
        DatagramSocket socket = new DatagramSocket();

        /*
            打包发送
         */
        byte[] data = massage.getBytes(StandardCharsets.UTF_8); // 发送的数据
        // 发送数据给谁
        InetAddress ip = InetAddress.getByName("127.0.0.1");
        int port = 8080;
        DatagramPacket packet = new DatagramPacket(
                data, // 发送的数据
                0, // 发送数据起始位
                data.length, //发送数据结束位
                ip, // 目标ip
                port // 目标port
        );

        for (byte b : data) {
            System.out.println(b);
        }

        // 发送数据
        socket.send(packet);

        // 关闭连接
        socket.close();
    }
}

2.2 UDP接收消息

package com.june.udp;

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

/**
 * 服务端接收消息,同样也可以发送消息
 */
public class MyServer {
    public static void main(String[] args) throws Exception{
        method1();
    }

    private static void method1() throws Exception{
        // 创建socket,由于是接收数据,ip只能有本机,就不用指定了,端口这里必须指定
        DatagramSocket socket = new DatagramSocket(8080);

        /*
            准备接收数据
         */
        byte[] data = new byte[1024];
        DatagramPacket packet = new DatagramPacket(
                data, // 接收数据byte容器
                0, // 接收数据的起始位
                data.length // 接收数据的结束位
                );

        // 开始接收数据,接收到的数据在 packet 里面
        while (true) { // 一直接收消息,不关闭socket
            socket.receive(packet); // 如果没有接收到数据就会在这里阻塞
            int length = packet.getLength(); // 数据的真实长度
            System.out.println("接收到的数据:" + new String(packet.getData(), 0, length));
        }

        // 关闭连接
//        socket.close();

    }
}

3. 下载网络资源

package com.june.url;

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

/**
 * @Author:june
 * @Date:2021/7/25 16:05
 * @version:1.0
 */
public class Mydownload {
    public static void main(String[] args) throws Exception{
        method1();
    }

    private static void method1() throws Exception{
        // 创建url
        URL url = new URL("https://i2.hdslb.com/bfs/face/83bb511365da513c55aa3d1958524f3b7db40684.jpg@96w_96h_1c_1s.jpg");

        // 打开连接
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

        // 准备下载资源
        InputStream inputStream = urlConnection.getInputStream();

        // 开始下载资源
        FileOutputStream fileOutputStream = new FileOutputStream("E:\\Project\\file\\myFile.jpg");
        int len = 0;
        byte[] bytes = new byte[1024];
        while ((len = inputStream.read(bytes)) != -1) {
            fileOutputStream.write(bytes, 0, len);
        }

        //关闭资源
        fileOutputStream.close();
        inputStream.close();

    }
}

标签:通讯,java,Socket,String,new,import,byte,socket
来源: https://blog.csdn.net/weixin_52877849/article/details/119081447

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有