Android 之 Socket 通信

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,在里面加上'<uses-permission android:name="android.permission.INTERNET"/>'
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

<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="请输入信息" />
``` 然后兴冲冲的运行,结果……悲剧了 报错了,`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 建立连接了,但是问题很多,也仅仅只能建立连接而已,需要修改

posted @ 2015-06-16 12:18  丨落灬小莫  阅读(471)  评论(0编辑  收藏  举报