线程客户端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
线程和客户端
---------------------------------

原文地址:https://www.cnblogs.com/jiangu66/p/3100606.html