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#客户端来访问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
*
*/

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

So easy Webservice 1.Socket建设web服务相关推荐

  1. webservice接口怎么将xml作为参数传递呢_Rhapsody集成引擎通讯点(接口)出入参详解web服务篇...

    Rhapsody引擎可便捷的集成不同的医疗信息系统,可提供安全的连接.可靠的消息传输和高性能的数据处理等功能.Rhapsody引擎是整个集成平台的核心部分,是可快捷提供服务的关键所在.它可实现数据的内 ...

  2. python socket监听端口_Python 用socket模块实现检测端口和检测web服务

    检测端口 check_tcp_port.py #!/usr/bin/env python import socket import re import sys def check_server(add ...

  3. C#动态调用web服务 远程调用技术WebService

    一.课程介绍 一位伟大的讲师曾经说过一句话:事物存在即合理!意思就是说:任何存在的事物都有其存在的原因,存在的一切事物都可以找到其存在的理由,我们应当把焦点放在因果关联的本质上.所以在本次分享课开课之 ...

  4. 《Webservice的应用与开发》学习笔记 ·001【Web服务、XML文档】

    注:前言.目录见 https://blog.csdn.net/qq_44220418/article/details/108428971 文章目录 一.Web服务 1.特点 2.定义 二.XML文档 ...

  5. WebService(腾讯QQ在线状态 WEB 服务)

    今天介绍一个简单有意思的小技术: 我们的目的呢就是通过输入QQ号码(String)检测QQ在线状态 我们首先打开http://www.webxml.com.cn/zh_cn/web_services. ...

  6. 使用WebService技术获取第三方数据实现繁体字转换 WEB 服务

    Web Service(WEB服务) 能够快捷和方便地综合并结合各种系统.商务和任何应用平台.新出现的 Web Services 标准: SOAP.WSDL 和 UDDI 能够使任何系统和系统之间的应 ...

  7. WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发

    继WSE3.0构建Web服务安全(1):WSE3.0安全机制与实例开发和WSE3.0构建Web服务安全(2):非对称加密.公钥.密钥.证书.签名的区别和联系以及X.509 证书的获得和管理之后,今天我 ...

  8. 如何使用Retrofit,OkHttp,Gson,Glide和Coroutines处理RESTful Web服务

    Kriptofolio应用程序系列-第5部分 (Kriptofolio app series - Part 5) These days almost every Android app connect ...

  9. java web 教程_Java Web服务教程

    java web 教程 Welcome to the Java Web Services Tutorial. Here we will learn about web services, useful ...

最新文章

  1. Sql Server中判断表或者数据库是否存在
  2. 网络推广外包——网络推广外包专员升级用户使用体验有方法
  3. Android SO逆向1-ARM介绍
  4. 牛客网_PAT乙级1007_A除以B (20)
  5. c语言main函数的参数argc,argv说明
  6. 设计模式心得:三——命令模式
  7. 解决nginx下connect() to 127.0.0.1:3000 failed
  8. 浏览器关闭 session并不会被干掉
  9. Android UI自定义Spinner下拉框(用popuwindow实现)-转
  10. Calibre修改保存电子书为中文
  11. ASP.NET基础教程-Server对象
  12. 软件设计师-2.程序设计语言
  13. BioGRID:蛋白质相互作用数据库
  14. easyui动态修改required
  15. oracle修改表字段名备注_ORACLE 动态SQL 给每个字段添加中文备注
  16. DevExpress 控件中文化教程详解(内含下载官网中文化包和自定义修改中文化包制作教程)
  17. 【MySQL从删库到跑路】-1-安装MySQL-5.7
  18. 源码分析 --- MapReduce如何确定任务的SplitSize、Splits、Map、Reduce
  19. 认识和使用热插拔的正确姿势-续
  20. Java excel poi 读取已有文件 ,动态插入一列数据

热门文章

  1. CentOS上安装MyCat-MySQL
  2. Python黑魔法,一行实现并行化
  3. stage3d 骨骼优化
  4. Netty writeAndFlush() 流程与异步
  5. domino从Excel导入数据
  6. 【转】SQL Server中行列转换 Pivot UnPivot
  7. C#中使用多线程访问Winform问题解决方案
  8. java多线程 cpu分配_java多线程总结(转载)
  9. mysql中两次排序_MySQL中的两种排序方式: index和filesort
  10. 如何快速实现 Wordpress 博客域名更换?