So easy Webservice 1.Socket建设web服务
socket 是用来进行网络通讯的,简单来说,远程机器和本地机器各建一个socket,然后通过该socket进行连接通讯
socket简单模型图:
socket的原理图:
代码实现:
1.创建socket服务端:用于处理客户端发送的请求数据
新建socket_server项目,添加SocketServer.java,然后run main方法,服务端处于等待客户端状态。
public class SocketServer { /** * 服务器端口 */ private static int port = 9999; public static void main(String[] args) { try { //1.创建ServerSocket对象,用于让客户端连接 ServerSocket serverSocket = new ServerSocket(port); //2.线程等待,直到收到客户端请求,进行处理 while(true){ System.out.println("等待客户端请求---"); Socket socket = serverSocket.accept();//收到客户端请求 //3.获取输入流对象InputStream,用于获取客户端发送的数据 InputStream in = socket.getInputStream(); byte[] b = new byte[1024]; in.read(b); String req = new String(b, 0, b.length);//从0-length System.out.println("获取客户端数据success,reqData = "+req); //4.获取输出流对象OutputStream,用于给客户端返回数据 OutputStream out = socket.getOutputStream(); //转大写后,返回给客户端 out.write(req.toUpperCase().getBytes()); //5.结束通信,关闭socket,关闭流 in.close(); out.close(); socket.close(); } } catch (UnknownHostException e) { System.out.println("---找不到服务器的端口---"); e.printStackTrace(); } catch (IOException e) { System.out.println("---通信错误---"); e.printStackTrace(); } } }
2.创建客户端
新建一个socket_client项目,添加SocketClient.java
public class SocketClient { /** * 服务器ip地址 */ private static String host = "127.0.0.1"; /** * 服务器端口 */ private static int port = 9999; public static void main(String[] args) { try { //1.创建socket对象,用于向服务端发送请求 Socket socket = new Socket(host, port); //2.获取输出流对象OutputStream,用于给服务端输出数据 OutputStream out = socket.getOutputStream(); //输入字符串 System.out.println("请输入字符串:"); Scanner input = new Scanner(System.in); String reqStr = input.next(); //输出到服务器 out.write(reqStr.getBytes()); //3.获取输入流对象InputStream,用于输入服务端返回处理后的数据 InputStream in = socket.getInputStream(); //获取服务端返回的数据 byte[] b = new byte[1024]; in.read(b);//将字节输入到b中 String respStr = new String(b, 0, b.length); System.out.println("服务端处理后的结果:"+respStr); //4.关闭socket,关闭流,结束通信 in.close(); out.close(); socket.close(); } catch (UnknownHostException e) { System.out.println("---找不到服务器的端口---"); e.printStackTrace(); } catch (IOException e) { System.out.println("---通信错误---"); e.printStackTrace(); } } }
3.启动客户端:
客户端 控制台: 请输入字符串:hello(输入后回车) 服务端处理后的结果:HELLo -------------------------------------------- 服务端 控制台: 等待客户端请求--- 获取客户端数据success,reqData = hello
测试:
1.通过C#客户端来访问Java的Socket服务
2.通过IE来访问SocketService
accept success....... 从客户端传送来的数据如下: POST / HTTP/1.1 Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */* Accept-Language: zh-CN User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0) Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate Host: 127.0.0.1:9999
Content-Length: 10
Connection: Keep-Alive
Cache-Control: no-cache
word=hello
测试结果:
1.1: 不同的语言支持Socket通信吗? 支持(经测试,上面的socketserver端程序,使用c#,web浏览器也可以访问)
1.2: 不同的协议支持Socket通信吗? web程序可以调用socket请求,但是由于协议不同,因此在处理的时候要过滤http的协议格式,返回的时候还需要添加 http返回的格式
1.3: 如果参数多: 可维护性就比较低
1.4: Socket服务有利于推广吗? 不利
总结:
* 服务端流程:
* 1.创建ServerSocket对象,用于让客户端连接
* 2.获取socket对象,线程等待,直到收到客户端请求
* 3.获取输入流对象InputStream,用于获取客户端发送的数据
* 4.获取输出流对象OutputStream,用于给客户端返回数据
* 5.结束通信,关闭socket,关闭流
*
* socket和webservice比较,缺点:
* 1.Socket服务不利于推广(如果让别人知道你的Socket服务)
* 2.Socket处于传输层, 有可能无法穿越防火墙
* 3.Socket本身处于传输层,要处理应用层的服务要解析HTTP协议比较麻烦,但是现在我们的应用都是基于web的, web中的数据传输就需要HTTP协议
* 4.即使定义了格式. 后面如果格式改变则客户端格式都需要同步变化维护困难
/**
* 客户端流程:
* 1.创建socket对象,用于向服务端发送请求
* 2.获取输出流对象OutputStream,用于给服务端输出数据
* 3.获取输入流对象InputStream,用于接受服务端返回处理后的数据
* 4.结束通信,关闭socket,关闭流
* @author mlxs
*
*/