Android客户端与PC服务器通过socket进行交互实例(转)

一直以来对Android socket通信都很模糊,今天终于研究了一个网上的例子,自己又修改了下,算是对Android
socket通信有点了解了。

下面是具体的代码,说明都在注释中了。需要注意的是,只有客户端发送了信息给服务器后,服务器才能响应客户端的输入,然后返回信息给客户端,这是客户端才能读取服务器返回的信息。如果客户端和服务器都处于等待对方的信息,那样就会造成阻塞,导致ANR了。

1.服务器端代码,就是一个java程序,与android无关,运行于服务器上,即PC机上。

[java] view plaincopy

  1. import java.io.BufferedReader;

  2. import java.io.BufferedWriter;

  3. import java.io.File;

  4. import java.io.FileOutputStream;

  5. import java.io.InputStreamReader;

  6. import java.io.OutputStreamWriter;

  7. import java.io.PrintWriter;

  8. import java.net.ServerSocket;

  9. import java.net.Socket;
  10. /**

  11. * 测试Android客户端与PC服务器通过socket进行交互

  12. * 服务器端:接收客户端的信息并回送给客户

  13. * @author Ameyume

  14. *

  15. */

  16. public class Server implements Runnable {

  17. public static final String SERVERIP = "192.168.1.100";

  18. public static final int SERVERPORT = 51706;
  19. public void run() {

  20. try {

  21. System.out.println("S: Connecting...");
  22. ServerSocket serverSocket = new ServerSocket(SERVERPORT);

  23. while (true) {

  24. // 等待接受客户端请求

  25. Socket client = serverSocket.accept();
  26. System.out.println("S: Receiving...");
  27. try {

  28. // 接受客户端信息

  29. BufferedReader in = new BufferedReader(

  30. new InputStreamReader(client.getInputStream()));
  31. // 发送给客户端的消息

  32. PrintWriter out = new PrintWriter(new BufferedWriter(

  33. new OutputStreamWriter(client.getOutputStream())),true);
  34. System.out.println("S: 111111");

  35. String str = in.readLine(); // 读取客户端的信息

  36. System.out.println("S: 222222");

  37. if (str != null ) {

  38. // 设置返回信息,把从客户端接收的信息再返回给客户端

  39. out.println("You sent to server message is:" + str);

  40. out.flush();
  41. // 把客户端发送的信息保存到文件中

  42. File file = new File ("C://android.txt");

  43. FileOutputStream fops = new FileOutputStream(file);

  44. byte [] b = str.getBytes();

  45. for ( int i = 0 ; i < b.length; i++ )

  46. {

  47. fops.write(b[i]);

  48. }

  49. System.out.println("S: Received: ‘" + str + "‘");

  50. } else {

  51. System.out.println("Not receiver anything from client!");

  52. }

  53. } catch (Exception e) {

  54. System.out.println("S: Error 1");

  55. e.printStackTrace();

  56. } finally {

  57. client.close();

  58. System.out.println("S: Done.");

  59. }

  60. }

  61. } catch (Exception e) {

  62. System.out.println("S: Error 2");

  63. e.printStackTrace();

  64. }

  65. }
  66. public static void main(String [] args ) {

  67. Thread desktopServerThread = new Thread(new Server());

  68. desktopServerThread.start();
  69. }

  70. }

2.客户端程序,运行在手机或者模拟器上。

