Socket/Socket通信模型和c/s和b/s区别

目录

Socket概述

Socket整体流程

ServerSocket类

Socket通信模型

端口扫描  

客户端Socket的构造器

简单的Client/Server程序

 C/S架构的基本特征:

服务器端套路 

客户端套路

一般的编程实现方式

 c/s和b/s区别


Socket概述

Socket 套接字,就是两台主机之间逻辑连接的端点。 TPC 协议是传输层协议,主要解决数据如何在网络中传输,而HTTP 是应用层协议,主要解决如何包装数据。 Socket 本质上就是一组接口,是对 TCP/IP 协议的封装和应用( 程序员层面上 )

Socket整体流程

Socket 编程主要涉及到客户端和服务端两个方面,首先是在服务器端创建一个服务器套接字
ServerSocket ,并把它附加到一个端口上,服务器从这个端口监听连接。端口号的范围是 0 65536 ,但是0 1024 是为特权服务保留的端口号,我们可以选择任意一个当前没有被其他进程使用的端口。
客户端请求与服务器进行连接的时候,根据服务器的域名或者IP 地址,加上端口号,打开一个套接字。
当服务器接受连接后,服务器和客户端之间的通信就像输入输出流一样进行操作。

ServerSocket

Java.net 包中的 ServerSocket 类用于表示服务器套接字,其主要功能是监听客户端的请求,然后将客户端的请求连接存入队列中,默认请求队列大小是50
构造方法主要有以下几种形式:
  • ServerSocket(): 创建非绑定服务器套接字。
  • ServerSocket(int port) : 创建绑定到特定端口的服务器套接字。 Port 的取值范围为 0-65535 之间,0表示使用任意未占用端口,建议使用的端口号大于 1024 。如果端口已经被占用则会 BindException
  • ServerSocket(int port,int backlog):利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。
  • ServerSocket(int port,int backlog,InetAdress bindAddress):使用指定的端口、监听 backlog 和要绑定到本地IP 地址创建服务器,适用于计算机有多个网卡、多个 IP 的情景

Socket通信模型

​​​​​​​

 

端口扫描  

//利用的是ServerSocket在创建时,如果端口已经被占用,则报异常 
for(int i=0;i<=65535;i++) { //端口号0表示使用自由端口,实际上是不能建立连接的 
try {
    ServerSocket ss=new ServerSocket(i); 
    ss.close(); //finally 
} catch (Exception e) { 
System.out.println("端口"+i+"已经被占用"); 
    } 
}
cmd命令查看端口使用情况 netstat -an
  •  LISTENING是指开放着的,等待连接的
  • ESTABLISHED 是正在连接
  • CLOSE_WAIT、 TIME_WAIT SYN_SENT 是三次握手四次挥手过程中的某些状态
开放端口包括三种:
  • 0.0.0.0:端口号
  • 127.0.0.1:端口号
  • 主机ip:端口号
区别是 0.0.0.0 和主机 ip 后面跟的端口号是对外部网络开放的,是可以通过服务域名、 ip 可以访问的端 口,而127.0.0.1 的端口则是只供本机访问的端口。

客户端Socket的构造器

Socket(InetAddress address, int port); 创建远程连接到指定服务器
Socket(String host, int prot); 在客户端构建 Socket 对象,如果构建成功则获取对象,否则
ConnectException 。参数 1 为链接主机的名称,也可以使用 InetAddress 表示 IP 地址;参数 2 为链接服务 器的监听端口号,要求服务器已经打开的链接端口
Socket(String host, int port, InetAddress localAddr, int localPort)
Socket(InetAddressaddress, int port, InetAddress localAddr, int localPort)
//java.net.ConnectException: Connection refused: connect 
Socket socket=new Socket("127.0.0.1",9999); //cmd命令netstat -an | findstr "9999"
System.out.println(socket);

简单的Client/Server程序

C/S 架构全称为客户端 / 服务器体系结构,它是一种网络体系结构,其中客户端是用户运行应用程序的 PC端或者工作站,客户端要依靠服务器来获取资源。C/S 架构是通过提供查询响应而不是总文件传输来减了网络流量。它允许多用户通过GUI 前端更新到共享数据库,在客户端和服务器之间通信一般采用远程调用RPC 或标准查询语言 SQL 语句。

 C/S架构的基本特征:

  • 客户端进程包含特定于解决方案的逻辑,并提供用户与应用程序系统其余部分之间的接口。服务器进程充当管理共享资源(如数据库,打印机,调制解调器或高性能处理器)的软件引擎
  • 前端任务和后端任务对计算资源有着根本不同的要求,例如处理器速度,内存,磁盘速度和容量以及输入/ 输出设备
  • 客户端和服务器的硬件平台和操作系统通常不相同。客户端和服务器进程通过一组明确定义的标准应用程序接口APIRPC进行通信
  • C/S架构的一个重要特征是可扩展性,它们可以水平或垂直缩放。水平扩展意味着添加或删除客户端,工作站只会对性能产生轻微影响。垂直扩展意味着迁移到更大更快的服务器计算机或多服务器中。

