zoukankan      html  css  js  c++  java
  • 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);
                    }
                });
                
            }
  • 相关阅读:
    八进制转换成十进制(你会明白的,呵呵)
    从键盘读取7个数(150)的整数值,每读一个值打印出该值个数的*号.
    两个字符串的连接程序
    判断一个素数能被几个9整除.
    809*??=800*??+9*??+1 其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。
    一个偶数总能表示为两个素数的和.
    07所能组成的奇数的个数
    asp.net .ashx文件使用Server.MapPath解决方法
    MVC常见问题小总结
    amcharts_2.6.13左上角的广告咱去掉
  • 原文地址:https://www.cnblogs.com/JavaHxm/p/10995123.html
Copyright © 2011-2022 走看看