[java] view plaincopy

  1. import java.io.BufferedReader;

  2. import java.io.BufferedWriter;

  3. import java.io.InputStreamReader;

  4. import java.io.OutputStreamWriter;

  5. import java.io.PrintWriter;

  6. import java.net.InetAddress;

  7. import java.net.Socket;

  8. import java.net.UnknownHostException;
  9. import android.app.Activity;

  10. import android.os.Bundle;

  11. import android.util.Log;

  12. import android.view.View;

  13. import android.view.View.OnClickListener;

  14. import android.widget.Button;

  15. import android.widget.EditText;

  16. import android.widget.TextView;
  17. /**

  18. * 测试Android客户端与PC服务器通过socket进行交互

  19. * 客户端:把用户输入的信息发送给服务器

  20. * @author Ameyume

  21. *

  22. */

  23. public class Socket_Android extends Activity {

  24. private static final String TAG = "Socket_Android";
  25. private EditText mEditText = null;

  26. private TextView tx1 = null;

  27. private Button mButton = null;
  28. @Override

  29. public void onCreate(Bundle savedInstanceState) {

  30. super.onCreate(savedInstanceState);

  31. setContentView(R.layout.main);
  32. mButton = (Button)findViewById(R.id.Button01);

  33. mEditText = (EditText)findViewById(R.id.etSendMsg);

  34. tx1 = (TextView)findViewById(R.id.tx);
  35. mButton.setOnClickListener(new OnClickListener() {
  36. @Override

  37. public void onClick(View v) {

  38. // TODO Auto-generated method stub

  39. setTitle("测试Socket连接");

  40. Socket socket = null;
  41. try {

  42. /* 指定Server的IP地址,此地址为局域网地址,如果是使用WIFI上网,则为PC机的WIFI IP地址

  43. * 在ipconfig查看到的IP地址如下:

  44. * Ethernet adapter 无线网络连接:

  45. * Connection-specific DNS Suffix  . : IP Address. . . . . . . . . . . . : 192.168.1.100

  46. */

  47. InetAddress serverAddr = InetAddress.getByName("192.168.1.100");// TCPServer.SERVERIP

  48. Log.d("TCP", "C: Connecting...");
  49. // 应用Server的IP和端口建立Socket对象

  50. socket = new Socket(serverAddr, 51706);

  51. String message = "---Test_Socket_Android---";
  52. Log.d("TCP", "C: Sending: ‘" + message + "‘");
  53. // 将信息通过这个对象来发送给Server

  54. PrintWriter out = new PrintWriter(new BufferedWriter(

  55. new OutputStreamWriter(socket.getOutputStream())),

  56. true);
  57. // 把用户输入的内容发送给server

  58. String toServer = mEditText.getText().toString();

  59. Log.d(TAG, "To server:‘" + toServer + "‘");

  60. out.println(toServer);

  61. out.flush();
  62. // 接收服务器信息

  63. BufferedReader in = new BufferedReader(

  64. new InputStreamReader(socket.getInputStream()));

  65. // 得到服务器信息

  66. String msg = in.readLine();

  67. Log.d(TAG, "From server:‘" + msg + "‘");

  68. // 在页面上进行显示

  69. tx1.setText(msg);

  70. } catch(UnknownHostException e) {

  71. Log.e(TAG, "192.168.1.100 is unkown server!");

  72. } catch(Exception e) {

  73. e.printStackTrace();

  74. } finally {

  75. try {

  76. socket.close();

  77. } catch(Exception e) {

  78. e.printStackTrace();

  79. }

  80. }

  81. }
  82. });

  83. }

  84. }

3.在客户端AndroidManifest.xml文件增加访问互联网的权限

[html] view plaincopy

  1. <uses-permission android:name="android.permission.INTERNET" />

4.运行效果:

服务器接的log输出:

S: Receiving...
S: 111111
S: 222222
S: Received: ‘hello‘
S:
Done.

本文参考自:Android通过socket连接服务器(PC)

Android客户端与PC服务器通过socket进行交互实例(转),布布扣,bubuko.com

时间: 2024-08-01 10:31:57

Android客户端与PC服务器通过socket进行交互实例(转)的相关文章

Android客户端与本地服务器Socket通信

Android客户端与本地服务器Socket通信 Socket服务器运行结果图?? 一.客户端和服务器端的选择: 客户端是我们手机端,关于服务器端,只要安装了JDK,自然就拥有通讯的功能,我们只需要在Eclipse或者MyEclipse中写好文章中服务器端的代码,运行起来即可,用accept()方法启动服务器端,等待客户端的连接,在未连接的情况下,服务器端处于堵塞的状态. 二.客户端注意事项 andriod客户端添加网络访问权限 <uses-permission android:name="

Android客户端与云服务器进行网络通信