服务器端套路 

创建 ServerSocket 对象,绑定监听端口。
通过 accept 方法监听客户端请求。
连接建立后,通过输入流读取客户端发送的请求信息。
通过输出流向客户端发送响应信息。

关闭响应的资源 

ServerSocket ss=new ServerSocket(8000); 
//阻塞当前线程的执行,并等待客户端的链接请求,如果链接成功则返回一个Socket对象 
Socket socket=ss.accept(); 
//通过链接对象Socket可以获取一个输入流和一个输出流 
InputStream is=socket.getInputStream(); 
OutputStream os=socket.getOutputStream(); 
//具体的数据接收处理逻辑 
BufferedReader br=new BufferedReader(new InputStreamReader(is));
//这里使用的是BIO,所以当客户端没有发送数据时,会阻塞等待 
String str=br.readLine(); System.out.println("Server:"+str); 
//服务器回传系统当前时间 
PrintStream ps=new PrintStream(os); 
Date now=new Date(); 
DateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
String sdate=df.format(now); 
ps.println(sdate); ps.flush(); 
//发送完毕,关闭流和套接字,完善的写法为try-finally结构 
ps.close(); 
br.close(); 
socket.close();

客户端套路

创建 Socket 对象,指明需要连接的服务器的地址和端口号。
连接建立后,通过输出流向服务器发送请求信息。
通过输入流获取服务器响应的信息。

关闭相应资源

//也可以使用回绕地址127.0.0.1。注意这里的端口号必须和服务器的端口号一致,否则不能链接 
//如果链接成功则返回Socket对象 
Socket socket=new Socket("localhost",8000); 
//通过链接对象Socket可以获取一个输入流和一个输出流 
InputStream is=socket.getInputStream(); 
os=socket.getOutputStream(); 
//具体的请求逻辑 
PrintStream ps=new PrintStream(os); 
ps.println("Hello Server!");
//向服务器发送一个内容为Hello Server!的字符串 
//客户端接收服务器传回的系统当前时 
BufferedReader br=new BufferedReader(new InputStreamReader(is)); 
String sdate=br.readLine();
//阻塞等待 
System.out.println("Client:"+sdate); 
//关闭 
br.close(); 
ps.close();
socket.close();

一般的编程实现方式

主线程一直处于阻塞等待状态,如果一旦链接建立成功则启动一个新线程对外提供服务,而主线程继续等待连接请求
依据:监听端口在连接创建期间被占用,连接一旦创建则继续处于空闲状态
public class MyServer { 
    public static void main(String[] args) throws Exception { 
        ServerSocket server = new ServerSocket(9999); 
        while (true) { Socket socket = server.accept(); 
        new MyWorker(socket).start(); 
       } 
    } 
}
class MyWorker extends Thread { 
    private Socket socket; 
    public MyWorker(Socket socket) { 
        this.socket = socket; 
    }
@Override 
public void run() { 
    BufferedReader br = null; 
    PrintStream ps = null; 
    try {
          InputStream is = socket.getInputStream(); 
            OutputStream os = socket.getOutputStream(); 
            br = new BufferedReader(new InputStreamReader(is)); 
            ps = new PrintStream(os); String ss = br.readLine();                                                
            System.out.println("Client:" + ss); 
            if ("hello".equals(ss)) { 
                    Date now = new Date();     
                    DateFormat df = new SimpleDateFormat("yyyy-MM-ddE hh:mm:ss"); 
                    ss = df.format(now); ps.println(ss); } } catch (Exception e) { 
// e.printStackTrace(); 
            throw new RuntimeException(e); 
} finally { 
            if (br != null) 
            try {br.close(); 
            } catch (IOException e) { 
                e.printStackTrace(); 
                } if (ps != null) ps.close();
            if (socket != null) 
            try {socket.close();
             } catch (IOException e) {
                e.printStackTrace(); 
            } 
        } 
    } 
}

 c/sb/s区别

  • C/S Client/Server,客户机/服务器)结构,胖客户端应用,是软件系统体系结构的一种。C/S式简单地讲就是基于企业内部网络的应用系统,大部分的应用逻辑都集中在客户端中,而一般服务器端只提供数据的存储。与B/SBrowser/Server,浏览器/服务器)模式相比,C/S模式的应用系 统最大的好处是不依赖企业外网环境,即无论企业是否能够上网,都不影响应用。
  • B/S结构(Browser/Server结构)结构即浏览器和服务器结构,瘦客户端应用,主要逻辑集中在服务器端,客户端一般只包含的简单的显示逻辑。它是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户工作界面是通过WWW浏览器来实现,极少部分事务逻辑在前端Browser实现,但是主要事务逻辑在服务器端Server实现,形成所谓三层3-tier结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值