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 建立连接了,但是问题很多,也仅仅只能建立连接而已,需要修改
Android 之 Socket 通信的更多相关文章
- Android之Socket通信、List加载更多、Spinner下拉列表
Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务 ...
- Android开发--Socket通信
一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是"请求-响应方式",即在请求时 ...
- 基于android的Socket通信
一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户 ...
- Android中Socket通信之TCP与UDP传输原理
一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是"请求-响应方式",即在请求时 ...
- Android 蓝牙 socket通信
Android中蓝牙模块的使用 使用蓝牙API,Android应用程序能够执行以下功能: 扫描其他蓝牙设备查询本地已经配对的蓝牙适配器建立RFCOMM通道通过服务发现来连接其他设备在设备间传输数据管理 ...
- android adb socket 通信
今天遇到一个问题:pc客户端和android的App通信,心跳通道(心跳包27个字节,是一个业务空包)在部分pc上总是会超时(5秒超时),nagle算法也给禁用了,pc端时按按量发送心跳的,怀疑来怀疑 ...
- Android之Socket通信(一)
一.服务器端,运行在PC机上 import java.io.*; import java.net.*; public class SimpleServer{ public static voi ...
- Android中Socket通信案例
以下这个案例是基于TCP/UDP协议的. 服务端实现代码 基于TCP的服务端协议 // 声明一个ServerSocket对象 ServerSocket serverSocket = null; try ...
- Android笔记——Socket通信实现简单聊天室
两部分,客户端和服务端 ---------------------------------------------------------------- 客户端 1.为防止ANR异常,互联网连接可用 ...
随机推荐
- 搜索(DLX重复覆盖模板):HDU 2295 Radar
Radar Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- [转]web调试工具总结(firebug/fidder/httpwatch/wireshark)
ONE:Firebug: Firebug是网页浏览器 Mozilla Firefox下的一款开发类插件, 现属于Firefox的五星级强力推荐插件之一.它集HTML查看和编辑.Javascript控制 ...
- Linux趣谈
要解释操作系统是如何工作的,首先可以用这几个关键字来简单地概括一下:冯诺依曼.堆栈机制和中断机制. 提到冯诺依曼很显然就是在说存储程序了,这大概是计算机能够运行最为基础的条件,属于基石级别的.它的基本 ...
- php非阻塞执行系统命令
大家都知道php调用系统命令常用的主要有以下几种方法: 如exec(), system(), passthru(), shell_exec() 这几个函数的用法在此不做说明,有需要的请查阅php相关手 ...
- mkdir、whoami、touch
mkdir whoami touch:"摸",如果文件不存在,就建立新文件,如果存在,就改变文件的访问时间atime等时间戳信息. mkdir aa ls –ld aa 创建多级目 ...
- Apache 虚拟主机 VirtualHost 配置
虚拟主机 (Virtual Host) 是在同一台机器搭建属于不同域名或者基于不同 IP 的多个网站服务的技术. 可以为运行在同一物理机器上的各个网站指配不同的 IP 和端口, 也可让多个网站拥有不同 ...
- webapp 慎用setInterval、setTimeout
其实这片文章刚开始我啥也没写的,但也有20多的访问量,所以觉得大家还是比较关注这个问题,所以找机会写下. 问题的引出: 为什么我说的时webapp中慎用setInterval.setTimeout, ...
- ar技术序章-SDK介绍和选择
转自: http://blog.csdn.net/kun1234567/article/details/10402535 ar技术序章-SDK介绍和选择 分类: Augmented Reality20 ...
- 命令 "sudo -H" 中的这个 "H" 什么作用?
脚本中使用$HOME变量 问题描述:某些同事原来写的脚本中包含如下内容. BIN_DIR=${HOME}/tools TAIR_BIN_DIR=${HOME}/tair_bin TAIR_SRC_DI ...
- onethink加密解密函数
onethink中封装的加密解密函数 <?php /** * 系统加密方法 * @param string $data 要加密的字符串 * @param string $key 加密密钥 * @ ...