test

Java Socket通信原理简介

java socket通信已经被封装好了主要使用两个类ServerSocket 和Socket

首先写一个1v1的通信

服务端

[java] view plaincopy
  1. /** 
  2.  *  
  3.  */  
  4. package com.dnion.socket;  
  5.   
  6. import java.io.BufferedReader;  
  7. import java.io.BufferedWriter;  
  8. import java.io.InputStreamReader;  
  9. import java.io.OutputStreamWriter;  
  10. import java.io.PrintWriter;  
  11. import java.net.ServerSocket;  
  12. import java.net.Socket;  
  13.   
  14. /** 
  15.  ***************************************************************  
  16.  * 项目名称:JavaThread 
  17.  * 程序名称:JabberServer 
  18.  * 日期:2012-8-23 上午11:36:12 
  19.  * 作者: 
  20.  * 模块: 
  21.  * 描述: 
  22.  * 备注: 
  23.  * ------------------------------------------------------------ 
  24.  * 修改历史 
  25.  * 序号               日期              修改人       修改原因 
  26.  *  
  27.  * 修改备注: 
  28.  * @version  
  29.  *************************************************************** 
  30.  */  
  31. public class JabberServer {  
  32.   
  33.     public static int PORT = 8080;  
  34.     public static void main(String[] agrs) {  
  35.         ServerSocket s = null;  
  36.         Socket socket = null;  
  37.         BufferedReader br = null;  
  38.         PrintWriter pw = null;  
  39.         try {  
  40.             //设定服务端的端口号  
  41.             s = new ServerSocket(PORT);  
  42.             System.out.println("ServerSocket Start:"+s);  
  43.             //等待请求,此方法会一直阻塞,直到获得请求才往下走  
  44.             socket = s.accept();  
  45.             System.out.println("Connection accept socket:"+socket);  
  46.             //用于接收客户端发来的请求  
  47.             br = new BufferedReader(new InputStreamReader(socket.getInputStream()));  
  48.             //用于发送返回信息,可以不需要装饰这么多io流使用缓冲流时发送数据要注意调用.flush()方法  
  49.             pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);  
  50.             while(true){  
  51.                 String str = br.readLine();  
  52.                 if(str.equals("END")){  
  53.                     break;  
  54.                 }  
  55.                 System.out.println("Client Socket Message:"+str);  
  56.                 Thread.sleep(1000);  
  57.                 pw.println("Message Received");  
  58.                 pw.flush();  
  59.             }  
  60.               
  61.         } catch (Exception e) {  
  62.             // TODO Auto-generated catch block  
  63.             e.printStackTrace();  
  64.         }finally{  
  65.             System.out.println("Close.....");  
  66.             try {  
  67.                 br.close();  
  68.                 pw.close();  
  69.                 socket.close();  
  70.                 s.close();  
  71.             } catch (Exception e2) {  
  72.                   
  73.             }  
  74.         }  
  75.     }  
  76. }  

客户端


[java] view plaincopy
  1. /** 
  2.  *  
  3.  */  
  4. package com.dnion.socket;  
  5.   
  6. import java.io.BufferedReader;  
  7. import java.io.BufferedWriter;  
  8. import java.io.IOException;  
  9. import java.io.InputStreamReader;  
  10. import java.io.OutputStreamWriter;  
  11. import java.io.PrintWriter;  
  12. import java.net.Socket;  
  13.   
  14. /** 
  15.  ***************************************************************  
  16.  * 项目名称:JavaThread 程序名称:JabberClient 日期:2012-8-23 下午01:47:12  
  17.  * 作者: 
  18.  * 模块:  
  19.  * 描述:  
  20.  * 备注: 
  21.  * ------------------------------------------------------------  
  22.  * 修改历史 
  23.  * 序号 
  24.  * 日期 
  25.  * 修改人 
  26.  * 修改原因 
  27.  * 修改备注: 
  28.  *  
  29.  * @version 
  30.  ***************************************************************  
  31.  */  
  32. public class JabberClient {  
  33.   
  34.     /** 
  35.      * 方法名:main 描述: 作者:白鹏飞 日期:2012-8-23 下午01:47:12 
  36.      *  
  37.      * @param @param args 
  38.      * @return void 
  39.      */  
  40.     public static void main(String[] args) {  
  41.         Socket socket = null;  
  42.         BufferedReader br = null;  
  43.         PrintWriter pw = null;  
  44.         try {  
  45.             //客户端socket指定服务器的地址和端口号  
  46.             socket = new Socket("127.0.0.1", JabberServer.PORT);  
  47.             System.out.println("Socket=" + socket);  
  48.             //同服务器原理一样  
  49.             br = new BufferedReader(new InputStreamReader(  
  50.                     socket.getInputStream()));  
  51.             pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(  
  52.                     socket.getOutputStream())));  
  53.             for (int i = 0; i < 10; i++) {  
  54.                 pw.println("howdy " + i);  
  55.                 pw.flush();  
  56.                 String str = br.readLine();  
  57.                 System.out.println(str);  
  58.             }  
  59.             pw.println("END");  
  60.             pw.flush();  
  61.         } catch (Exception e) {  
  62.             e.printStackTrace();  
  63.         } finally {  
  64.             try {  
  65.                 System.out.println("close......");  
  66.                 br.close();  
  67.                 pw.close();  
  68.                 socket.close();  
  69.             } catch (IOException e) {  
  70.                 // TODO Auto-generated catch block  
  71.                 e.printStackTrace();  
  72.             }  
  73.         }  
  74.     }  
  75.   
  76. }  

