Android 之 Socket 通信

联系一下 Socket 编程,之后需要将一个 JavaEE 项目移植到 Android,暂时现尝试写一个简单的 DEMO,理解一下 Socket

Server 端编程

import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileOutputStream;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;/** * 测试Android客户端与PC服务器通过socket进行交互 * 服务器端:接收客户端的信息并回送给客户 * @author Dream_Kidd * @since 2015年06月16日11:39:14 */public class Server implements Runnable {public static final int SERVERPORT = 51706;private ServerSocket serverSocket;public void run() {try {System.out.println("S: Connecting...");serverSocket = new ServerSocket(SERVERPORT);while (true) {    // 等待接受客户端请求 Socket client = serverSocket.accept();System.out.println("S: Receiving...");try {    // 接受客户端信息BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));                    // 发送给客户端的消息                     PrintWriter out = new PrintWriter(new BufferedWriter(                    new OutputStreamWriter(client.getOutputStream())),true);                                        System.out.println("S:  receive a new message");                    String str = in.readLine(); // 读取客户端的信息                    System.out.println("S: read message over");                    if (str != null ) {                    // 设置返回信息,把从客户端接收的信息再返回给客户端                    out.println("You sent to server message is:" + str);                    out.flush();System.out.println("S: Received: '" + str + "'");                    } else {                    System.out.println("Not receiver anything from client!");                    }} catch (Exception e) {System.out.println("S: Error 1"+e.getMessage());e.printStackTrace();} finally {client.close();System.out.println("S: Done.");}}} catch (Exception e) {System.out.println("S: Error 2"+e.getMessage());e.printStackTrace();}}public static void main(String [] args ) {Thread desktopServerThread = new Thread(new Server());desktopServerThread.start();}}

在此处基本没什么问题,直接运行即可等待客户端连接

Client编程

1.修改manifest,在里面加上' '
2.编写 Client 代码

package com.example.dream_kidd.testsocket;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.Socket;import java.net.UnknownHostException;public class MainActivity extends Activity {    private Socket socket;    private Button bt;    private TextView tx;    private EditText et;    private static final String host = "192.168.50.73";    private static final int port = 51706;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        bt= (Button) findViewById(R.id.but1);        tx= (TextView) findViewById(R.id.tx1);        et= (EditText) findViewById(R.id.et);        bt.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                setTitle("Test Socket");                                try {                    socket = new Socket(host, port);                    Log.d("TCP","Client...Connecting");                    PrintWriter out = new PrintWriter(new BufferedWriter(                            new OutputStreamWriter(socket.getOutputStream())),                            true);                    //接受服务器信息                    BufferedReader in = new BufferedReader(                            new InputStreamReader(socket.getInputStream()));                    //得到服务器信息                    String msg = in.readLine();                    //在页面上进行显示                    tx.setText(msg);                    out.println(msg);                    out.flush();                } catch (UnknownHostException e) {                    e.printStackTrace();                } catch (IOException e) {                    e.printStackTrace();                }            }            }        });    }}

3.直接在 IDE 中托拉拽,生成的布局xml

<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"    android:orientation="vertical">    <TextView        android:id="@+id/tx1"        android:layout_width="match_parent"        android:layout_height="89dp"        android:layout_x="2dp"        android:layout_y="87dp"        android:text=" receive:" />    <Button        android:id="@+id/but1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="sendmsg"        android:layout_x="277dp"        android:layout_y="11dp" />    <EditText        android:id="@+id/et"        android:layout_width="253dp"        android:layout_height="wrap_content"        android:text="请输入信息" /></AbsoluteLayout>

然后兴冲冲的运行,结果……悲剧了
报错了,NetworkOnMainThreadException,google一下,发现这个是在安卓2.3之后,google 不允许在主线程中访问网络,
那就起一个线程,修改后代码如下

## Android 之 Socket 通信联系一下 Socket 编程,之后需要将一个 JavaEE 项目移植到 Android,暂时现尝试写一个简单的 DEMO,理解一下 Socket### Server 端编程

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

/**

  • 测试Android客户端与PC服务器通过socket进行交互
  • 服务器端:接收客户端的信息并回送给客户
  • @author Dream_Kidd
  • @since 2015年06月16日11:39:14
    */
    public class Server implements Runnable {
    public static final int SERVERPORT = 51706;
    private ServerSocket serverSocket;

    public void run() {
    try {
    System.out.println("S: Connecting...");

    serverSocket = new ServerSocket(SERVERPORT);while (true) {    // 等待接受客户端请求 Socket client = serverSocket.accept();System.out.println("S: Receiving...");try {    // 接受客户端信息BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));            // 发送给客户端的消息             PrintWriter out = new PrintWriter(new BufferedWriter(            new OutputStreamWriter(client.getOutputStream())),true);            System.out.println("S:  receive a new message");            String str = in.readLine(); // 读取客户端的信息            System.out.println("S: read message over");            if (str != null ) {            // 设置返回信息,把从客户端接收的信息再返回给客户端                out.println("You sent to server message is:" + str);                out.flush();System.out.println("S: Received: '" + str + "'");            } else {            System.out.println("Not receiver anything from client!");            }} catch (Exception e) {System.out.println("S: Error 1"+e.getMessage());e.printStackTrace();} finally {client.close();System.out.println("S: Done.");}}} catch (Exception e) {System.out.println("S: Error 2"+e.getMessage());e.printStackTrace();}

    }

    public static void main(String [] args ) {
    Thread desktopServerThread = new Thread(new Server());
    desktopServerThread.start();
    }
    }
    ```

在此处基本没什么问题,直接运行即可等待客户端连接

Client编程

1.修改manifest,在里面加上' '
2.编写 Client 代码

package com.example.dream_kidd.testsocket;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.Socket;import java.net.UnknownHostException;public class MainActivity extends Activity {    private Socket socket;    private Button bt;    private TextView tx;    private EditText et;    private static final String host = "192.168.50.73";    private static final int port = 51706;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        bt= (Button) findViewById(R.id.but1);        tx= (TextView) findViewById(R.id.tx1);        et= (EditText) findViewById(R.id.et);        bt.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                setTitle("Test Socket");                                try {                    socket = new Socket(host, port);                    Log.d("TCP","Client...Connecting");                    PrintWriter out = new PrintWriter(new BufferedWriter(                            new OutputStreamWriter(socket.getOutputStream())),                            true);                    //接受服务器信息                    BufferedReader in = new BufferedReader(                            new InputStreamReader(socket.getInputStream()));                    //得到服务器信息                    String msg = in.readLine();                    //在页面上进行显示                    tx.setText(msg);                    out.println(msg);                    out.flush();                } catch (UnknownHostException e) {                    e.printStackTrace();                } catch (IOException e) {                    e.printStackTrace();                }            }            }        });    }}

3.直接在 IDE 中托拉拽,生成的布局xml

<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"    android:orientation="vertical">    <TextView        android:id="@+id/tx1"        android:layout_width="match_parent"        android:layout_height="89dp"        android:layout_x="2dp"        android:layout_y="87dp"        android:text=" receive:" />    <Button        android:id="@+id/but1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="sendmsg"        android:layout_x="277dp"        android:layout_y="11dp" />    <EditText        android:id="@+id/et"        android:layout_width="253dp"        android:layout_height="wrap_content"        android:text="请输入信息" /></AbsoluteLayout>

然后兴冲冲的运行,结果……悲剧了
报错了,NetworkOnMainThreadException,google一下,发现这个是在安卓2.3之后,google 不允许在主线程中访问网络,
那就起一个线程,修改后代码如下

package com.example.dream_kidd.testsocket;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.Socket;import java.net.UnknownHostException;public class MainActivity extends Activity {    private Socket socket;    private Button bt;    private TextView tx;    private EditText et;    private static final String host = "192.168.50.73";    private static final int port = 51706;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        bt= (Button) findViewById(R.id.but1);        tx= (TextView) findViewById(R.id.tx1);        et= (EditText) findViewById(R.id.et);        final Thread t = new Thread(new Runnable() {            @Override            public void run() {                try {                    socket = new Socket(host, port);                    Log.d("TCP","Client...Connecting");                    PrintWriter out = new PrintWriter(new BufferedWriter(                            new OutputStreamWriter(socket.getOutputStream())),                            true);                    //接受服务器信息                    BufferedReader in = new BufferedReader(                            new InputStreamReader(socket.getInputStream()));                    //得到服务器信息                    String msg = in.readLine();                    //在页面上进行显示                    tx.setText(msg);                    out.println(msg);                    out.flush();                } catch (UnknownHostException e) {                    e.printStackTrace();                } catch (IOException e) {                    e.printStackTrace();                }            }        });        bt.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                setTitle("Test Socket");                t.start();            }        });    }}

这样即可与 Service 建立连接了,但是问题很多,也仅仅只能建立连接而已,需要修改

更多相关文章

  1. Android上传文件,客户端+服务器源码
  2. Android 的网络编程(15)-Http JSon服务器端和客户端通信
  3. android 9.0 设置 应用应用信息 隐藏 app
  4. Android 博客园客户端 (一) 基本界面
  5. Android--通过ContentResolver取得com.android.providers.media
  6. android微博客户端源代码
  7. Android取得系统信息和分辨率内存信息

随机推荐

  1. [Android] conversion to dalvik format
  2. android 应用程序性能跟踪
  3. android 取手机号码
  4. Android发送Email
  5. Android ScrollView 使用注意事项
  6. Android uses-permission 总结
  7. Android Interview Questions & Answers
  8. error: style attribute '@android:attr/
  9. android.databinding.tool.util.LoggedEr
  10. Android 监听Fragment界面的点击事件