http://blog.csdn.net/x605940745/article/details/17001641转载请注明出处

注意点:注册访问的网络权限;android中UI线程不能有访问网络的操作,否则会报android.os.NetworkOnMainThreadException的异常

[html] view plain copy
  1. <uses-permission
  2. android:name="android.permission.INTERNET"/>

      Android开发联盟③ 433233634

实例一

客户端


[java] view plain copy
  1. packagecom.android.xiong.simplesocket;
  2. importjava.io.BufferedReader;
  3. importjava.io.IOException;
  4. importjava.io.InputStreamReader;
  5. importjava.io.OutputStream;
  6. importjava.net.InetSocketAddress;
  7. importjava.net.Socket;
  8. importjava.net.SocketTimeoutException;
  9. importandroid.app.Activity;
  10. importandroid.os.Bundle;
  11. importandroid.os.Handler;
  12. importandroid.os.Message;
  13. importandroid.view.Menu;
  14. importandroid.view.View;
  15. importandroid.view.View.OnClickListener;
  16. importandroid.widget.Button;
  17. importandroid.widget.EditText;
  18. importandroid.widget.TextView;
  19. publicclassMainActivityextendsActivity{
  20. Socketsocket=null;
  21. Stringbuffer="";
  22. TextViewtxt1;
  23. Buttonsend;
  24. EditTexted1;
  25. Stringgeted1;
  26. publicHandlermyHandler=newHandler(){
  27. @Override
  28. publicvoidhandleMessage(Messagemsg){
  29. if(msg.what==0x11){
  30. Bundlebundle=msg.getData();
  31. txt1.append("server:"+bundle.getString("msg")+"\n");
  32. }
  33. }
  34. };
  35. @Override
  36. protectedvoidonCreate(BundlesavedInstanceState){
  37. super.onCreate(savedInstanceState);
  38. setContentView(R.layout.activity_main);
  39. txt1=(TextView)findViewById(R.id.txt1);
  40. send=(Button)findViewById(R.id.send);
  41. ed1=(EditText)findViewById(R.id.ed1);
  42. send.setOnClickListener(newOnClickListener(){
  43. @Override
  44. publicvoidonClick(Viewv){
  45. geted1=ed1.getText().toString();
  46. txt1.append("client:"+geted1+"\n");
  47. //启动线程向服务器发送和接收信息
  48. newMyThread(geted1).start();
  49. }
  50. });
  51. }
  52. classMyThreadextendsThread{
  53. publicStringtxt1;
  54. publicMyThread(Stringstr){
  55. txt1=str;
  56. }
  57. @Override
  58. publicvoidrun(){
  59. //定义消息
  60. Messagemsg=newMessage();
  61. msg.what=0x11;
  62. Bundlebundle=newBundle();
  63. bundle.clear();
  64. try{
  65. //连接服务器并设置连接超时为5秒
  66. socket=newSocket();
  67. socket.connect(newInetSocketAddress("1.1.9.30",30000),5000);
  68. //获取输入输出流
  69. OutputStreamou=socket.getOutputStream();
  70. BufferedReaderbff=newBufferedReader(newInputStreamReader(
  71. socket.getInputStream()));
  72. //读取发来服务器信息
  73. Stringline=null;
  74. buffer="";
  75. while((line=bff.readLine())!=null){
  76. buffer=line+buffer;
  77. }
  78. //向服务器发送信息
  79. ou.write("android客户端".getBytes("gbk"));
  80. ou.flush();
  81. bundle.putString("msg",buffer.toString());
  82. msg.setData(bundle);
  83. //发送消息修改UI线程中的组件
  84. myHandler.sendMessage(msg);
  85. //关闭各种输入输出流
  86. bff.close();
  87. ou.close();
  88. socket.close();
  89. }catch(SocketTimeoutExceptionaa){
  90. //连接超时在UI界面显示消息
  91. bundle.putString("msg","服务器连接失败!请检查网络是否打开");
  92. msg.setData(bundle);
  93. //发送消息修改UI线程中的组件
  94. myHandler.sendMessage(msg);
  95. }catch(IOExceptione){
  96. e.printStackTrace();
  97. }
  98. }
  99. }
  100. @Override
  101. publicbooleanonCreateOptionsMenu(Menumenu){
  102. //Inflatethemenu;thisaddsitemstotheactionbarifitispresent.
  103. getMenuInflater().inflate(R.menu.main,menu);
  104. returntrue;
  105. }
  106. }

