zoukankan      html  css  js  c++  java
  • 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就成了

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


  • 相关阅读:
    Git快速入门
    Django(一)入门基础——hello world
    JS获取浏览器地址栏的多参数值的任意值
    EasyUI 中的双击某行 并赋值给input事件
    T-SQL 创建触发器 禁止插入空值
    从xxxx检测到有潜在危险的 Request.Form 提示黄页
    Linux基本常用命令|ubuntu获取root权限
    MySQL操作数据库值mysql事务
    ASP.NET免费发送邮件|
    经典JS 判断上传文件大小和JS即时同步电脑时间
  • 原文地址:https://www.cnblogs.com/lechance/p/4373320.html
Copyright © 2011-2022 走看看