ServerSocket服务器端代码如下:

public static void main(String[] args) throws IOException {
// 1:建立服务器端的tcp socket服务,必须监听一个端口
ServerSocket ss = new ServerSocket(9999);
// 2: 通过服务器端的socket对象的accept方法获取连接上的客户端对象
Socket s = null;
// 3:获取客户端的数据
while (true) {
// 接受Socket服务,如果有,没有则堵塞,等待
s = ss.accept();
System.out.println("accept success.......");
// 从Socekt输入流中获取客户端发送过来的输出流
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
String str = new String(buf, 0, len);
System.out.println("从客户端传送来的数据如下:");
System.out.println(str);
// 通过服务器端Socket输出流,写数据,会传送到客户端Socket输入流中
OutputStream out = s.getOutputStream();
// 把字母转化为大写
out.write(str.toUpperCase().getBytes());
s.close();
}
}

通过Java客户端访问SocketService服务

public static void main(String[] args) throws Exception {
Scanner input=new Scanner(System.in);
// 1: 创建一个基于TCP协议的socket服务,在建立对象时,要指定连接服务器和端口号
Socket s=new Socket("127.0.0.1",9999);
// 2: 通过建立的Socket对象获取Socket中的输出流,的调用getOutStream方法
OutputStream out=s.getOutputStream();
System.out.println("请输入要转化的字母,或者单词!");
// 3: 写入到Socket输出流中
String word=input.next();
out.write(word.getBytes());
// 4: 通过建立的Socket对象获取Socket中的输入流,输入流会接受来自服务器端数据
InputStream in=s.getInputStream();
byte[] buf=new byte[1024];
// 5: 获取输入字节流的数据,注意此方法是堵塞的,如果没有获取数据会一直等待
int len=in.read(buf);
String str=new String(buf,0,len);
System.out.println("服务返回来的结果如下:");
System.out.println(str);
// 关闭Socket
s.close();
} }

注意先启动服务器端在启动客户端:否则会出现连接异常

服务器端显示结果如下:

accept success.......
从客户端传送来的数据如下:
hello

客户端端显示结果如下:

请输入要转化的字母,或者单词!
hello
服务返回来的结果如下:
HELLO

问题思考

目前我们用Java语言创建一个Socket服务器端, 然用 Java Socket访问没有任何问题. 用C# Socket客户端访问也没有任何问题(说明不同过的语言编写的程序可以通过Socket通信) 用IE访问Socket服务端同样也没问题,IE本身是用VC++语言开发的

但是, 如果我们的服务复杂一点呢. 例如 我过去的单词 操作1:小写转大写,2:大写转小写 3:英文转中文…… 而且我们发现IE在发送请求的时候不但传输的数据还传输了协议. 而且目前我们的很多应用都是基于Web开发的. 如果我们处理Web的请求. 那么还需要从发送过来的协议中获取数据.所以最好的解决办法就是规定格式, 客户端统一格式发送,只要格式统一,服务器端就从指定的格式中获取数据就OK了

“Socket+规范格式”创建Web服务

服务器端代码修改后如下:

public static void main(String[] args) throws Exception {
// 1:建立服务器端的tcp socket服务,必须监听一个端口
ServerSocket serverSocket = new ServerSocket(7777);
Socket socket = null;
while (true) {
// 接受Socket服务,如果有,没有则堵塞,等待
socket = serverSocket.accept();
// 从Socekt输入流中获取客户端发送过来的输出流
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int size = inputStream.read(bytes);
String word=new String(bytes, 0, size);
System.out.println("字节数为:" + size + "内容为:" + word);
/*--根据不同的类型选择不同的服务,格式是由服务器端制定 type=int,word=string--*/
String[] content=word.split(",");
// 获取服务的类型
int type=Integer.parseInt(content[0].split("=")[1]);
// 获取处理服务的数据
String val=content[1].split("=")[1];
String result=wordService(val, type); /*-------------------------------------------------------*/
OutputStream out = socket.getOutputStream();
System.out.println("返回的结果如下:" + result);
out.write(result.getBytes());
socket.close();
}
}
// type=1 小写转大写 type=2大写转小写
public static String wordService(String val,int type){
return type==1?val.toUpperCase():val.toLowerCase();
}

Socket客户端访问SocektFormatService服务端代码如下:

public static void main(String[] args) throws Exception {
// 1: 创建一个基于TCP协议的socket服务,在建立对象时,要指定连接服务器和端口号
Socket s=new Socket("127.0.0.1",9999);
// 2: 通过建立的Socket对象获取Socket中的输出流,的调用getOutStream方法
OutputStream out=s.getOutputStream();
// out.write("type=2,word=HELLO".getBytes());
out.write("type=1,word=hello".getBytes());
// 4: 通过建立的Socket对象获取Socket中的输入流,输入流会接受来自服务器端数据
InputStream in=s.getInputStream();
byte[] buf=new byte[1024];
// 5: 获取输入字节流的数据,注意此方法是堵塞的,如果没有获取数据会一直等待
int len=in.read(buf);
String str=new String(buf,0,len);
System.out.println("服务返回来的结果如下:");
System.out.println(str);
// 关闭Socket
s.close();
}

IE调用SocektFormatService服务:

