WebService学习之旅(1):基于Socket通信

时间:2022-04-13 13:43:28

WebService,顾名思义,就是Web服务,表示应用程序之间的远程调用。调用应该是跨语言的。

首先回顾一下,应用程序调用另一应用程序的方式:

  • Socket:传输层协议。不支持http协议
  • HTTP: 传输层协议。传输的只能是字符串,参数多则不利于维护。
  • WebService:可以在一个应用程序调用另一应用程序的Java Bean

一、基于Socket调用

客户端和服务器是不能直接通信的,这里借助于Socket通信。通信过程如下图:

WebService学习之旅(1):基于Socket通信

1.socket通信示例

接着分别创建两个Java Project,模拟socket通信,项目结构如下图:

WebService学习之旅(1):基于Socket通信

代码清单:

SocketClient.java

/**
* Socket客户端,用于发送请求
*/
public class SocketClient {

public static void main(String[] args) throws IOException {

Scanner scanner = new Scanner(System.in);

Socket socket = new Socket("127.0.0.1", 8088);

System.out.println("请输入要转化的字母:");
String data = scanner.next();

// 获取输出流,发送数据
OutputStream out = socket.getOutputStream();
out.write(data.getBytes());

System.out.println("等待服务器返回数据~~~");

InputStream in = socket.getInputStream();
byte[] b = new byte[1024];
int len = in.read(b);
System.out.println("返回数据为:" + new String(b, 0, len));

// 释放资源
in.close();
out.close();
socket.close();
}

}

SocketServer.java:

/**
* Socket服务端,用于接收客户端请求,将小写转换为大写
*/
public class SocketServer {

public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8088);

while (true) {
System.out.println("等待客户端请求~~~");

Socket socket = serverSocket.accept();
System.out.println("--连接成功--");

// 通过输入流获取数据
InputStream in = socket.getInputStream();
byte[] bytes = new byte[1024];
int len = in.read(bytes);
String data = new String(bytes, 0, len);
System.out.println("客户端请求数据为:" + data);

OutputStream out = socket.getOutputStream();
out.write(data.toUpperCase().getBytes());

// 释放资源
out.close();
in.close();
}
}
}

接下来,我们首先启动服务端:
WebService学习之旅(1):基于Socket通信

启动客户端,发送请求:
WebService学习之旅(1):基于Socket通信

2.web程序调用socket

接下来在MyClient中添加webapp模块:
WebService学习之旅(1):基于Socket通信
勾选Web Application:
WebService学习之旅(1):基于Socket通信
在web目录下添加index.jsp页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title></title>
</head>
<body>
<form action="http://127.0.0.1:8088" method="get">
姓名:<input type="text" name="username"><br>

密码:<input type="text" name="password"><br>
<input type="submit" value="提交">
</form>
</body>
</html>

将它发布到tomcat上,通过浏览器访问(需要先启动服务端哦):
WebService学习之旅(1):基于Socket通信

服务器端输出:
WebService学习之旅(1):基于Socket通信

通过上面的对比,我们发现并没有返回response格式,而只是将结果转换成了大写。web程序可以调用socket请求,但是由于协议不同,在处理的时候要过滤http的协议格式,返回的时候还需要添加http返回的格式。