[html] view plain copy
  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. android:paddingBottom="@dimen/activity_vertical_margin"
  6. android:paddingLeft="@dimen/activity_horizontal_margin"
  7. android:paddingRight="@dimen/activity_horizontal_margin"
  8. android:paddingTop="@dimen/activity_vertical_margin"
  9. tools:context=".MainActivity">
  10. <EditText
  11. android:id="@+id/ed1"
  12. android:layout_width="match_parent"
  13. android:layout_height="wrap_content"
  14. android:hint="给服务器发送信息"/>
  15. <Button
  16. android:id="@+id/send"
  17. android:layout_width="match_parent"
  18. android:layout_height="wrap_content"
  19. android:layout_below="@id/ed1"
  20. android:text="发送"/>
  21. <TextView
  22. android:id="@+id/txt1"
  23. android:layout_width="match_parent"
  24. android:layout_height="wrap_content"
  25. android:layout_below="@id/send"/>
  26. </RelativeLayout>

服务端

[java] view plain copy
  1. packagecom.android.net;
  2. importjava.io.IOException;
  3. importjava.net.ServerSocket;
  4. importjava.net.Socket;
  5. importjava.util.ArrayList;
  6. importjava.util.List;
  7. publicclassAndroidService{
  8. publicstaticvoidmain(String[]args)throwsIOException{
  9. ServerSocketserivce=newServerSocket(30000);
  10. while(true){
  11. //等待客户端连接
  12. Socketsocket=serivce.accept();
  13. newThread(newAndroidRunable(socket)).start();
  14. }
  15. }
  16. }

[java] view plain copy
  1. packagecom.android.net;
  2. importjava.io.BufferedReader;
  3. importjava.io.BufferedWriter;
  4. importjava.io.IOException;
  5. importjava.io.InputStream;
  6. importjava.io.InputStreamReader;
  7. importjava.io.OutputStream;
  8. importjava.io.OutputStreamWriter;
  9. importjava.io.PrintWriter;
  10. importjava.net.Socket;
  11. publicclassAndroidRunableimplementsRunnable{
  12. Socketsocket=null;
  13. publicAndroidRunable(Socketsocket){
  14. this.socket=socket;
  15. }
  16. @Override
  17. publicvoidrun(){
  18. //向android客户端输出helloworild
  19. Stringline=null;
  20. InputStreaminput;
  21. OutputStreamoutput;
  22. Stringstr="helloworld!";
  23. try{
  24. //向客户端发送信息
  25. output=socket.getOutputStream();
  26. input=socket.getInputStream();
  27. BufferedReaderbff=newBufferedReader(
  28. newInputStreamReader(input));
  29. output.write(str.getBytes("gbk"));
  30. output.flush();
  31. //半关闭socket
  32. socket.shutdownOutput();
  33. //获取客户端的信息
  34. while((line=bff.readLine())!=null){
  35. System.out.print(line);
  36. }
  37. //关闭输入输出流
  38. output.close();
  39. bff.close();
  40. input.close();
  41. socket.close();
  42. }catch(IOExceptione){
  43. e.printStackTrace();
  44. }
  45. }
  46. }

实例二

客户端

