• Socket编程


    传统Socket编程(服务端)

    package org.hxm.nett.one;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * 传统socket
     * @author Administrator
     *
     */
    public class OioServer {
    
        public static void main(String[] args) throws Exception {
              //创建socket服务,监听10101端口
            ServerSocket server=new ServerSocket(10101);
            System.out.println("服务器启动!");
          //获取一个套接字(阻塞)
            Socket socket = server.accept();
            //业务处理
            handler(socket);
        }
         /**
         * 读取数据
         * @param socket
         * @throws Exception
         */
        public static void handler(Socket socket){
                try {
                    byte[] bytes = new byte[1024];
                    InputStream inputStream = socket.getInputStream();
                    
                    while(true){
                        //读取数据(阻塞)
                        int read = inputStream.read(bytes);
                        if(read != -1){
                            System.out.println(new String(bytes, 0, read));//注意此处会出现中文乱码 原因是因为socket默认编码是 GBK
                                               //处理办法是new String(bytes, 0, read,"GBK")
    }
    else{ break; } } } catch (Exception e) { e.printStackTrace(); }finally{ try { System.out.println("socket关闭"); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } }

    启动Socket服务端(启动main)方法

    debug启动会发现在  Socket socket = server.accept(); 停止不动进行阻塞

    测试连接

    windows 下Cmd打开命令窗口,输入telnet ip 端口可连接到服务端(笔者的是 telnet 127.0.0.1 10101,图一为ip 端口错误出现的情况,图二则为正常情况)

     在窗口中按 "CTRL+]" ,可进入发送命令窗口

    发送消息的命令为Send 字符串,返回到eclipse控制台可查看到发送的字符串

     解决传统socket编程的阻塞问题

    ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
            //创建socket服务,监听10101端口
            ServerSocket server=new ServerSocket(10101);
            System.out.println("服务器启动!");
            while(true){
                //获取一个套接字(阻塞)
                final Socket socket = server.accept();
                System.out.println("来个一个新客户端!");
                newCachedThreadPool.execute(new Runnable() {
                    
                    @Override
                    public void run() {
                        //业务处理
                        handler(socket);
                    }
                });
                
            }
  • 相关阅读:
    box-shadow中的理解(bootstrap)
    setTimeout用于取消多次执行mouseover或者mouseenter事件,间接实现hover的悬停加载的效果.
    把之前能运行的springboot项目重新打开运行,报错 Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
    angularjs服务json文件实现省市区三级联动
    js页面用户信息填写表单
    js页面中实现加载更多功能
    遇见未知的自己
    ASP.NET Core 入门教程1 ASP.NET Core 读取配置文件
    有一种选择叫女程(5)
    有一种选择叫女程(4)
  • 原文地址:https://www.cnblogs.com/JavaHxm/p/10995123.html
Copyright © 2020-2023  润新知