先说一下流程。首先是建立一个java工程,并创建两个java类,一个用于接收到客户端的连接,并把连接添加list中,第二类实现线程runnable接口,专门用来接收发送客户发送的信息。其次,建立android工程,并创建两个类,一个用于显示聊天界面,另一个负责接收服务器端返回的信息。这个例子肯定会有考虑不周的地方但是只是为了学习android中网络相关api的使用,所以请大家谨慎拍砖。

首先还是android的内容


[html] view plain copy print ?
  1. <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <EditText
  6. android:id="@+id/et_show"
  7. android:layout_width="fill_parent"
  8. android:layout_height="wrap_content"
  9. android:lines="5"
  10. android:hint="所有聊天信息"
  11. android:gravity="center"
  12. />
  13. <EditText
  14. android:id="@+id/et_input"
  15. android:layout_below="@+id/et_show"
  16. android:layout_width="fill_parent"
  17. android:layout_height="wrap_content"
  18. android:hint="输入聊天信息"
  19. android:gravity="center"
  20. />
  21. <Button
  22. android:id="@+id/bt_send"
  23. android:layout_below="@+id/et_input"
  24. android:layout_width="fill_parent"
  25. android:layout_height="wrap_content"
  26. android:text="发送信息"
  27. />
  28. </RelativeLayout>

接着是MainAvitvity.java



[java] view plain copy print ?
  1. publicclassMainActivityextendsActivity{
  2. privateEditTextet_show,et_input;
  3. privateButtonbt_send;
  4. privateOutputStreamos;
  5. privateHandlerhandler;
  6. @Override
  7. protectedvoidonCreate(BundlesavedInstanceState){
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_main);
  10. et_input=(EditText)this.findViewById(R.id.et_input);
  11. et_show=(EditText)this.findViewById(R.id.et_show);
  12. bt_send=(Button)this.findViewById(R.id.bt_send);
  13. try{
  14. //定义客户连接的socket
  15. Socketsocket=newSocket("本机IP",30000);
  16. //启动客户端监听线程
  17. newThread(newClinetThread(socket,handler)).start();
  18. os=socket.getOutputStream();
  19. }catch(UnknownHostExceptione){
  20. e.printStackTrace();
  21. }catch(IOExceptione){
  22. e.printStackTrace();
  23. }
  24. bt_send.setOnClickListener(newOnClickListener(){
  25. @Override
  26. publicvoidonClick(Viewv){
  27. try{
  28. //得到输入框中的内容,写入到输入流中
  29. os.write((et_input.getText().toString()+"\r\n").getBytes("utf-8"));
  30. et_input.setText("");
  31. }catch(UnsupportedEncodingExceptione){
  32. //TODOAuto-generatedcatchblock
  33. e.printStackTrace();
  34. }catch(IOExceptione){
  35. //TODOAuto-generatedcatchblock
  36. e.printStackTrace();
  37. }
  38. }
  39. });
  40. handler=newHandler(){
  41. @Override
  42. publicvoidhandleMessage(Messagemsg){
  43. super.handleMessage(msg);
  44. if(msg.what==1){
  45. //得到服务器返回的信息
  46. et_show.append("\n"+msg.obj.toString());
  47. }
  48. }
  49. };
  50. }
  51. }

第三是客户端的线程类



[java] view plain copy print ?
  1. publicclassClinetThreadimplementsRunnable{
  2. Socketsocket=null;
  3. Handlerhandler=null;
  4. BufferedReaderbr=null;
  5. publicClinetThread(Socketsocket,Handlerhandler){
  6. this.socket=socket;
  7. this.handler=handler;
  8. try{
  9. br=newBufferedReader(newInputStreamReader(socket.getInputStream()));
  10. }catch(IOExceptione){
  11. e.printStackTrace();
  12. }
  13. }
  14. @Override
  15. publicvoidrun(){
  16. Stringcontent=null;
  17. try{
  18. while((content=br.readLine())!=null){
  19. Messagemsg=newMessage();
  20. msg.what=1;
  21. msg.obj=content;
  22. handler.sendMessage(msg);
  23. }
  24. }catch(IOExceptione){
  25. e.printStackTrace();
  26. }
  27. }
  28. }