[java] view plain copy
  1. packagecom.android.xiong.sockettwotest;
  2. importandroid.app.Activity;
  3. importandroid.os.Bundle;
  4. importandroid.os.Handler;
  5. importandroid.os.Message;
  6. importandroid.view.Menu;
  7. importandroid.view.View;
  8. importandroid.view.View.OnClickListener;
  9. importandroid.widget.Button;
  10. importandroid.widget.EditText;
  11. importandroid.widget.TextView;
  12. publicclassMainActivityextendsActivity{
  13. //定义界面上的两个文本框
  14. EditTextinput;
  15. TextViewshow;
  16. //定义界面上的一个按钮
  17. Buttonsend;
  18. Handlerhandler;
  19. //定义与服务器通信的子线程
  20. ClientThreadclientThread;
  21. @Override
  22. protectedvoidonCreate(BundlesavedInstanceState){
  23. super.onCreate(savedInstanceState);
  24. setContentView(R.layout.activity_main);
  25. input=(EditText)findViewById(R.id.input);
  26. show=(TextView)findViewById(R.id.show);
  27. send=(Button)findViewById(R.id.send);
  28. handler=newHandler(){
  29. @Override
  30. publicvoidhandleMessage(Messagemsg){
  31. //如果消息来自子线程
  32. if(msg.what==0x123){
  33. //将读取的内容追加显示在文本框中
  34. show.append("\n"+msg.obj.toString());
  35. }
  36. }
  37. };
  38. clientThread=newClientThread(handler);
  39. //客户端启动ClientThread线程创建网络连接、读取来自服务器的数据
  40. newThread(clientThread).start();
  41. send.setOnClickListener(newOnClickListener(){
  42. @Override
  43. publicvoidonClick(Viewv){
  44. try{
  45. //当用户按下按钮之后,将用户输入的数据封装成Message
  46. //然后发送给子线程Handler
  47. Messagemsg=newMessage();
  48. msg.what=0x345;
  49. msg.obj=input.getText().toString();
  50. clientThread.revHandler.sendMessage(msg);
  51. input.setText("");
  52. }catch(Exceptione){
  53. }
  54. }
  55. });
  56. }
  57. @Override
  58. publicbooleanonCreateOptionsMenu(Menumenu){
  59. getMenuInflater().inflate(R.menu.main,menu);
  60. returntrue;
  61. }
  62. }

[java] view plain copy
  1. packagecom.android.xiong.sockettwotest;
  2. importjava.io.BufferedReader;
  3. importjava.io.IOException;
  4. importjava.io.InputStreamReader;
  5. importjava.io.OutputStream;
  6. importjava.net.InetSocketAddress;
  7. importjava.net.Socket;
  8. importjava.net.SocketTimeoutException;
  9. importandroid.os.Handler;
  10. importandroid.os.Looper;
  11. importandroid.os.Message;
  12. publicclassClientThreadimplementsRunnable{
  13. privateSockets;
  14. //定义向UI线程发送消息的Handler对象
  15. Handlerhandler;
  16. //定义接收UI线程的Handler对象
  17. HandlerrevHandler;
  18. //该线程处理Socket所对用的输入输出流
  19. BufferedReaderbr=null;
  20. OutputStreamos=null;
  21. publicClientThread(Handlerhandler){
  22. this.handler=handler;
  23. }
  24. @Override
  25. publicvoidrun(){
  26. s=newSocket();
  27. try{
  28. s.connect(newInetSocketAddress("1.1.9.30",3000),5000);
  29. br=newBufferedReader(newInputStreamReader(s.getInputStream()));
  30. os=s.getOutputStream();
  31. //启动一条子线程来读取服务器相应的数据
  32. newThread(){
  33. @Override
  34. publicvoidrun(){
  35. Stringcontent=null;
  36. //不断的读取Socket输入流的内容
  37. try{
  38. while((content=br.readLine())!=null){
  39. //每当读取到来自服务器的数据之后,发送的消息通知程序
  40. //界面显示该数据
  41. Messagemsg=newMessage();
  42. msg.what=0x123;
  43. msg.obj=content;
  44. handler.sendMessage(msg);
  45. }
  46. }catch(IOExceptionio){
  47. io.printStackTrace();
  48. }
  49. }
  50. }.start();
  51. //为当前线程初始化Looper
  52. Looper.prepare();
  53. //创建revHandler对象
  54. revHandler=newHandler(){
  55. @Override
  56. publicvoidhandleMessage(Messagemsg){
  57. //接收到UI线程的中用户输入的数据
  58. if(msg.what==0x345){
  59. //将用户在文本框输入的内容写入网络
  60. try{
  61. os.write((msg.obj.toString()+"\r\n")
  62. .getBytes("gbk"));
  63. }catch(Exceptione){
  64. e.printStackTrace();
  65. }
  66. }
  67. }
  68. };
  69. //启动Looper
  70. Looper.loop();
  71. }catch(SocketTimeoutExceptione){
  72. Messagemsg=newMessage();
  73. msg.what=0x123;
  74. msg.obj="网络连接超时!";
  75. handler.sendMessage(msg);
  76. }catch(IOExceptionio){
  77. io.printStackTrace();
  78. }
  79. }
  80. }