如果要让IE调用则 Socket服务端首先要从传输过来的HTTP协议中获取传输过来的信息(去除请求行、消息报头)然后在进行服务的处理.因为Socket是基于TCP协议的 而IE是基于HTTP协议的,不同协议格式不一样. 所以处理起来比较麻烦,此处省略

解决方案一的缺点:

  1. Socket服务不利于推广(如果让别人知道你的Socket服务)
  2. Socket处于传输层, 有可能无法穿越防火墙
  3. Socket本身处于传输层,要处理应用层的服务要解析HTTP协议比较麻烦,但是现在我们的应用都是基于web的, web中的数据传输就需要HTTP协议
  4. 即使定义了格式. 后面如果格式改变则客户端格式都需要同步变化维护困难

Web Service 实例基于Socket创建Web服务的更多相关文章

  1. 基于Socket创建Web服务

    基于Socket创建Web服务 为什么要使用Socket呢,我们来看下图

  2. 【转】基于CXF Java 搭建Web Service (Restful Web Service与基于SOAP的Web Service混合方案)

    转载:http://www.cnblogs.com/windwithlife/archive/2013/03/03/2942157.html 一,选择一个合适的,Web开发环境: 我选择的是Eclip ...

  3. ASP.NET Web Api构建基于REST风格的服务实战系列教程

    使用ASP.NET Web Api构建基于REST风格的服务实战系列教程[十]——使用CacheCow和ETag缓存资源 系列导航地址http://www.cnblogs.com/fzrain/p/3 ...

  4. 使用Eclipse自带Web Service插件(Axis1.4)生成Web Service服务端/客户端

    创建一个名字为math的Java web工程,并将WSDL文件拷入该工程中 将Axis所需的jar包拷贝至WebRoot\WEB-INF\lib目录下,这些jar包会自动导入math工程中 一,生成W ...

  5. vivo web service:亿万级规模web服务引擎架构

    本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/ovOS0l9U5svlUMfZoYFU9Q vivo web service是开发团队围绕奇点 ...

  6. 学习参考《Flask Web开发:基于Python的Web应用开发实战(第2版)》中文PDF+源代码

    在学习python Web开发时,我们会选择使用Django.flask等框架. 在学习flask时,推荐学习看看<Flask Web开发:基于Python的Web应用开发实战(第2版)> ...

  7. [转]Calling Web Service Functions Asynchronously from a Web Page 异步调用WebServices

    本文转自:http://www.codeproject.com/Articles/70441/Calling-Web-Service-Functions-Asynchronously-from Ove ...

  8. C#/.NET基于Topshelf创建Windows服务的守护程序作为服务启动的客户端桌面程序不显示UI界面的问题分析和解决方案

    本文首发于:码友网--一个专注.NET/.NET Core开发的编程爱好者社区. 文章目录 C#/.NET基于Topshelf创建Windows服务的系列文章目录: C#/.NET基于Topshelf ...

  9. web service实例

    一.准备工作(以下为本实例使用工具) 1.MyEclipse10.7.1 2.JDK 1.6.0_22 二.创建服务端 1.创建[Web Service Project],命名为[TheService ...

随机推荐

  1. 【2017-07-03】CSS实现父级div透明,子集不透明。

    父级背景色 background: rgba(0, 0, 0, 0.5);

  2. 使用phpstudy搭建的外网网站 运行很慢 解决办法

    将连接数据库的配置文件 localhost  修改为127.0.0.1 PHP5.3以上,如果是链接localhost,会检测是IPV4还是IPV6,所以会比较慢.解决办法是:链接数据的时候,不要填写 ...

  3. - The superclass "javax.servlet.http.HttpServlet" was not found on the Java

    网上有很多解决方法,如这种 下面是具体的解决方法:1.右击web工程->属性或Build Path->Java Build Path->Libraries-> Add Libr ...

  4. linux centos ftp服务器搭建

    原文参考 步骤一:构建vsftpd服务器 1)使用yum安装vsftpd软件包yum -y install vsftpdrpm -q vsftpd #确认安装成功,显示vsftpd对应版本 vsftp ...

  5. 遥想大肠包小肠----python装饰器乱弹

    说起装饰器就tm蛋疼,在老男孩学习python装饰器,结果第二天默写,全错了,一道题抄十遍,共计二十遍. 要是装饰器是一人,我非要约他在必图拳馆来一场...... 下面容我展示一下默写二十遍的成果 语 ...

  6. 用IE滤镜实现多种常用的CSS3效果

    CSS3是当下非常火的一个话题之一,很多浏览器都已经开始支持这一特性,然后IE这个拥有庞大用户群体的平台,却无法提供这样的支持,即便是IE9发布,也无法改变这一事实,然而,幸运的是,IE并非在这方面毫 ...

  7. Educational Codeforces Round 74 (Rated for Div. 2) C. Standard Free2play

    链接: https://codeforces.com/contest/1238/problem/C 题意: You are playing a game where your character sh ...

  8. delegate:动态绑定js事件

    $('.videomodule').delegate("span", "click", function() { var i = $(this).index() ...

  9. sql server 存储过程的详解

    SqlServer存储过程详解 1.创建存储过程的基本语法模板: if (exists (select * from sys.objects where name = 'pro_name')) dro ...

  10. 配置apt源

    vim /etc/apt/source.list 配置完成后执行 apt update apt upgrade 配置完源之后,就可以在源中所有想要的包 apt search xxx 本地自带的源配目录 ...