接下来是Java工程中的主类



[java] view plain copy print ?
  1. /**
  2. *创建ServerSocket监听的主类
  3. *该类只负责接收客户端的socket连接请求,每当客户端
  4. *连接到该serversocket之后,程序将对应socket加入到list
  5. *并为该socket开一挑单独的线程,负责socket的所有通信任务
  6. *@authorAdministrator
  7. *
  8. */
  9. publicclassSimpleServer{
  10. //定义保存所有Socket的ArrayList
  11. publicstaticArrayList<Socket>socketList=newArrayList<Socket>();
  12. publicstaticvoidmain(String[]args){
  13. try{
  14. ServerSocketss=newServerSocket(30000);
  15. while(true){
  16. Sockets=ss.accept();
  17. socketList.add(s);
  18. newThread(newServerThead(s)).start();
  19. }
  20. }catch(IOExceptione){
  21. e.printStackTrace();
  22. }
  23. }
  24. }

其次java工程中的线程类



[java] view plain copy print ?
  1. /**
  2. *负责每个线程通信的类
  3. *该类不断读取客户端数据,使用自定义的readFromClient()方法读取
  4. *客户端数据,如果出现异常表明该socket对应的客户端socket出现了问题
  5. *程序将该socket从list中移除。
  6. *当服务器线程读取到了客户端数据后,遍历list集合,并将数据发送到每个
  7. *socket中
  8. *@authorAdministrator
  9. *
  10. */
  11. publicclassServerTheadimplementsRunnable{
  12. //定义当前线程处理的socket
  13. Sockets=null;
  14. //该线程所处理的socket对应的输入流
  15. BufferedReaderbr=null;
  16. publicServerThead(Sockets)throwsIOException{
  17. this.s=s;
  18. br=newBufferedReader(newInputStreamReader(s.getInputStream()));
  19. }
  20. @Override
  21. publicvoidrun(){
  22. Stringconntent=null;
  23. while((conntent=readFromClient())!=null){
  24. //遍历socket中的每一个socket
  25. for(Sockets:SimpleServer.socketList){
  26. try{
  27. OutputStreamos=s.getOutputStream();
  28. os.write((conntent+"\n").getBytes("utf-8"));
  29. }catch(IOExceptione){
  30. e.printStackTrace();
  31. }
  32. }
  33. }
  34. }
  35. privateStringreadFromClient(){
  36. try{
  37. returnbr.readLine();
  38. }catch(IOExceptione){
  39. e.printStackTrace();
  40. SimpleServer.socketList.remove(s);
  41. }
  42. returnnull;
  43. }
  44. }
  45. 转载请标明出处:雅荷湾

更多相关文章

  1. Nginx系列教程(二)| 一文带你读懂Nginx的正向与反向代理
  2. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  3. 【资源介绍】iGou Android(安卓)开发视频教程
  4. Android微信支付功能集成【全攻略】
  5. Android(安卓)源码解析Handler处理机制(一)
  6. android解决dialog和popupwindow的BadTokenException:Unable to
  7. Android(安卓)NDK——必知必会之Native线程操作及线程同步全面详
  8. Android(安卓)ANR分析
  9. Android之AsyncTask的用法

随机推荐

  1. Android中的动画详解系列【1】——逐帧动
  2. 2011.09.09(2)——— android 桌面添加快捷
  3. android 多点触控实例源码
  4. Android--ListView滑动时出现黑屏解决方
  5. An exisiting Android(安卓)SDK was dete
  6. 网络---《第一行代码Android》笔记
  7. android 常用代码备份
  8. Android+Junit单元测试1
  9. android 实现类似Iphone底部消息数量提示
  10. android JNI cocos2dx调用对话框