天地币:所用到的 Android Socket 通讯编程技术试验
1、为了开发“天地币”这个Android手机项目,须要用到Socket编程。
2、天地币是一种类似于比特币的虚拟货币。
3、为了赚取CSDN的C币,须要写篇博客。
4、干脆将调试Socket的项目发出来跟网友分享。
闲话休提,直接上代码,首先是字符串的定义:
<? xml version="1.0" encoding="utf-8"?>
<resources> <string name="app_name">xyzSocket</string>
<string name="hello_world">Hello world!</string>
<string name="action_settings">Settings</string>
<string name="ipaddr_str">本机IP:</string>
<string name="serveripaddr_str">服务器IP:</string>
<string name="server_str">设置为服务端</string>
<string name="client_str">连接为客户端</string>
<string name="mymachine_str">本机就是</string>
<string name="send_str">发送</string>
<string name="online_str">0在线</string>
<string name="threeline_str">第1行\n第2行\n第3行\n</string> </resources>
其次是xml文件:
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.xyzsocket.MainActivity$PlaceholderFragment" > <RelativeLayout
android:id="@+id/relativelayout_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
> <TextView
android:id="@+id/ipaddr_label_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:text="@string/ipaddr_str"
/> <EditText
android:id="@+id/myipaddr_edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/ipaddr_label_1"
android:layout_toLeftOf="@+id/noline_label_1"
/> <TextView
android:id="@+id/online_label_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:text="@string/online_str"
/> </RelativeLayout> <RelativeLayout
android:id="@+id/relativelayout_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/relativelayout_1"
> <EditText
android:id="@+id/server_receiver"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLines="3"
android:text="@string/threeline_str"
/> </RelativeLayout> <RelativeLayout
android:id="@+id/relativelayout_3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/relativelayout_2"
> <TextView
android:id="@+id/ipaddr_label_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:text="@string/serveripaddr_str"
/> <EditText
android:id="@+id/serveripaddr_edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/ipaddr_label_2"
android:layout_toLeftOf="@+id/serveripaddr_check"
/> <CheckBox
android:id="@+id/serveripaddr_check"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:text="@string/mymachine_str"
/> </RelativeLayout> <RelativeLayout
android:id="@+id/relativelayout_4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/relativelayout_3"
> <EditText
android:id="@+id/send_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toLeftOf="@+id/butt_send"
/> <Button
android:id="@+id/butt_send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="@string/send_str"
/> <LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:orientation="horizontal"
android:layout_below="@+id/send_message"
> <Button
android:id="@+id/butt_server"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/server_str"
android:layout_below="@+id/send_message"
/> <Button
android:id="@+id/butt_client"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/client_str"
android:layout_below="@+id/send_message"
/> </LinearLayout> </RelativeLayout> </RelativeLayout>
最基本的是代码:
package com.example.xyzsocket; import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList; import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.TextView;
import android.os.Build; public class MainActivity extends ActionBarActivity { private EditText et01 = null;
private EditText et02 = null;
private EditText et03 = null;
private EditText et04 = null;
private Button bn01 = null;
private Button bn02 = null;
private Button bn03 = null;
private CheckBox cb01 = null;
private TextView tv01 = null; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}
} private String intToIp(int i){
return (i & 0xFF) + "." + ((i>>8) & 0xFF) + "." + ((i>>16) & 0xFF) + "." + ((i>>24) & 0xFF);
} @Override
public void onWindowFocusChanged(boolean hasFocus) {
// TODO Auto-generated method stub
super.onWindowFocusChanged(hasFocus);
if( et01 == null ){
et01 = (EditText) findViewById(R.id.myipaddr_edit);
if(et01 != null){
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
if(!wifiManager.isWifiEnabled()){
wifiManager.setWifiEnabled(true);
}
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int ipAddress = wifiInfo.getIpAddress();
et01.setText(intToIp(ipAddress));
}
}
if( et02 == null ){
et02 = (EditText) findViewById(R.id.server_receiver);
if(et02 != null){
}
}
if( et03 == null ){
et03 = (EditText) findViewById(R.id.serveripaddr_edit);
if(et03 != null){
}
}
if( et04 == null ){
et04 = (EditText) findViewById(R.id.send_message);
if(et04 != null){
et04.setEnabled(false);
}
}
if( bn01 == null ){
bn01 = (Button) findViewById(R.id.butt_server);
if( bn01 != null ){
bn01.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
new Thread(){
@Override
public void run()
{
//网络訪问的代码放在这里
server();
}
}.start();
}
});
}
}
if( bn02 == null ){
bn02 = (Button) findViewById(R.id.butt_client);
if( bn02 != null ){
bn02.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
new Thread(){
@Override
public void run()
{
//网络訪问的代码放在这里
client();
}
}.start();
}
});
}
}
if( bn03 == null ){
bn03 = (Button) findViewById(R.id.butt_send);
if( bn03 != null ){
bn03.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
new Thread(){
@Override
public void run()
{
//网络訪问的代码放在这里
sendmsg();
}
}.start();
}
});
bn03.setEnabled(false);
}
}
if( cb01 == null ){
cb01 = (CheckBox) findViewById(R.id.serveripaddr_check);
if( cb01 != null ){
cb01.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
Message msg = new Message();
msg.arg1 = isChecked?1:0;
msg.what = 103;
handler.sendMessage(msg);
}
});
}
}
if( tv01 == null ){
tv01 = (TextView) findViewById(R.id.online_label_1);
if( tv01 != null ){ }
}
} @Override
public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
} /**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment { public PlaceholderFragment() {
} @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container,
false);
return rootView;
}
} private Handler handler = new Handler(){ @Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
myHandleMessage(msg);
} }; private void myHandleMessage(Message msg){
switch(msg.what){
case 101:
bn01.setText("服务器中止");
break;
case 102:
bn01.setText(getString(R.string.server_str));
break;
case 103:
if(msg.arg1>0){
et03.setText(et01.getText().toString());
}
break;
case 104:
bn02.setText(msg.arg1>0?"客户端中止":getString(R.string.client_str));
bn03.setEnabled(msg.arg1>0);
et04.setEnabled(msg.arg1>0);
break;
case 110:
String str = et02.getText().toString();
int i = str.indexOf("\n");
if(i>0){
str = str.substring(i+1);
}
str += (String)msg.obj;
str += "\n";
et02.setText(str);
break;
case 111:
Log.i("DEBUG", "客户端收到:" + (String)msg.obj);
break;
case 112:
Log.i("DEBUG", "服务器中止了!!");
tv01.setText("" + list.size() + "在线");
bn02.setText(getString(R.string.client_str));
bn03.setEnabled(false);
et04.setEnabled(false);
break;
case 113:
Log.i("DEBUG", "客户端退出了!!");
tv01.setText("" + list.size() + "在线");
break;
case 114:
tv01.setText("" + list.size() + "在线");
break;
}
} ServerSocket aServerSocket = null;
ArrayList list = new ArrayList(); private void server(){
myServerThread thread;
if( aServerSocket != null ){
try{
aServerSocket.close();
aServerSocket = null;
}catch(IOException e){
e.printStackTrace();
}
if( bn01 != null )
{
Message msg = new Message();
msg.what = 102;
handler.sendMessage(msg);
}
return;
}
try {
aServerSocket = new ServerSocket(55555);
Log.i("DEBUG", "already listen 55555 port.");
} catch (Exception e) {
e.printStackTrace();
}
if(aServerSocket == null){
Log.i("DEBUG", "侦听失败了!!");
return;
}
Log.i("DEBUG", "侦听成功了!!");
if( bn01 != null )
{
Message msg = new Message();
msg.what = 101;
handler.sendMessage(msg);
}
int num = 0;
while (num < 10) {
Socket aSessionSoket = null;
try {
Log.i("DEBUG", "侦听前!!");
aSessionSoket = aServerSocket.accept();
Log.i("DEBUG", "侦听后!!");
thread = new myServerThread(aSessionSoket);
thread.start();
Message msg = new Message();
msg.what = 114;
handler.sendMessage(msg);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
Log.i("DEBUG", "服务器手动中止了!!");
for(int i=0;i<list.size();i++){
Socket s = (Socket)list.get(i);
try{
s.close();
}catch(IOException e){
e.printStackTrace();
}
}
list.clear();
break;
}
num = list.size();
Log.i("DEBUG", "socket count = " + num);
}
} class myServerThread extends Thread {
public Socket aSessionSoket = null; public myServerThread(Socket socket) {
aSessionSoket = socket;
list.add(socket);
} public void run() {
DataInputStream aDataInput = null;
DataOutputStream aDataOutput = null;
try {
aDataInput = new DataInputStream(aSessionSoket.getInputStream());
aDataOutput = new DataOutputStream(aSessionSoket.getOutputStream());
while (true) {
Log.i("DEBUG", "服务器接收前!!");
String str = aDataInput.readUTF(); // read msg.
Log.i("DEBUG", "服务器接收后!!");
Message msg = new Message();
msg.obj = str;
msg.what = 110;
handler.sendMessage(msg);
aDataOutput.writeUTF("OK:" + str);
} } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace(); } finally {
try {
if (aDataInput != null)
aDataInput.close();
if (aDataOutput != null)
aDataOutput.close();
list.remove(aSessionSoket);
aSessionSoket.close();
// 这里的退出是客户端主动断开
Message msg = new Message();
msg.what = 113;
handler.sendMessage(msg);
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
} Socket clientsocket = null; private void client(){
Message msg;
if( clientsocket != null ){
try{
clientsocket.close();
clientsocket = null;
}catch(IOException e){
e.printStackTrace();
return;
}
msg = new Message();
msg.what = 104;
msg.arg1 = 0;
handler.sendMessage(msg);
return;
}
InetAddress serverAddr;
try {
serverAddr = InetAddress.getByName ( et03.getText().toString() );
Log.d ( "DEBUG" , "C: Connecting..." );
// 与服务器获取连接
clientsocket = new Socket(serverAddr, 55555); } catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(clientsocket == null){
Log.i("DEBUG", "连接失败了!!");
return;
}
if( bn03 != null )
{
msg = new Message();
msg.what = 104;
msg.arg1 = 1;
handler.sendMessage(msg);
}
myClientThread thread = new myClientThread(clientsocket);
thread.start();
} class myClientThread extends Thread {
public Socket aSessionSoket = null; public myClientThread(Socket socket) {
aSessionSoket = socket;
} public void run() {
DataInputStream aDataInput = null;
try {
aDataInput = new DataInputStream(aSessionSoket.getInputStream());
while (true) {
Log.i("DEBUG", "客户端接收前!!");
String str = aDataInput.readUTF();
Log.i("DEBUG", "客户端接收后!!");
Message msg = new Message();
msg.obj = str;
msg.what = 111;
handler.sendMessage(msg);
} } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Message msg = new Message();
msg.what = 112;
handler.sendMessage(msg); } finally {
try {
if (aDataInput != null)
aDataInput.close();
aSessionSoket.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
} private void sendmsg(){
DataOutputStream aDataOutput = null;
String message = et04.getText().toString();
if(message.isEmpty()){
return;
}
try {
Log.i ( "DEBUG" , "C: Sending: '" + message + "'" );
aDataOutput = new DataOutputStream(clientsocket.getOutputStream());
aDataOutput.writeUTF(message); } catch (Exception e) {
e.printStackTrace();
} finally {
} } }
别忘了加入权限:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
最后简单说说使用方法:
1、软件自己主动检測到自己wifi的IP地址。
2、一台机器能够同一时候扮演server和client。
3、其它机器能够登录到同一台server。
网络通讯。就这么简单。
天地币:所用到的 Android Socket 通讯编程技术试验的更多相关文章
- Protobuf实现Android Socket通讯开发教程
本节为您介绍Protobuf实现Android Socket通讯开发教程,因此,我们需要先了理一下protobuf 是什么? Protocol buffers是一种编码方法构造的一种有效而可扩展的格式 ...
- android socket 通讯(客户端) 发送数据
/** ClientSocket通讯类 **/ public class ClientSocket { /**服务器地址*/ private String serverUrl=&q ...
- android 蓝牙通讯编程 备忘
1.启动App后: 判断->蓝牙是否打开(所有功能必须在打牙打开的情况下才能用) 已打开: 启动代码中的蓝牙通讯Service 未打开: 发布 打开蓝牙意图(系统),根据Activity返回进场 ...
- Android Socket通信编程
安卓客户端通过socket与服务器端通讯一般可以按照以下几个步骤:(1).通过IP地址和端口实例化Socket,请求连接服务器:socket = new Socket(HOST, PORT); //h ...
- 门禁系统socket通讯编程
最近遇到一个socke udp协议通讯的需求,而且是16进制数据接收.这样在传输参数的时候老是提示参数错误,因为计算机是不能直接传输16进制的,会自行转换,所有以下代码非常完美的解决我的问题,同时也让 ...
- 初识Socket通讯编程(一)
一.什么是socket? 当两台计算机需要通信的时候,往往我们使用的都是TCP去实现的,但是并不会直接去操作TCP协议,通常是通过Socket进行tcp通信.Socket是操作系统提供给开发者的一个接 ...
- 高性能、高可用性Socket通讯库介绍 - 采用完成端口、历时多年调优!(附文件传输程序)
前言 本人从事编程开发十余年,因为工作关系,很早就接触socket通讯编程.常言道:人在压力下,才可能出非凡的成果.我从事的几个项目都涉及到通讯,为我研究通讯提供了平台,也带来了动力.处理socket ...
- C#网络编程技术微软Socket实战项目演练(三)
一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的第三部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理 ...
- Android之okhttp实现socket通讯(非原创)
文章大纲 一.okhttp基础介绍二.socket通讯代码实战三.项目源码下载四.参考文章 一.okhttp基础介绍 https://www.jianshu.com/p/e3291b7808e7 ...
随机推荐
- 设计模式在cocos2d-x中的使用--简单工厂模式(Simple Factory)
什么是简单工厂模式? 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式.通过专门定义一个类来负责创建其它类的实例,被创建的实例 ...
- C语言-常用知识和技巧
1. char string[MAXSIZE], *tmp = string; 2."&&", "||", "?:", &q ...
- 实现对数据进行分组小计并计算合计的实例 asp.net
可以通过数据绑定来实现 通过union all 来实现数据库 SELECT * FROM v3_pay_list2 where ( (ought_date >= '2012-12-06') a ...
- unity3d通过代码动态创建销毁游戏对象
只能动态创建内部提供的游戏对象,代码如下: //按下C后创建 if (Input.GetKeyDown (KeyCode.C)) { GameObject s1 = GameObject.Create ...
- XML序列化 判断是否是手机 字符操作普通帮助类 验证数据帮助类 IO帮助类 c# Lambda操作类封装 C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法 C# -- 文件的压缩与解压(GZipStream)
XML序列化 #region 序列化 /// <summary> /// XML序列化 /// </summary> /// <param name="ob ...
- WebApi接口传参不再困惑(4):传参详解
前言:还记得刚使用WebApi那会儿,被它的传参机制折腾了好久,查阅了半天资料.如今,使用WebApi也有段时间了,今天就记录下API接口传参的一些方式方法,算是一个笔记,也希望能帮初学者少走弯路.本 ...
- oracle事务块示例
begin Insert into T_SYS_PAGEOPER (FOPERID,FPAGEID) values (152,22); Insert into T_SYS_PAGEOPER (FOPE ...
- Paper Reading 1 - Playing Atari with Deep Reinforcement Learning
来源:NIPS 2013 作者:DeepMind 理解基础: 增强学习基本知识 深度学习 特别是卷积神经网络的基本知识 创新点:第一个将深度学习模型与增强学习结合在一起从而成功地直接从高维的输入学习控 ...
- 浅谈 Objective-C 下对象的初始化
转自:http://www.oschina.net/question/54100_32468 众所周知,Objective-C是一门面向对象的语言,一般情况下,我们在Objective-C中定义一个类 ...
- Controller Service Dao总结
今天主要学习了Controller,Service,Dao的相关知识 我的理解主要是这种,Controller主要与前台页面打交道 比方:前台页面有一个"加入用户"的提交butto ...