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-lengthSystem.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#客户端来访问JavaSocket服务

 

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
*
*/

 

转载于:https://www.cnblogs.com/yangzhenlong/p/5163293.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375112.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 自带MD5 校验文件

http://www.iteye.com/topic/1127319 前天第一次发表博客到论坛,关于Java文件监控一文,帖子地址在:http://www.iteye.com/topic/1127281 评论的朋友很多,下载代码的朋友很不少,感谢在论坛上看我帖子的朋友,…

决策树资料汇总

2012年8月26日决策树(Decision tree)决策树是以实例为基础的归纳学习算法。它从一组无次序、无规则的元组中推理出决策树表示形式的分类规则。它采用自顶向下的递归方式,在决策树的内部结点进行属性值的比较,并根据不同的属性值从…

metasploitable2渗透测试

一、系统弱密码登录 1、在kali上执行命令行telnet 192.168.26.129 2、Login和password都输入msfadmin 3、登录成功,进入系统 4、测试如下: 二、MySQL弱密码登录: 1、在kali上执行mysql –h 192.168.26.129 –u root 2、登录成功&#…

Portainer.io:让容器管理变得更加直观

在现代软件开发和部署中,容器化技术已经变得越来越流行。Docker 是其中一种领先的容器化平台,而 Portainer.io 则是一个优秀的管理工具,使得 Docker 的使用变得更加简单和可视化。本文将介绍 Portainer.io 的基本功能和如何在 Docker 上安装和…

python开发的一些tips

1. Notepad编写python脚本 1)新建文件,编写代码 2)点击菜单栏,“语言”—>“P”—>“Python”,设置脚本为Python语言的高亮(这样保存文本的时候,Notepad也可以自动识别文件类型为.py&…

metasploitable3渗透测试

1、攻击windows服务器漏洞 用nmap对网段进行扫描nmap -sP 192.168.123 在进行IP扫描 发现Windows服务器漏洞 步骤: msfconsole---进入渗透模块

以前写的一个下载小说的工具

因为当时发现只有一个站点有。但是时时联网的要求太让人不爽。就写了一个给全下下来了。 用到了: 1. 正则表达式,分析章节和内容; 2. 线程池下载,并且对下载中的相关超时做了一些处理; 3. 文件生成与写入,注意格式问题…

数学之路-python计算实战(14)-机器视觉-图像增强(直方图均衡化)

我们来看一个灰度图像,让表示灰度出现的次数,这样图像中灰度为 的像素的出现概率是是图像中全部的灰度数, 是图像中全部的像素数, 实际上是图像的直方图,归一化到 。把 作为相应于 的累计概率函数, 定义为:是图像的…

Windows2008的安装

点击下一步 点击安装 选择第三个,点击下一步 点击下一步 点自定义安装 我在这里分两个盘并格式化 接下来就是等待安装完成即可

redhat linux7.0的安装

选择第一个 我选择中文 点击开始安装 设置root用户密码 完成如上图所示 我在网上找了一个redhat7.0镜像供大家使用 链接:https://pan.baidu.com/s/1WhG8BGZTZawDKTNlaAvzRg 提取码:uzpd

VMware虚拟机安装

创建新的虚拟机:在 VMWare 中创建虚拟机,要求设置内存大小为 1G,CPU 为 2,硬盘大小自行选择,网络连接采用 NAT 模式,其他保持默认即可 上面是安装啥系统就选啥系统 下一步 下一步 磁盘大小按自己需求来

二叉树算法:中序、后序推导先序(数组递归实现 【*模板】)

中根序列和后根序列重建二叉树 描述我们知道如何按照三种深度优先次序来周游一棵二叉树,来得到中根序列、前根序列和后根序列。反过来,如果给定二叉树的中根序列和后根序 列,或者给定中根序列和前根序列,可以重建一二叉树。本题输…

Windows主机安全加固

Windows主机安全加固 账户安全 更名administrator本地用户并禁用guest账户步骤: 点击“开始”,找到“管理工具”,点击里面的“计算机管理”,找到“本地用户和组”

JS笔记 入门第四

小测试:注意:取消所有的设定可以直接使用document.getElementById("txt").removeAttribute("style");这个是个神奇的东西.<!DOCTYPE HTML><html><head><meta http-equiv"Content-Type" Content"text/html; charsetutf…

数论神题——进击的羊角兽

数论神题 进击的羊角兽 题目描述&#xff1a; 求满足 \(ab|ab(a,b \leq n,a \neq b)\)的有序数对\((a,b)\)的个数。 solution 设\((a,b)d , (a < b \leq n)\),则$ axd , byd , ( x < y )$ \(ab|ab\) \((xy)d|xyd^2\) \(\because (xy, x)1,(xy, y)1\) \(\therefore (xy)|d…

靶场练习第一天~vulnhub靶场之Me-and-My-Girlfriend-1

兄弟们第一天打vulnhub靶场&#xff0c;我kali连靶场ip都扫不到&#xff0c;泪奔了&#xff0c;不说了开整 注意&#xff1a; vm虚拟机里面的编辑下面的虚拟机网络编辑器&#xff0c;把除了NAT模式外的模式&#xff0c;其他模式不启动。 至于为什么要这样操作&#xff0c;感觉…

靶场练习第二天~vulnhub靶场之 THE PLANETS: EARTH

前期准备&#xff1a; 靶机下载链接: https://pan.baidu.com/s/1_w8OZOPVsQaojq2rnKcdRA 提取码: gguw kali攻击机ip&#xff1a;192.168.101.10 靶机地址&#xff1a;192.168.101.101 一、信息收集 1.nmap扫描 因为kali与靶机在同一个网段下&#xff0c;使用nmap 192.168…

测试与封装5.1

我的队友是52吴舒婷&#xff0c;博客内容主要是白盒黑盒的测试数据分析 我们通过简单的四则运算来进行程序的测试与封装 我们主要完成的是事情 &#xff08;1&#xff09;封装&#xff1a;将运算要运用的方法进行封装 文件主要有三个&#xff1a;Calculate&#xff08;存放运算…

springmvc学习笔记--mybatis--使用插件自动生成实体和mapper

由于表对象在开发过程中会增删字段&#xff0c;有时候需要重新生成实体和对应的mapper&#xff0c;这时候可以通过mybatis的插件的生成。 优点是快速简洁&#xff0c;缺点同样很明显&#xff1a;覆盖。因此&#xff0c;通常是在第一次搭建框架的时候使用&#xff0c;因为开发过…

靶场练习第三天~vulnhub靶场之narak

靶机下载链接: https://pan.baidu.com/s/1GxcSL6efwd0GcbY45WsD0A 提取码: dhr5 一、信息收集 1.使用namp 192.168.101.0/24扫描该网段的地址&#xff0c;寻找靶机IP 2.直接访问192.168.101.102 3.进行目录扫描&#xff0c;dirb目录扫描工具&#xff08;kali自带的&#xff…