java使用Socket调用接口

本文详细介绍了如何使用Java进行Socket通信,包括创建Socket连接、发送和接收数据,以及资源的关闭。示例中展示了XML数据的发送和接收,强调了客户端在发送完数据后通知服务端的重要性,以避免读取超时。同时,展示了不同方式(如使用PrintWriter和DataOutputStream)进行数据传输,并提供了服务端接收和处理请求的简单示例。
摘要由CSDN通过智能技术生成
package com.jt.test;

import lombok.extern.slf4j.Slf4j;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

/**
 * @Author: ldj
 * @Date: 2022/02/09/15:31
 * @Description: Socket测试类
 */

@Slf4j
public class SocketDemo {

    public static String doSocket(String ip, int port) {

        String response = null;
        Socket socket = null;
        InputStreamReader inputStreamReader = null;
        BufferedReader bufferedReader = null;
        PrintWriter printWriter = null;

        String sendXml = "<Message>" +
                "        <School>" +
                "               <SchoolName>草帽中学</SchoolName>" +
                "        </School>" +
                "        <Class>" +
                "               <ClassName>高三7班</ClassName>" +
                "               <Level>" +
                "                    <A>1</A>" +
                "                    <B>2</B>" +
                "               </Level>" +
                "               <Person>" +
                "                       <Teacher>" +
                "                              <Name>LuLu</Name>" +
                "                              <Gender>女</Gender>" +
                "                              <Age>23</Age>" +
                "                       </Teacher>" +
                "                       <Student>" +
                "                              <Name>张三</Name>" +
                "                              <Gender>男</Gender>" +
                "                              <Age>16</Age>" +
                "                      </Student>" +
                "                       <Student>" +
                "                              <Name>李四</Name>" +
                "                              <Gender>男</Gender>" +
                "                              <Age>17</Age>" +
                "                      </Student>" +
                "                       <Student>" +
                "                              <Name>莉莉</Name>" +
                "                              <Gender>女</Gender>" +
                "                              <Age>16</Age>" +
                "                      </Student>" +
                "               </Person>" +
                "        </Class>" +
                "</Message>";

        try {
            //创建socket连接
            socket = new Socket(ip, port);

            //打印输出流(客户端发送数据给服务端)
            printWriter = new PrintWriter(socket.getOutputStream());
            printWriter.print(sendXml);
            printWriter.flush();

            /**
             * 告诉服务端消息已经发送完成,别等了,快把数据返回来。
             * 要不然客户端出现读取超时,因为服务端出现堵塞读取客户端的请求消息,
             * 没有执行返回响应数据,客户端自然接收不到数据,出现读取超时read time out
             */
            socket.shutdownOutput();

            //读取输入流(服务端回传数据给客户端)
            inputStreamReader = new InputStreamReader(socket.getInputStream());
            bufferedReader = new BufferedReader(inputStreamReader);
            String temp = "";
            StringBuilder stringBuilder = new StringBuilder();

            while ((temp = bufferedReader.readLine()) != null) {
                stringBuilder.append(temp + "\r\n");
            }

            response = stringBuilder.toString();
            log.info("服务端返回消息:{}", response);

        } catch (Exception e) {

            log.error("socket call failed");

        } finally {
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (inputStreamReader != null) {
                try {
                    inputStreamReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (printWriter != null) {
                printWriter.close();
            }

            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return response;
    }
}

续更。。。

package com.jt.test;

import lombok.extern.slf4j.Slf4j;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.Socket;

/**
 * @Author: ldj
 * @Date: 2022/03/08/16:10
 * @Description:
 */
@Slf4j
public class SocketDemo2 {
    public static void main(String[] args) {
        String requestMsg = "Hello World";
        doSocket("192.168.176.112", "8080", requestMsg);
    }

    public static String doSocket(String ip, String port, String requestMsg) {
        String responseMsg = null;
        PrintWriter printWriter;
        InputStreamReader inputStreamReader;
        BufferedReader bufferedReader;

        //创建socket对象
        Socket socket = new Socket();
        InetSocketAddress inetSocketAddress = new InetSocketAddress(ip, Integer.parseInt(port));

        //根据IP和端口连接服务端,并设置连接超时和读取超时
        try {
            socket.connect(inetSocketAddress, 6000);
            socket.setSoTimeout(6000);

            //客户端发送请求消息
            printWriter = new PrintWriter(socket.getOutputStream());
            printWriter.print(requestMsg);
            printWriter.flush();

            //告知服务端客户端已发送消息完毕,while循环停止读取请求消息并回传数据
            socket.shutdownOutput();

            //接收服务端返回的消息
            inputStreamReader = new InputStreamReader(socket.getInputStream());
            bufferedReader = new BufferedReader(inputStreamReader);
            String temp = "";
            StringBuilder stringBuilder = new StringBuilder();

            while ((temp = bufferedReader.readLine()) != null) {
                stringBuilder.append(temp + "\r\n");
            }

            responseMsg = stringBuilder.toString();
            log.info("服务端返回消息:{}", responseMsg);

        } catch (Exception e) {
            log.error("socket call failed");
        } finally {
        }
        return responseMsg;
    }

    //释放资源
    public static void closeSocket(Socket socket, BufferedReader bufferedReader, InputStreamReader inputStreamReader, PrintWriter printWriter) {
        if (bufferedReader != null) {
            try {
                bufferedReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        if (inputStreamReader != null) {
            try {
                inputStreamReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        if (printWriter != null) {
            printWriter.close();
        }

        if (socket != null) {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

续更。。。

package com.jt.test;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.io.*;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

/**
 * @Author: ldj
 * @Date: 2022/03/08/16:43
 * @Description: 只要资源实现类实现了Closeable或AutoCloseable接口,就可以自动关闭
 * 1.DataOutputStream extends FilterOutputStream
 *   2.FilterOutputStream extends OutputStream
 *      3.OutputStream implements Closeable
 */
@Slf4j
public class SocketDemo3 {
    public static void main(String[] args) {
        String requestMsg = "Hello World";
        doSocket("192.168.176.112", "8080", requestMsg);
    }

    public static String doSocket(String ip, String port, String requestMsg) {
        //创建socket对象
        Socket socket = new Socket();
        InetSocketAddress inetSocketAddress = new InetSocketAddress(ip, Integer.parseInt(port));

        //根据IP和端口连接服务端,并设置连接超时和读取超时
        try {
            socket.connect(inetSocketAddress, 6000);
            socket.setSoTimeout(6000);

            //客户端发送请求消息
            byte[] outBytes = requestMsg.getBytes(StandardCharsets.UTF_8);
            DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
            dataOutputStream.write(outBytes);
            dataOutputStream.flush();
            //告知服务端客户端已发送消息完毕,while循环停止读取请求消息并回传数据
            socket.shutdownOutput();

            //接收服务端返回的消息
            byte[] inBytes = new byte[1024];
            ByteArrayOutputStream result = new ByteArrayOutputStream();
            DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());

            int len = 0;
            while ((len = dataInputStream.read(inBytes)) != -1) {
                result.write(inBytes, 0, len);
            }
            log.info("服务端返回消息:{}", result.toString());
            return result.toString(String.valueOf(StandardCharsets.UTF_8));

        } catch (Exception e) {
            log.error("socket call failed");

        } finally {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return StringUtils.EMPTY;
    }

}

续更:服务端

package cn.com.paic.server;

import cn.com.paic.utils.XmlUtil;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * User: ldj
 * Date: 2021/11/14
 * Time: 22:57
 * Description: 服务端
 */
public class Server {
    public static void main(String[] args) {
        try {
            //创建服务端
            ServerSocket serverSocket = new ServerSocket(8888);

            System.out.println("----------------服务端执行,开始监听请求----------------");
            //接受socket请求
            Socket socket = serverSocket.accept();
            //获取输入流
            InputStream inputStream = socket.getInputStream();
            //输入流转换
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            //获取请求内容
            String xml;
            while ((xml = bufferedReader.readLine()) != null) {
                //将xml文件格式化并打印出来
                String fxml = XmlUtil.formatXML(xml);
                System.out.println("我是服务端接受到客户端的消息:");
                System.out.println(fxml);
            }

            //关闭资源
            socket.shutdownInput();
            bufferedReader.close();
            inputStream.close();
            socket.close();
            serverSocket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值