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

转载声明:http://blog.csdn.net/mimitracely

 

这段时间在学习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示例:

服务器:

 

 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 }

客户端:

 

 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 }

 

回话示例图:

 

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

 

 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 }

 

 

 

 

posted @ 2013-01-26 11:29  王世桢  阅读(349)  评论(0编辑  收藏  举报