系统运维系列之socket和serversocket的简单介绍(java应用)

琅晓琳      2022-05-18     216

关键词:

Socket类代表一个客户端套接字,即任何时候连接到一个远程服务器应用时构建所需的socket。现在,要实现一个服务器应用,需要不同的做法。服务器需随时待命,因为不知道客户端什么时候会发来请求,此时,我们需要使用ServerSocket,对应的是java.net.ServerSocket类。
ServerSocket与Socket不同,ServerSocket是等待客户端的请求,一旦获得一个连接请求,就创建一个Socket示例来与客户端进行通信。 

Client代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
 
public class Client 
    public static final int port = 8080;   
    public static final String host = "localhost";
    public static void main(String[] args)     
        System.out.println("Client Start...");    
        while (true)     
            Socket socket = null;  
            try   
                //创建一个流套接字并将其连接到指定主机上的指定端口号  
                socket = new Socket(host,port);    
 
                //读取服务器端数据    
                BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));    
                //向服务器端发送数据    
                PrintStream out = new PrintStream(socket.getOutputStream());    
                System.out.print("请输入: \t");    
                String str = new BufferedReader(new InputStreamReader(System.in)).readLine();    
                out.println(str);    
 
                String ret = input.readLine();     
                System.out.println("服务器端返回过来的是: " + ret);    
                // 如接收到 "OK" 则断开连接    
                if ("OK".equals(ret))     
                    System.out.println("客户端将关闭连接");    
                    Thread.sleep(500);    
                    break;    
                    
 
                out.close();  
                input.close();  
             catch (Exception e)   
                System.out.println("客户端异常:" + e.getMessage());   
             finally   
                if (socket != null)   
                    try   
                        socket.close();  
                     catch (IOException e)   
                        socket = null;   
                        System.out.println("客户端 finally 异常:" + e.getMessage());   
                      
                  
              
            
        

Server代码:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
 
public class Server 
    public static final int port = 8080;//监听的端口号     
 
    public static void main(String[] args)     
        System.out.println("Server...\n");    
        Server server = new Server();    
        server.init();    
        
 
    public void init()     
        try     
            //创建一个ServerSocket,这里可以指定连接请求的队列长度  
            //new ServerSocket(port,3);意味着当队列中有3个连接请求是,如果Client再请求连接,就会被Server拒绝 
            ServerSocket serverSocket = new ServerSocket(port);    
            while (true)     
                //从请求队列中取出一个连接
                Socket client = serverSocket.accept();    
                // 处理这次连接    
                new HandlerThread(client);    
                
         catch (Exception e)     
            System.out.println("服务器异常: " + e.getMessage());    
            
        
 
    private class HandlerThread implements Runnable     
        private Socket socket;    
        public HandlerThread(Socket client)     
            socket = client;    
            new Thread(this).start();    
            
 
        public void run()     
            try     
                // 读取客户端数据    
                BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));    
                String clientInputStr = input.readLine();//这里要注意和客户端输出流的写方法对应,否则会抛 EOFException  
                // 处理客户端数据    
                System.out.println("客户端发过来的内容:" + clientInputStr);    
 
                // 向客户端回复信息    
                PrintStream out = new PrintStream(socket.getOutputStream());    
                System.out.print("请输入:\t");    
                // 发送键盘输入的一行    
                String s = new BufferedReader(new InputStreamReader(System.in)).readLine();    
                out.println(s);    
 
                out.close();    
                input.close();    
             catch (Exception e)     
                System.out.println("服务器 run 异常: " + e.getMessage());    
             finally     
                if (socket != null)     
                    try     
                        socket.close();    
                     catch (Exception e)     
                        socket = null;    
                        System.out.println("服务端 finally 异常:" + e.getMessage());    
                        
                    
               
            
        

参考资料:
https://blog.csdn.net/qq_41517936/article/details/81015711 Socket和ServerSocket的简单介绍及例子

系统运维系列之greenplum常用的toolkit和catalog监控语句

1表膨胀相关查询--该视图显示了那些膨胀的(在磁盘上实际的页数超过了根据表统计信息得到预期的页数)正规的堆存储的表。select*fromgp_toolkit.gp_bloat_diag;--所有对象的膨胀明细select*fromgp_toolkit.gp_bloat_expected_pages;2表倾斜... 查看详情

系统运维系列之greenplumvacuum清理删除数据命令(代码片段)

...m完成清理工作后,那些空间并没有真正被释放给操作系统,只能被vacuum清理过的表和索引所利用 查看详情

系统运维系列之java中实现多线程的方式补充

1介绍接本专题博客之系统运维系列之java中实现多线程的方式上篇博客提到多线程使用的4种方式,分别是:实现方式1:继承Thread类,重写该类的run方法;实现方式2:实现Runnable接口,并重写该接口的run... 查看详情

系统运维系列之mysql部分学习整理2

1字符函数使用举例:CONCAT_WS相比于CONCAT可以简化语句SELECTCONCAT(id,’-’,age)ASpathFROMuser;SELECTCONCAT_WS(’-’,id,age)ASpathFROMuser;SELECTFORMAT(id,3)ASnumFROMuser;SELECTLEFT(‘abcdef’,2);—>ab举例:SELECT 查看详情

系统运维系列之clickhouse数据类型整理

Clickhouse支持的数据类型在system.data_type_families表中检查数据类型名称以及是否区分大小写,这个表中存储了ClickHouse支持的所有数据类型。select*fromsystem.data_type_familieslimit10;Int说明ClickHouse中整形分为Int8、Int16、Int32、Int64来表示... 查看详情

系统运维系列之ip地址和子网划分介绍(代码片段)

1简介接上一篇博客:关于A类,B类,C类IP地址的网段和主机数的计算方法2详细内容(1)子网掩码IP地址是以网络号和主机号来标示网络上的主机的,我们把网络号相同的主机称之为本地网络,网络号不相同的主... 查看详情

系统运维系列之kafka配置分析及参数含义

补充:kafkamanager中lag的正数、0、负数的含义:正数:就是kafka数据积压了,消费速度小于生产速度;0:生产者和消费者速率基本相当,说明2者都工作正常;负数:说明kafka的消费者干活很快,分... 查看详情

系统运维系列之list实现深拷贝(java应用)

浅拷贝调用方法:遍历循环复制:List<String>destList=newArrayList<String>(srcList.size());for(Stringp:srcList)destList.add(p);使用list.addAll()方法:List<String>destList=newAr 查看详情

系统运维系列之mysql部分学习整理5(代码片段)

1应用场景在mysql数据库中查找数据,要求是数据为日期不连续数据,输入一个日期查询日期所在周指定周几的数据和上几周对应时间段数据(一个月内)。关于此问题网上资料未曾有明确的解决方案,本篇博... 查看详情

系统运维系列之mysql部分学习整理3

1存储过程语法结构:举例:无参CREATEPROCEDUREsql()SELECTVERSION();调用:CALLsql();有参IN:DELIMITER//(更改执行符号的命令)参数与语句中的字段不要重复,不要重复!如果p_id改成id,则会全部删除࿰... 查看详情

系统运维系列之mysql部分学习整理4

1存储引擎查看数据库表创建命令:SHOWCREATETABLEtab1;支持的存储引擎:MylSAM:快速存储;InnoDB:带有事务回滚机制;MemorycsvArchive修改存储引擎的方式:通过修改MySQL配置文件实现default-storage-engine=engine... 查看详情

系统运维系列之mysql联合索引的使用分析(代码片段)

1前言日常优化中可能会遇到相同的数据在本地执行很快但是在服务器上执行很慢的问题,或者无论是在本地还是在服务器上都执行的很慢,可以分为两个方面排查2第一部分本地执行速度>服务器执行速度一般这种情况... 查看详情

系统运维系列之异常抛出后代码执行问题(java应用)

1问题描述thrownewExcpetion()之后,程序并没有向下继续运行,抛出异常后直接跳出,后面的功能不再执行。//抛出异常:Exceptioninthread"main"java.lang.NumberFormatException//不会执行后面的输出语句publicstaticvoidmain(String[]args) S... 查看详情

系统运维系列之linux系统下常用查找命令整理(代码片段)

1前言网上关于linux命令大多写的很细很全,但是真正使用起来需要根据自己的场景进行拼接,本博客建立在实际场景下,在实际问题中使用linux查找命令。2grep命令使用场景:查找日志中的关键词,并且限定时... 查看详情

系统运维系列之堆栈理解(java应用)(代码片段)

1概述java虚拟机内存分为:堆(heap)、栈(stack)、方法区(methodarea)等,整体来说:堆:new出来的数组或者对象;栈:存储局部变量;方法区:代码区;寄存器࿱ 查看详情

系统运维系列之kafka手动设置offset(经典方法总结)(代码片段)

1问题背景在使用Kafka消费数据过程中,消费程序可能出现运行问题,导致消费不及时,消息堆积很多;尤其是消息消费后需要进行一列后处理,这种情况下就需要考虑一些方法来进行消费参数的设置。2举例测... 查看详情

系统运维系列之记载一次windows系统下tomcat启动报错的问题(代码片段)

1问题简介最近遇到一个问题,在windows系统下部署tomcat项目,cmd命令启动时频繁报错,比如Unsupportedmajor.minorversion52.0,且cmd界面上打印出来的日志为乱码;最后在关闭tomcat时发现关不掉,出现项目挂起但是... 查看详情

系统运维系列之clickhouse数据库学习集锦(增删改查操作)(代码片段)

1简介本篇内容涉及一些增删改查操作,包括数据库、表,重点介绍字段的增加/删除操作,其中包含的内容均实际测试通过。2Clickhouseclickhouse是一款MPP架构的列式存储数据库,它拥有完备的管理功能,所以它称... 查看详情