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,在里面加上'
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 建立连接了,但是问题很多,也仅仅只能建立连接而已,需要修改
更多相关文章
- Android上传文件,客户端+服务器源码
- Android 的网络编程(15)-Http JSon服务器端和客户端通信
- android 9.0 设置 应用应用信息 隐藏 app
- Android 博客园客户端 (一) 基本界面
- Android--通过ContentResolver取得com.android.providers.media
- android微博客户端源代码
- Android取得系统信息和分辨率内存信息