Android Socket通讯
来源:互联网 发布:memcache 教程php 编辑:程序博客网 时间:2024/05/20 08:41
最近由于工作需要,自己编写了android的客户端与PC的服务器进行通讯,使用SOCKET
1.新版本的android不能在主线程中进行SOCKET操作,需要新开一个线程。
2.权限问题:需要在***Manifest.xml文件中添加 <uses-permission android:name="android.permission.INTERNET"></uses-permission>
权限。 一开始我添加application标签中,程序一直报权限问题,后来我仔细看了看别人的例子,权限是添加在application标签的外面。具体如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="gcy.SocketDemo"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".SocketDemoActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission..ACCESS_COARSE_LOCATION"></uses-permission>
<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.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
</manifest>
客户端android代码:
package gcy.SocketDemo;
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 android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class SocketDemoActivity extends Activity implements Runnable{
private TextView tv_msg = null;
private EditText ed_msg = null;
private Button btn_send = null;
//private Button btn_login = null;
private static final String HOST = "192.168.1.103";
private static final int PORT =2000;
private Socket socket = null;
private BufferedReader in = null;
private PrintWriter out = null;
private String content = "";
/*Called when the activity is first created*/
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv_msg = (TextView)findViewById(R.id.textView);
ed_msg = (EditText)findViewById(R.id.editText1);
btn_send=(Button)findViewById(R.id.button1);
try
{
socket = new Socket(HOST,PORT);
in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
}
catch(IOException ex)
{
//ex.printStackTrace();
ShowDialog("login exception"+ex.getMessage());
}
btn_send.setOnClickListener(new Button.OnClickListener()
{
@Override
public void onClick(View arg0) {
String msg = ed_msg.getText().toString();
if(socket.isConnected())
{
if(!socket.isOutputShutdown())
{
out.println(msg);
}
}
}
});
new Thread(SocketDemoActivity.this).start();
}
public void ShowDialog(String msg)
{
new AlertDialog.Builder(this).setTitle("notification").setMessage(msg)
.setPositiveButton("ok",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
// TODO Auto-generated method stub
}
}).show();
}
@Override
public void run() {
try{
while(true)
{
if(socket.isConnected())
{
if(!socket.isInputShutdown())
{
if((content=in.readLine())!=null)
{
content+="\n";
mHandler.sendMessage(mHandler.obtainMessage());
}
else
{
}
}
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
public Handler mHandler = new Handler()
{
public void handleMessage(Message msg)
{
super.handleMessage(msg);
tv_msg.setText(tv_msg.getText().toString()+content);
}
};
}
main.xml中内容:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent" android:weightSum="1">
<TextView android:text="TextView" android:layout_height="wrap_content" android:id="@+id/textView" android:layout_width="177dp"></TextView>
<EditText android:layout_height="wrap_content" android:id="@+id/editText1" android:layout_width="fill_parent">
<requestFocus></requestFocus>
</EditText>
<Button android:text="Button" android:id="@+id/button1" android:layout_height="wrap_content" android:layout_width="98dp"></Button>
<ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="match_parent"></ListView>
</LinearLayout>
- Android+socket+通讯
- Android 客户端socket通讯
- android socket 双向通讯
- android socket通讯
- Android Socket通讯
- android socket通讯过程?
- Android Socket通讯
- Android Socket通讯
- Android通讯-Socket
- Android中Socket通讯类
- Android Socket通讯基本用法
- android简单的socket通讯
- Android之Socket,Service通讯
- Android开发--Socket通讯解析
- Android 模拟器(JAVA)与C++ socket 通讯
- android与socket通讯(三)
- Android中Socket通讯类【Json】
- Android local socket 进程间通讯实验
- 关于“The import android cannot be resolved”错误。
- Android中的Selector的用法
- Hadoop简要介绍
- Openfire Connection Manager 配置
- IOS数组,字典基础知识
- Android Socket通讯
- Delphi stdCall意义
- Traceroute与Ping区别
- [ACM] hdu 1850 Being a Good Boy in Spring Festival(Nim博弈)
- 如何在页面加载完毕后获取图片高度或宽度问题
- POJ 1528 Perfection 模拟
- Oracle 11g实时SQL监控 --好东西不该藏着
- JavaScript常用函数练习之substring和splice
- 任意物理按键唤醒屏幕