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();
}
}
}