LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

Android 开发即时聊天工具 YQ :(一) Socket 初步

admin
2013年2月25日 14:14 本文热度 4314

这段时间在学习Android网络编程,习惯一边写个简单的项目一边学习,所以就有了这个简易的简易的,,,项目,类似于手机QQ等等的即时聊天工具,当然功能及其简单,跟那些没法比,只是学习,实现简单功能就OK,听说QQ是有自己的协议的,貌似挺复杂,,,只为学习交流之用,而且本人也是Android小菜鸟一枚,错误不足在所难免,请大家多多指正,3Q~

先看看socket通信基础:

所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。 

Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。

服务器:

使用ServerSocket监听指定的端口,等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。 

客户端:

使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。

0~1023的端口号为系统所保留,例如http服务的端口号为80,telnet服务的端口号为21,ftp服务的端口号为23, 所以我们在选择端口号时,最好选择一个大于1023的数以防止发生冲突。

简单的Client/Server示例:

服务器:

[java]
  1. public class Client {
  2.     public static void main(String[] args) throws Exception {  
  3.         //向本机的5469端口发出客户请求   
  4.         Socket socket=new Socket(InetAddress.getLocalHost(),5469);  
  5.         //由Socket对象得到输入流,并构造相应的BufferedReader对象   
  6.         BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));  
  7.         //由Socket对象得到输出流,并构造PrintWriter对象   
  8.         PrintWriter os=new PrintWriter(socket.getOutputStream());  
  9.         //由系统标准输入设备构造BufferedReader对象   
  10.         BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));  
  11.         while(true){  
  12.             String str=sin.readLine();//从系统标准输入读入一字符串   
  13.             os.println(str);  
  14.             os.flush(); //刷新输出流,使Server马上收到该字符串   
  15.               
  16.             String s=is.readLine();  
  17.             System.out.println("Server : "+s);//在标准输出上打印从Server读入的字符串   
  18.             if(str.equals("end")){  
  19.                 break;  
  20.             }  
  21.         }  
  22.         is.close();//关闭Socket输入流   
  23.         os.close();//关闭Socket输出流   
  24.         socket.close();//关闭Socket   
  25.     }  
  26. }  

客户端:

[java]
  1. public class MyServer {
  2.     public static void main(String[] args) throws Exception{  
  3.         ServerSocket server=new ServerSocket(5469);//创建一个ServerSocket在端口5469监听客户请求   
  4.         Socket client=server.accept();//使用accept()阻塞等待客户请求   
  5.         BufferedReader is=new BufferedReader(new InputStreamReader(client.getInputStream()));  
  6.         PrintWriter os=new PrintWriter(client.getOutputStream());  
  7.         BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));  
  8.         while(true){  
  9.             String str=is.readLine();  
  10.             System.out.println("Client : "+str);//在标准输出上打印从Client读入的字符串   
  11.               
  12.             os.println(sin.readLine());  
  13.             os.flush();//刷新输出流,使Client马上收到该字符串   
  14.             if(str.equals("end")){  
  15.                 break;  
  16.             }  
  17.         }  
  18.         is.close();  
  19.         os.close();  
  20.         client.close();  
  21.         server.close();  
  22.     }  
  23. }  

回话示例图:


上边的代码只是实现一个客户端访问服务器,如果要多个客户同时访问一个服务器,那么服务端的代码就要修改了:

[java]
  1. public class MyServer extends Thread{  
  2.     Socket client;  
  3.     public MyServer(Socket c){  
  4.         this.client=c;  
  5.     }  
  6.     public void run() {  
  7.         try{  
  8.             BufferedReader is=new BufferedReader(new InputStreamReader(client.getInputStream()));  
  9.             PrintWriter os=new PrintWriter(client.getOutputStream());  
  10.             BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));  
  11.             while(true){  
  12.                 String s=is.readLine();  
  13.                 System.out.println("Client : "+s);//在标准输出上打印从Client读入的字符串   
  14.                   
  15.                 String str=sin.readLine();//从系统标准输入读入一字符串   
  16.                 os.println(str);  
  17.                 os.flush();//刷新输出流,使Client马上收到该字符串   
  18.                 if(str.equals("end")){  
  19.                     break;  
  20.                 }  
  21.             }  
  22.             is.close();  
  23.             os.close();  
  24.             client.close();  
  25.         }catch(Exception e){  
  26.             e.printStackTrace();  
  27.         }  
  28.     }  
  29.   
  30.     public static void main(String[] args) throws Exception{  
  31.         ServerSocket server=new ServerSocket(5469);//创建一个ServerSocket在端口5469监听客户请求   
  32.         while(true){  
  33.             MyServer s=new MyServer(server.accept());//使用accept()阻塞等待客户请求   
  34.             s.start();  
  35.         }  
  36.     }  
  37. }  

该文章在 2013/2/25 14:15:02 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved