java socket和多线程(Thread)实例

来源:互联网 发布:linux下mysql命令 编辑:程序博客网 时间:2024/05/16 16:55

1. socket通信:有客户端和服务端的socket代码。 

2. 多线程:客户端和服务端各用一线程发送信息;服务端另有一监听线程,用于把超时的信息删除。 

    这里应用到了同步,使两个线程可以操作同一个map。 

代码:(类全在同一个包内) 
server端: 

Java代码 
  1. import java.io.BufferedReader;  
  2. import java.io.InputStreamReader;  
  3. import java.io.PrintWriter;  
  4. import java.net.ServerSocket;  
  5. import java.net.Socket;  
  6. import java.util.Collections;  
  7. import java.util.concurrent.TimeUnit;  
  8. import java.util.HashMap;  
  9. import java.util.Map;  
  10.   
  11. public class ServerNet {  
  12.     // 以毫秒为单位   
  13.     private final static long timeLimit = 10000 ;  
  14.     private Map<String,String> map = Collections.synchronizedMap(new HashMap<String,String>());  
  15.           
  16.     public void ServerSocketNet(){  
  17.         try{  
  18.              ServerSocket ss = new ServerSocket(6060);  
  19.              Socket s = ss.accept();  
  20.              // 用于获取客户端传输来的信息  
  21.              BufferedReader buff = new BufferedReader(new InputStreamReader(s.getInputStream()));  
  22.              // 用于获取服务端准备响应的信息  
  23.              BufferedReader in = new BufferedReader(new InputStreamReader(System.in));  
  24.              // 发送服务端准备响应的信息  
  25.              PrintWriter pw = new PrintWriter(s.getOutputStream(),true);               
  26.              pw.println("您已经成功建立连接!");  
  27.                
  28.              new ServerOutNet(pw, in);  
  29.              new ServerTimeListener(map, timeLimit);  
  30.                
  31.              // 显示客户端的传输来的信息  
  32.              while(true){   
  33.                  String str = buff.readLine();  
  34.                  if(str.equals("exit")){  
  35.                      break;  
  36.                  }else{  
  37.                      map.put(ServerHelper.getInstance().getMapKey(), str);  
  38.                      System.out.println(str + "     map.size: " + map.size());  
  39.                        
  40.                  }  
  41.                  System.out.println("To Client:");  
  42.                  Thread.sleep(100);  
  43.             }  
  44.             s.close();  
  45.          }catch(Exception e){  
  46.              e.printStackTrace();  
  47.          }  
  48.     }  
  49.      public static void main(String[] args){  
  50.          new ServerNet().ServerSocketNet();  
  51.      }  
  52. }  
  53.   
  54. /** 
  55.  * server发送线程 向客户端发送响应信息 
  56.  * @author ids-user 
  57.  * 
  58.  */  
  59. class ServerOutNet extends Thread{  
  60.     private PrintWriter printWriter;  
  61.     private BufferedReader bufferedReader;  
  62.       
  63.     ServerOutNet(PrintWriter pw,BufferedReader in){  
  64.         this.printWriter = pw;  
  65.         this.bufferedReader = in;  
  66.         start();  
  67.      }  
  68.       
  69.     public void run(){  
  70.         while(true){  
  71.             try{  
  72.                 String inStr = bufferedReader.readLine();  
  73.                 if(inStr.equals("exit")){  
  74.                     printWriter.close();  
  75.                     bufferedReader.close();  
  76.                     break;  
  77.                 }else{  
  78.                     printWriter.println("From Server: " + inStr);  
  79.                 }  
  80.                 sleep(300);  
  81.             }catch(Exception e){  
  82.                 printWriter = null;  
  83.                 bufferedReader = null;  
  84.                 throw new RuntimeException(e);  
  85.             }  
  86.         }  
  87.      }  
  88. }  
  89.   
  90. // 时间监听线程类。  
  91. class ServerTimeListener extends Thread{  
  92.       
  93.     private long timeLimit;  
  94.     Map<String, String> map = new HashMap<String, String>();  
  95.   
  96.     // 单例  
  97. //  private ServerTimeListener(){}  
  98. //  private final static ServerTimeListener stl = new ServerTimeListener();  
  99. //  public static ServerTimeListener getInstance(){  
  100. //      return stl;  
  101. //  }  
  102.       
  103.     ServerTimeListener(Map<String, String> map , long timeLimit){  
  104.         this.map = map;  
  105.         this.timeLimit = timeLimit;  
  106.         start();  
  107.     }  
  108.       
  109.       
  110.     public void run(){  
  111.         while(true){  
  112.             try{  
  113.                 // 循环map  
  114.                  long currentTime = System.currentTimeMillis();  
  115.                  for(String mapKey : map.keySet()){  
  116.                      long oldTime = Long.parseLong(mapKey.substring(0, mapKey.indexOf("_")));  
  117.                      System.out.println("currentTime - oldTime=" + (currentTime - oldTime));  
  118.                      if(currentTime - oldTime >= timeLimit){  
  119.                          map.remove(mapKey);  
  120.                      }  
  121.                  }  
  122.                    
  123.                 TimeUnit.MILLISECONDS.sleep(timeLimit);  
  124.                   
  125.             }catch(Exception e){  
  126.                 throw new RuntimeException(e);  
  127.             }  
  128.         }  
  129.      }  
  130. }  




服务器端辅助类:ServerHelper 

Java代码 
  1. import java.util.Random;  
  2.   
  3. public class ServerHelper {  
  4.       
  5.     // 单例  
  6.     private ServerHelper(){ }  
  7.     private final static ServerHelper helper = new ServerHelper();  
  8.     public static ServerHelper getInstance(){  
  9.         return helper;  
  10.     }  
  11.       
  12.       
  13.     // 构建map的key值  
  14.     public String getMapKey(){  
  15.           
  16.         Random random = new Random();  
  17.         String mapKey = System.currentTimeMillis() + "_" + random.nextInt(1000);  
  18.         System.out.println("map key: " + mapKey);  
  19.         return mapKey;  
  20.     }     
  21. }  




Client端:

Java代码 
  1. import java.io.BufferedReader;  
  2. import java.io.InputStreamReader;  
  3. import java.io.PrintWriter;  
  4. import java.net.Socket;  
  5. import java.util.concurrent.Executors;  
  6. import java.util.concurrent.ExecutorService;  
  7.   
  8. public class ClientNet {  
  9.   
  10.     public static void main(String[] args){  
  11.         try{  
  12.             Socket s = new Socket("127.0.0.1",6060);  
  13.             // 用于获取服务端传输来的信息  
  14.             BufferedReader buff = new BufferedReader(new InputStreamReader(s.getInputStream()));  
  15.             // 用于获取客户端准备响应的信息  
  16.             BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));   
  17.             // 发送客户端准备传输的信息   
  18.             PrintWriter printWriter = new PrintWriter(s.getOutputStream(),true);  
  19.             printWriter.println("有客房端请求连接!");  
  20.               
  21.             // 客户端使用线程池连接服务端  
  22. //          ExecutorService executorService = Executors.newCachedThreadPool();  
  23. //          executorService.execute(new ClientOutNet(printWriter,bufferedReader));   
  24.             new ClientOutNet(printWriter,bufferedReader);  
  25.               
  26.             while(true){  // 显示服务端的响应信息  
  27.                 String str = buff.readLine();  
  28.                 if(str != null){  
  29.                     System.out.println(str);  
  30.                 }  
  31. //              System.out.println("To Server:");  
  32.                 Thread.sleep(100);  
  33.             }    
  34.                  
  35.         }catch(Exception e){  
  36.             e.printStackTrace();  
  37.         }  
  38.   
  39.     }  
  40. }  
  41.   
  42.   
  43. /** 
  44.  * Client 发送线程 ,向服务端发送信息 
  45.  * @author ids-user 
  46.  */  
  47. class ClientOutNet extends Thread{  
  48.     private PrintWriter printWriter;  
  49.     private BufferedReader bufferedReader;  
  50.       
  51.     ClientOutNet(PrintWriter pw,BufferedReader in){  
  52.         this.printWriter = pw;  
  53.         this.bufferedReader=in;  
  54.         start();  
  55.      }  
  56.       
  57.       
  58.     public void run(){  
  59.         while(true){  
  60.             try{  
  61.                 String inStr = bufferedReader.readLine();  
  62.                 if(inStr.equals("exit")){  
  63.                     printWriter.close();  
  64.                     bufferedReader.close();  
  65.                     break;  
  66.                 }else{  
  67.                     printWriter.println("From Client: " + inStr);  
  68.                 }  
  69.                 sleep(300);  
  70.             }catch(Exception e){  
  71.                 printWriter = null;  
  72.                 bufferedReader = null;  
  73.                 throw new RuntimeException(e);  
  74.             }  
  75.         }  
  76.      }  
  77. }  

 

//一般客户端主程序
import java.io.*;
import java.net.Socket;
import java.lang.*;
public class client
{
private Socket con;//客户端连接socket
private OutputStream out;
private String sen;
private byte b[];
public client()
{
clientInit();
}
public void clientInit()
{
try
{
   con=new Socket("localhost",10015);
   con.setSoTimeout(10000);
   b=new byte[1024];
   OutputStream out=con.getOutputStream();
   sen="hello serve,以TCP方式发送数据!";
   b=sen.getBytes();
   out.write(b);
   out.flush();
   out.close();
   con.close();
}
catch(IOException ie)
{
   ie.toString();
}
}
public static void main(String args[])
{
new client();
}
}