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 }