这样一个简单地通信就完成了,这里我们要注意现在只能一对一通信。下面我们将使用多线程来实现多客户端通信的例子。

写一个一对多的通信,这里我们使用java的多线程来实现

首先来看一下服务类

[java] view plaincopy
  1. /** 
  2.  *  
  3.  */  
  4. package com.dnion.socket;  
  5.   
  6. import java.io.IOException;  
  7. import java.net.ServerSocket;  
  8. import java.net.Socket;  
  9.   
  10. /** 
  11.  ***************************************************************  
  12.  * 项目名称:JavaThread 
  13.  * 程序名称:MultiJabberServer 
  14.  * 日期:2012-8-23 下午02:38:20 
  15.  * 作者: 
  16.  * 模块: 
  17.  * 描述: 
  18.  * 备注: 
  19.  * ------------------------------------------------------------ 
  20.  * 修改历史 
  21.  * 序号               日期              修改人       修改原因 
  22.  *  
  23.  * 修改备注: 
  24.  * @version  
  25.  *************************************************************** 
  26.  */  
  27. public class MultiJabberServer {  
  28.   
  29.       
  30.     /** 
  31.      * 方法名:main 
  32.      * 描述: 
  33.      * 作者: 
  34.      * 日期:2012-8-23 下午02:38:20 
  35.      * @param @param args 
  36.      * @return void 
  37.      */  
  38.     public static void main(String[] args) {  
  39.         ServerSocket s = null;  
  40.         Socket socket  = null;  
  41.         try {  
  42.             s = new ServerSocket(8080);  
  43.             //等待新请求、否则一直阻塞  
  44.             while(true){  
  45.                 socket = s.accept();  
  46.                 System.out.println("socket:"+socket);  
  47.                 new ServeOneJabbr(socket);  
  48.                   
  49.             }  
  50.         } catch (Exception e) {  
  51.             try {  
  52.                 socket.close();  
  53.             } catch (IOException e1) {  
  54.                 // TODO Auto-generated catch block  
  55.                 e1.printStackTrace();  
  56.             }  
  57.         }finally{  
  58.             try {  
  59.                 s.close();  
  60.             } catch (IOException e) {  
  61.                 // TODO Auto-generated catch block  
  62.                 e.printStackTrace();  
  63.             }  
  64.         }  
  65.           
  66.   
  67.     }  
  68.   
  69. }  

接着我们要写一个服务端响应请求的类也就是一个socket

