频道栏目
首页 > 程序开发 > 移动开发 > Android > 正文
android 利用socket 发送Json数据demo
2015-04-29 10:04:34         来源:Coder_android  
收藏   我要投稿

 

客户端代码:

 

package com.yqq.jsonclienttest;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;



/**
 * 套接字客户端,
 * 1、先生成JSON对象
 * 2、将JSON对象转成JSON字符串
 * 3、将JSON字符串转成字节数组写入套接字输出流
 * @author yqq_coder
 *
 */
public class MainActivity extends Activity {
	private EditText et_name;
	private EditText et_age;
	private EditText et_sex;
	private String host=172.21.133.15;//同一个局域网内作为服务端的手机的IP,使用端口8155

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		et_name=(EditText) findViewById(R.id.et_name);
		et_age=(EditText) findViewById(R.id.et_age);
		et_sex=(EditText) findViewById(R.id.et_sex);
	}
	
	
	public void submit(View v) throws JSONException{
		if(TextUtils.isEmpty(et_name.getText().toString().trim())||TextUtils.isEmpty(et_age.getText().toString().trim())||TextUtils.isEmpty(et_sex.getText().toString().trim())){
			Toast.makeText(MainActivity.this, 信息不能为空!!!, 0).show();
			return;
		}
		JSONObject jsonObject=new JSONObject();
		jsonObject.put(name, et_name.getText().toString().trim());
		jsonObject.put(age, et_age.getText().toString().trim());
		jsonObject.put(sex, et_sex.getText().toString().trim());
		final String  result=jsonObject.toString();
		Log.i(jSON字符串, result);
		new Thread(new  Runnable() {
			@Override
			public void run() {
				
				try {
					Socket socket=new Socket(InetAddress.getByName(host), 8155);
					OutputStream os=socket.getOutputStream();
					os.write(result.getBytes());
					os.flush();
					//防止服务端read方法读阻塞
					socket.shutdownOutput();
				} catch (UnknownHostException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
		}).start();
	}

	

}

服务端代码:

 

 

package com.yqq.jsonclienttest1;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

import org.json.JSONException;
import org.json.JSONObject;

import com.yqq.jsonclienttest1.R;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;



/**
 * 套接字服务端
 * @author yqq_coder
 *
 */
public class MainActivity extends Activity {
	private Button btn;
	  volatile Socket   mSocket;
	  ServerSocket server;
	private Handler mHandler=new Handler(){

		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			super.handleMessage(msg);
			if(msg.what==0x01){
				Toast.makeText(MainActivity.this,(String) msg.obj, 500).show();
				btn.setEnabled(true);
			}
			if(msg.what==0x02){
				new Thread(new  Runnable() {
					@Override
					public void run() {
						
						try {
							 Log.i(客户端连接, 读取客户端发来的数据);
							InputStream ins=mSocket.getInputStream();
							ByteArrayOutputStream os=new ByteArrayOutputStream();
							int len=0;
							byte[] buffer=new byte[1024];
							while((len=ins.read(buffer))!=-1){
								os.write(buffer);
							}
							//第一步,生成Json字符串格式的JSON对象
							JSONObject jsonObject=new JSONObject(os.toString());
							//第二步,从JSON对象中取值如果JSON 对象较多,可以用json数组
							String name=姓名:+jsonObject.getString(name);
							String age=年龄:+jsonObject.getString(age);
							String sex=性别:+jsonObject.getString(sex);
							StringBuffer sb=new StringBuffer();
							sb.append(name);
							sb.append(age);
							sb.append(sex);
							Looper.prepare();
							Message message=Message.obtain();
							message.what=0X01;
							message.obj=sb.toString();
							mHandler.sendMessage(message);
							Looper.loop();
							
							
						} catch (Exception e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}finally{
							
							if(mSocket!=null){
								try {
									mSocket.close();
									mSocket=null;
								} catch (IOException e) {
									// TODO Auto-generated catch block
									e.printStackTrace();
								}
								
							}
						}
						
					}
				}).start();
			}
			
		}
		
		
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		btn=(Button) findViewById(R.id.btn);
		
	}
	
	
	
	public void submit(View v) throws JSONException, IOException{
		btn.setEnabled(false);
		
		 
		
		new Thread(new  Runnable() {
			
			@Override
			public void run() {
				
					try {
						 Log.i(阻塞,等待客户端连接, <<<<<<<<<);
						 if(server==null){
						 server=new ServerSocket(8155);
						 }
						 mSocket=server.accept();
						 Log.i(客户端连接成功, <<<<<<<<<客户端连接成功);
						Looper.prepare();
						Message message=Message.obtain();
						message.what=0X02;
						mHandler.sendMessage(message);
						Looper.loop();
						
						
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} 
				
				
				
			}
		}).start();
	}

	

}


 

第二次监听时候报错:

04-28 12:55:52.841: W/System.err(8761): java.net.BindException: bind failed:

解决办法:

 

 if(server==null){
						 server=new ServerSocket(8155);
						 }

 

点击复制链接 与好友分享!回本站首页
相关TAG标签 数据
上一篇:Android 线程池来管理线程
下一篇:Android分辨率适配
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站