Java Socket套接字、B/S与C/S

java网络编程

socket前的知识储备

C/S架构与B/S架构

项目架构主要分为C/S架构和B/S架构

C/S架构与B/S架构的区别

1.桌面应用程序都是采取CS架构

2.企业级应用都采取BS架构

C/S架构:

C:Client 客户端

S:Server 服务器

C/S架构的缺点:1.每个用户都需要在桌面上安装客户端才可以使用

​ 2.经常需要客户端进行更新,维护成本大

B/S架构:

B:Browser 浏览器

S:Server 服务器

B/S架构相对于C/S架构的优势:1.用户只需要有浏览器就可以访问

​ 2.用户不需要更新

传输协议:

TCP协议(Transmission Control Protocol 传输控制协议):

相当于打电话,基于面向连接的、安全、基于io流传输、占用资源多、开销大、效率低
3次握手:1.请求 2.回应 3.传输
数据切块,发出去,保证收到了才发下一个

UDP协议(User Datagram Protocol 用户数据报协议):

相当于写信

非面向连接的,只管发送,不安全、开销小、效率高,大小有限制,一般不超过60k,基于字节数组

数据切块,发出去,继续发下一个,不管有没有收到,我们常说的丢包了,就是这个导致的,UDP协议更具有即时性,我们看的网络直播,网络游戏,就是这样

Socket

Socket简介

java.net.Socket 套接字(电话,网线)

Socket里面封装了TCP协议传输数据的细节,使得我们可以通过两条流的读写完成与远端计算机的数据交互

socket通常称作 “套接字”,用于描述IP地址和端口,是一个通信链的句柄。
在Internet上的主机一般运行了多个服务软件,同时提供几种服务。
每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。
应用程序通常通过”套接字“向网络发出请求或者应答网络请求。

Socket和ServerSocket类位 java.net 包中
ServerSocket用于服务端,Socket是建立网络连接时使用的。
在连接成功时,应用程序两端都会产生一 个Socket实例,操作这个实例,完成所需的会话。

实例化Socket的过程就是连接服务端的过程
参数1:服务端的IP地址
参数2:服务端程序打开的端口
我们通过IP考验找到网络上的服务端所在计算机
通过端口号可以找到该计算机上运行的服务端应用程序,从而建立连接

ps.
ip地址:找到计算机地址(类似于楼的地址),localhost表示自己
端口号:找到打开的应用程序(类似于楼里面的每一户)

socket = new Socket("localhost",8088);

Socket常用方法

通过Socket获取本地的地址以及端口号
int getLocalPort() 该方法用于获取本地使用的端1号
InetAddress getLocalAddress() 该方法用于获取套接字绑定的本地地址

使用InetAddress获取本地的地址方法
String getCanonicalHostName() 获取此IP地址的完全限定域名。
String getHostAddress() 返回IP地址字符串(以文本表现形式。

通过Socket获取远端的地址以及端口号
int getPort() 该方法用于获取远端使用的端口号
InetAddress getInetAddress() 该方法用于获取套接字绑定的远端地址

通过Socket获取输入流与输出流,这两个方法是使用Socket通讯的关键方法

InputStream getInputStream() 该方法用于返回此套接字的输入流。
OutputStream getOutputStream() 该方法用于返回此套接字的输出流。

注意:当使用Socket进行通讯完毕后,要关闭Socket以释放系统资源

void close() 关闭此套接字。
当关闭了该套接字后也会同时关闭由此获取的输入流与输出流

Socket通信模型(Client客户端与Server服务端)

Server端ServerSocket监听

java.net.SeverSocke是运行于服务端应用程序中。
通常创建ServerSocket需要指定服务端口号,之后监听Socket的连接

实例化ServerSocket时要指定申请的服务端口
如果该端口被系统的其他程序使用时会抛出异常

System.out.println("正在启动服务端......");
server = new ServerSocket(8088);
System.out.println("服务端启动完毕 (づ ̄3 ̄)づ╭❤~");

Socket accept()
该方法是一个阻塞方法,调用后就“卡住了”,
此时开始等待客户端的连接,一旦一个客户端建立连接
此时该方法会立即返回一个Socket实例,通过这个Socket就可以与该客户端交互了

System.out.println("等待客户端连接......");
Socket socket = server.accept();
System.out.println("一个客户端连接了( • ̀ω•́ )✧");

Client端Socket连接

当服务端创建ServerSocket并通过accept()方法侦听后
我们就可以通过在客户端应用程序中创建Socket来向服务端发起连接

需要注意的是,创建Socket的同时就发起连接,若连接异常会抛出异常。

//第一个参数为服务器的IP地址,第二个参数为端口号
System.out.println("正在连接服务端......");
socket = new Socket("176.217.5.48",8088);
System.out.println("已连接服务端 o(=・ω・=)o");

C-S端通信模型

[外链图片转存失败(img-j0hBSrJl-1564751410052)(C:\Users\Tedu\AppData\Roaming\Typora\typora-user-images\1564747584278.png)]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值