• 线程客户端Socket多客户端编程实例


    本文个人在北京游玩的时候突然想到的...近期就有想写几篇关于线程客户端的笔记,所以回家到之后就奋笔疾书的写出来发布了

        下面展示一个多客户端的Socket编程实例,例子很简单,要实现多客户端通信,就只能借助于多线程技术,其实就是将Socket通信代码写在run()方法中,由于测试代码并非是真正的多台计算机与一个服务器相连,所以并不能在举动当作真正的多客户端通信,只是由于多线程给我们造成了一种多客户端的假象而已。

        package rick_demo;

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;

    import javax.swing.JFrame;

     
     
    public class  ServerDemo extends JFrame{

        
        private static final long serialVersionUID = 1L;
     
        public static void main(String[] args)throws IOException{
            ServerVallyDemo  svd= new ServerVallyDemo();
            svd.setDaemon(true);
            svd.start();
          
            do{
               System.out.println("input some words of main");
               BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
               String str=br.readLine();
               new ClientDemo(str).start();
            
            }while(true);
        }
    }
    /**
     * 客户端类担任接受信息和发送信息
     */
     
    class ClientDemo  extends Thread{    
        private  Socket  s1;
        private  PrintWriter out1;
        private  BufferedReader tempOut;
        //private  BufferedReader in1;
        //private  final  int ID;
        private  final  String str;
        public ClientDemo(String str){
            this.str = str;
        }
        public void run(){
            try{
                  
                s1=new Socket("127.0.0.1",10000);
                
              
                out1 = new PrintWriter(s1.getOutputStream(),true);
                out1 .println(str);
                tempOut= new BufferedReader(new InputStreamReader(s1.getInputStream()));
                
                System.out.println(tempOut.readLine());            
                tempOut.close();
                out1.close();
             
                s1.close();            
                Thread.sleep(100);  //模拟真正的业务处理时光
             }catch(IOException e){        
             }catch(InterruptedException e){            
             }
        }                  
     }
    /**
     * 服务器类担任接受信息和发送信息
     */
     
    class ServerVallyDemo extends Thread {
        
            private  ServerSocket  ss ;
            private  Socket  s1;
            private  PrintWriter out1;
        
             private  BufferedReader in1;
            public void run(){
                while(true){
                 try{
                    ss= new ServerSocket(10000);
                    s1=ss.accept();
                   
                    /*send the data to the client machine */
                    //tempOut = new BufferedReader(new InputStreamReader(s1.getInputStream()));
                      out1 = new PrintWriter(s1.getOutputStream(),true);
                      out1 .println("已经收到你的信息");
                    /*receive the data from client machine*/
                      in1= new BufferedReader(new InputStreamReader(s1.getInputStream()));
                      System.out.println(in1.readLine());            
                      in1.close();
                      out1.close();
            
                      ss.close();
                 }catch(IOException e){        
                 }  
                }
            }
         }

        每日一道理
    岭上娇艳的鲜花,怎敌她美丽的容颜?山间清澈的小溪,怎比她纯洁的心灵?

        有时候为一个请求就创立一个新线程,其开销是非常大的,创立或销毁一个线程甚至比处理请求花的时光和资源还要多。如果要实现采用线程池技术,以防止频仍创立线程和销毁线程的价值太大,那么就应该采用线程池来启动一个线程,实现给定一个适合的线程池的容量。上面的例子采用线程池启动线程的代码只要改动一下main()方法就可以了,详细代码如下:

        public static void main(String[] args)throws IOException{
            ServerVallyDemo  svd= new ServerVallyDemo();
            svd.setDaemon(true);
            svd.start();
        
            ExecutorService exec= Executors.newFixedThreadPool(3);
            do{
               System.out.println("input some words of main");
               BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
               String str=br.readLine();
             
               exec.execute(new ClientDemo(str));
            }while(true);
        }

    文章结束给大家分享下程序员的一些笑话语录: 一位程序员去海边游泳,由于水性不佳,游不回岸了,于是他挥着手臂,大声求.救:“F1,F1!”

    --------------------------------- 原创文章 By
    线程和客户端
    ---------------------------------

  • 相关阅读:
    java.net.SocketException: Unconnected sockets not implemented 解
    ios 瀑布流
    IOS --- 日期时间格式 更改
    平衡二叉树(常问问题)
    Oracle 学习笔记 17 -- 异常处理(PL/SQL)
    【Java先进】Lock、通过使用线程池
    兼容 谷歌、火狐、360系列浏览器桌面通知()有用
    iOS截取特定的字符串(正则匹配)
    改造世界、知行合一、实践论、学以致用
    如何理解“哲学家们只是用不同的方式解释世界,而问题在于改变世界”?
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3100606.html
Copyright © 2020-2023  润新知