[html] view plain copy
  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. android:paddingBottom="@dimen/activity_vertical_margin"
  6. android:paddingLeft="@dimen/activity_horizontal_margin"
  7. android:paddingRight="@dimen/activity_horizontal_margin"
  8. android:paddingTop="@dimen/activity_vertical_margin"
  9. tools:context=".MainActivity">
  10. <EditText
  11. android:id="@+id/input"
  12. android:layout_width="match_parent"
  13. android:layout_height="wrap_content"
  14. android:hint="@string/input"/>
  15. <Button
  16. android:id="@+id/send"
  17. android:layout_width="match_parent"
  18. android:layout_height="wrap_content"
  19. android:text="@string/send"
  20. android:layout_below="@id/input"/>
  21. <TextView
  22. android:id="@+id/show"
  23. android:layout_width="match_parent"
  24. android:layout_height="wrap_content"
  25. android:layout_below="@id/send"/>
  26. </RelativeLayout>

服务端


[java] view plain copy
  1. packagecom.android.net;
  2. importjava.io.IOException;
  3. importjava.net.ServerSocket;
  4. importjava.net.Socket;
  5. importjava.util.ArrayList;
  6. importjava.util.List;
  7. publicclassMyService{
  8. //定义保存所有的Socket
  9. publicstaticList<Socket>socketList=newArrayList<Socket>();
  10. publicstaticvoidmain(String[]args)throwsIOException{
  11. ServerSocketserver=newServerSocket(3000);
  12. while(true){
  13. Sockets=server.accept();
  14. socketList.add(s);
  15. //每当客户端连接之后启动一条ServerThread线程为该客户端服务
  16. newThread(newServiceThreada(s)).start();
  17. }
  18. }
  19. }


[java] view plain copy
  1. packagecom.android.net;
  2. importjava.io.BufferedReader;
  3. importjava.io.IOException;
  4. importjava.io.InputStreamReader;
  5. importjava.io.OutputStream;
  6. importjava.net.Socket;
  7. publicclassServiceThreadaimplementsRunnable{
  8. //定义当前线程处理的Socket
  9. Sockets=null;
  10. //该线程所处理的Socket所对应的输入流
  11. BufferedReaderbr=null;
  12. publicServiceThreada(Sockets){
  13. this.s=s;
  14. try{
  15. br=newBufferedReader(newInputStreamReader(s.getInputStream()));
  16. }catch(IOExceptione){
  17. e.printStackTrace();
  18. }
  19. }
  20. @Override
  21. publicvoidrun(){
  22. Stringcontent=null;
  23. //采用循环不断的从Socket中读取客户端发送过来的数据
  24. while((content=readFromClient())!=null){
  25. //遍历socketList中的每个Socket
  26. //将读取到的内容每个向Socket发送一次
  27. for(Sockets:MyService.socketList){
  28. OutputStreamos;
  29. try{
  30. os=s.getOutputStream();
  31. os.write((content+"\n").getBytes("gbk"));
  32. }catch(IOExceptione){
  33. //TODOAuto-generatedcatchblock
  34. e.printStackTrace();
  35. }
  36. }
  37. }
  38. }
  39. //定义读取客户端的信息
  40. publicStringreadFromClient(){
  41. try{
  42. returnbr.readLine();
  43. }catch(Exceptione){
  44. e.printStackTrace();
  45. }
  46. returnnull;
  47. }
  48. }

更多相关文章

  1. 万字长文带你了解最常用的开源 Squid 代理服务器
  2. Nginx系列教程(一)| 手把手教你在Linux环境下搭建Nginx服务
  3. Nginx系列教程(二)| 一文带你读懂Nginx的正向与反向代理
  4. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  5. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  6. android报The content of the adapter has changed but ListView
  7. Android(安卓)HandlerThread详解
  8. Android(安卓)Toast 总结
  9. Android(安卓)反序列化异常EOFException的解决

随机推荐

  1. 关于android各种双卡手机获取imei,imsi的
  2. 2016年末,Android岗位BAT等大厂面试题知识
  3. Android(安卓)Studio不识别新安装的字体
  4. Android实战项目——音乐播放器 由四大组
  5. 设置Android沉浸式状态栏颜色以及更改字
  6. Android理解四种启动模式
  7. android/ophone 横竖屏切换问题的解决方
  8. 不同手机在豌豆夹上显示设备同名的解决方
  9. MoDaCo.Switch 让你的 HTC One 自由转换
  10. android 集成系统分享和第三方分享案例