java创建socket_基于Socket创建Web服务

基于Socket创建Web服务

为什么要使用Socket****呢,****我们来看下图

689953f01918703175583602d9e9dbc9.png

Socket原理图回顾:

f075f7c03f3b3ce0862fb1f5061a6625.png

-——————编写SocketService,完成字母小写转大写功能—————————–

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();

}

}

为了防止服务端发生异常之后关闭socket,正确的代码如下:

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

// 1:建立服务器端的tcp socket服务,必须监听一个端口

ServerSocket ss = new ServerSocket(24992);

// 2: 通过服务器端的socket对象的accept方法获取连接上的客户端对象

Socket s = null;

// 3:获取客户端的数据

while (true) {

// 接受Socket服务,如果有,没有则堵塞,等待

s = ss.accept();

System.out.println("accept success.......");

try {

// 从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());

} catch (Exception e) {

System.out.println("error");

} finally {

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

通过IE来访问SocketService

服务端:

accept success.......

从客户端传送来的数据如下:

GET /WWWWW HTTP/1.1

Host: localhost:9999

User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:46.0) Gecko/20100101 Firefox/46.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3

Accept-Encoding: gzip, deflate

Cookie: _ga=GA1.1.1127292809.1501852337

Connection: keep-alive

Cache-Control: max-age=0

客户端:

fbc6957c4e3bab5c7f819b0de1fd170f.png

HTTP协议格式简单回顾:

Http请求由三部分组成,分别是:请求行、消息报头、请求正文

请求行:

以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:Method Request-URI HTTP-Version

消息报头:

Accept: Accept请求报头域用于指定客户端接受哪些类型的信息

Host:(发送请求时,该报头域是必需的)请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的 默认80则省略

Content-Type报头域中所引用的媒体类型,必须采用相应的解码机制

Content-Type:text/html;charset=UTF-8

HTTP响应也是由三个部分组成,分别是:状态行、消息报头、响应正文

HTTP-Version Status-Code Reason-Phrase

其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。

HTTP/1.1 200 OK

问题思考

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

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

https://www.cnblogs.com/qlqwjy/category/1035586.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值