多写技术文档,多写技术文档,多写技术文档,重要的事情说三遍...... ------------------------------------------------------------------------------------------------------------------- 功能需求:Android客户端解析和显示云服务器返回的xml文件. 思路:涉及到Android端应用和Java ee端web应用的编码实现. 示例:Android客户端获取腾讯云服务器上的视频资讯

android手机客户端与pc机进行socket通信

这两天做了一个手机和电脑通信利用socket进行网络通信的小程序,上图先: 在写程序的过程中发现了很多问题... 一.电脑和手机的IP必须在同一个网段,也就是IP的前三段必须是一样的. 刚开始电脑和手机都连着老师办公室的 无线,可是却连不上..折腾了好久才发现虽然都是连在同一个路由器,网段却不一样.(老师说应该是一样的,我也不知道怎么回事.)后来修改了手机的IP地址,才能连上.关于如何修改手机IP,百度一下就OK了. 二.ReadLine()读数据阻塞问题 终于连接上了,却读不出数据.经过deb

通过android 客户端上传图片到服务器

昨天,(在我的上一篇博客中)写了通过浏览器上传图片到服务器(php),今天将这个功能付诸实践.(还完善了服务端的代码) 不试不知道,原来通过android 向服务端发送图片还真是挺麻烦的一件事. 上传代码: /* 上传文件至Server的方法 */ private void uploadFile() { String end = "\r\n"; String twoHyphens = "--"; String boundary = "*****"

Android客户端与Java服务器交互数据(一)SAE服务器搭建

平时大家的测试服务器都是运行在自己的PC上面,用Tomcat或者IIS搭建的本机服务器.其实新浪云平台SinaAppEngine也是挺好用的.今天总结一下我使用过程中的一些小心得: 1.创建SAE应用: 登陆http://sae.sina.com.cn/进行注册,微博帐号可以直接登陆.注册成功后进入"我的首页",控制台>应用管理>创建新应用 然后输入二级域名(应用的唯一标示),应用名称和其他信息,最后选择开发语言,这里以Java为例: JVM级别选择"经济版&qu

Android客户端与Java服务器交互数据(二)阿里云ACE服务器搭建

前段时间写了一个新浪SAE部署代码的小总结,刚好今天阿里云云引擎ACE公测的审核资格通过了,就来对比一下ACE与新浪SAE的使用. 首先是账号,ACE作为阿里产品自然可以通过淘宝账号直接登录,而SAE则可以通过微博账号登录. http://www.aliyun.com/ 阿里云的主营业务比较多,主页很花哨,点击右上角的"管理控制台",然后进入"云引擎ACE",创建应用环境: 这里先写一个简单的JSP工程作为演示,打开Eclipse for JavaEE,然后File

Android客户端通过Socket连接服务器

Android客户端通过Socket连接服务器. Android互联网项目中,绝大部分都有连接远程服务器的需求,连接的方式有多种,可以是TCP的方式,当然也可以通过Socket的方式. 相对于TCP的方式,Socket的方式略显的较为原始,对于客户端来说,复杂度反而比TCP的方式还要高一些,毕竟TCP的连接有现成的框架可以使用, 比如Spring等. 而使用socket方式这些工作完全需要客户端来做,也增加了客户端的工作量,不过凡事有利弊,通过socket的方式,流量上 相对于TCP等的方式更加

Android客户端与服务器交互方式-小结

最近的Android项目开发过程中一个问题困扰自己很长时间,Android客户端与服务器交互有几种方式,最常见的就是webservices和json.要在Android手机客户端与pc服务器交互,需要满足下面几种条件:跨平台.传输数据格式标准.交互方便. 为了与服务器通讯其实无非就两种协议HTTP和TCP,TCP的学习Socket,HTTP的话熟悉一下HTTP协议和相关Java API.而下面的几种方式就是从这两种协议扩展出来的:webservices soap.SSH的JSON(可参考:该链接

SSH服务器与Android通信(3)--Android客户端发送数据

Android客户端向SSH服务器发送数据主要有三种情况:通过客户端删除数据.添加数据和修改数据. 1.删除数据 先看看jsp文件里面是怎样删除数据的: <td align="center"><a href="clasdelete.action?id=<s:property value='#st.id'/>" onclick="if(!window.confirm('是否删除'))return false;" >