[java] view plaincopy
  1. /** 
  2.  *  
  3.  */  
  4. package com.dnion.socket;  
  5.   
  6. import java.io.BufferedReader;  
  7. import java.io.BufferedWriter;  
  8. import java.io.IOException;  
  9. import java.io.InputStreamReader;  
  10. import java.io.OutputStreamWriter;  
  11. import java.io.PrintWriter;  
  12. import java.net.Socket;  
  13.   
  14. /** 
  15.  ***************************************************************  
  16.  * 项目名称:JavaThread 
  17.  * 程序名称:ServeOneJabbr 
  18.  * 日期:2012-8-23 下午02:34:13 
  19.  * 作者: 
  20.  * 模块: 
  21.  * 描述: 
  22.  * 备注: 
  23.  * ------------------------------------------------------------ 
  24.  * 修改历史 
  25.  * 序号               日期              修改人       修改原因 
  26.  *  
  27.  * 修改备注: 
  28.  * @version  
  29.  *************************************************************** 
  30.  */  
  31. public class ServeOneJabbr extends Thread{  
  32.   
  33.     private Socket socket = null;  
  34.     private BufferedReader br = null;  
  35.     private PrintWriter pw = null;  
  36.       
  37.     public ServeOneJabbr(Socket s){  
  38.         socket = s;  
  39.         try {  
  40.             br = new BufferedReader(new InputStreamReader(socket.getInputStream()));  
  41.             pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);  
  42.             start();  
  43.         } catch (Exception e) {  
  44.               
  45.             e.printStackTrace();  
  46.         }  
  47.     }  
  48.       
  49.     @Override  
  50.     public void run() {  
  51.         while(true){  
  52.             String str;  
  53.             try {  
  54.                 str = br.readLine();  
  55.                 if(str.equals("END")){  
  56.                     br.close();  
  57.                     pw.close();  
  58.                     socket.close();  
  59.                     break;  
  60.                 }  
  61.                 System.out.println("Client Socket Message:"+str);  
  62.                 pw.println("Message Received");  
  63.                 pw.flush();  
  64.             } catch (Exception e) {  
  65.                 try {  
  66.                     br.close();  
  67.                     pw.close();  
  68.                     socket.close();  
  69.                 } catch (IOException e1) {  
  70.                     // TODO Auto-generated catch block  
  71.                     e1.printStackTrace();  
  72.                 }  
  73.             }  
  74.         }  
  75.     }  
  76.       
  77.       
  78.       
  79. }  

接下来利用我们上一次的客户端socket

[java] view plaincopy
  1. /** 
  2.  *  
  3.  */  
  4. package com.dnion.socket;  
  5.   
  6. import java.io.BufferedReader;  
  7. import java.io.BufferedWriter;  
  8. import java.io.IOException;  
  9. import java.io.InputStreamReader;  
  10. import java.io.OutputStreamWriter;  
  11. import java.io.PrintWriter;  
  12. import java.net.Socket;  
  13.   
  14. /** 
  15.  ***************************************************************  
  16.  * 项目名称:JavaThread 程序名称:JabberClient 日期:2012-8-23 下午01:47:12  
  17.  * 作者: 
  18.  * 模块:  
  19.  * 描述:  
  20.  * 备注: 
  21.  * ------------------------------------------------------------  
  22.  * 修改历史 
  23.  * 序号 
  24.  * 日期 
  25.  * 修改人 
  26.  * 修改原因 
  27.  * 修改备注: 
  28.  *  
  29.  * @version 
  30.  ***************************************************************  
  31.  */  
  32. public class JabberClient {  
  33.   
  34.     /** 
  35.      * 方法名:main 描述: 作者:白鹏飞 日期:2012-8-23 下午01:47:12 
  36.      *  
  37.      * @param @param args 
  38.      * @return void 
  39.      */  
  40.     public static void main(String[] args) {  
  41.         Socket socket = null;  
  42.         BufferedReader br = null;  
  43.         PrintWriter pw = null;  
  44.         try {  
  45.             //客户端socket指定服务器的地址和端口号  
  46.             socket = new Socket("127.0.0.1", JabberServer.PORT);  
  47.             System.out.println("Socket=" + socket);  
  48.             //同服务器原理一样  
  49.             br = new BufferedReader(new InputStreamReader(  
  50.                     socket.getInputStream()));  
  51.             pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(  
  52.                     socket.getOutputStream())));  
  53.             for (int i = 0; i < 10; i++) {  
  54.                 pw.println("howdy " + i);  
  55.                 pw.flush();  
  56.                 String str = br.readLine();  
  57.                 System.out.println(str);  
  58.             }  
  59.             pw.println("END");  
  60.             pw.flush();  
  61.         } catch (Exception e) {  
  62.             e.printStackTrace();  
  63.         } finally {  
  64.             try {  
  65.                 System.out.println("close......");  
  66.                 br.close();  
  67.                 pw.close();  
  68.                 socket.close();  
  69.             } catch (IOException e) {  
  70.                 // TODO Auto-generated catch block  
  71.                 e.printStackTrace();  
  72.             }  
  73.         }  
  74.     }  
  75.   
  76. }  

这样一个简单地多客户端响应socket就成了

每次有一个请求发送过来服务端都会新建一个线程来单独服务。


posted @ 2014-10-12 08:36  Lechance  阅读(815)  评论(0编辑  收藏  举报