您的位置:首页 > 移动开发 > Android开发

[置顶] Android手机通过socket与pc通信

2015-04-29 13:20 411 查看
在Android中可以直接利用java中的Socket与ServerSocket构建socket通信。

代码的运行环境:

pc端:普通pc,作为服务器,已经设置有域名(通过动态域名软件设置),在5648端口进行监听。

Android手机客户端:android2.3设备。

代码运行一切正常,客户端发送的文字将在服务器端接收并显示,服务器每接收到客户端的一行文字,就会返回一个从0开始递增的整数,此整数将在客户端显示出来。

pc端代码:



[java] view
plaincopy

package test;



import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;





public class Test implements Runnable{



/**

* @param args

*/



int max=10; //最大开启线程数

int i=0; //回复数字

int temp;

ServerSocket serverSocket;

Socket socket[];



public Test(){



try {

serverSocket=new ServerSocket(5648); //在5648端口进行侦听

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

System.out.println("can't initate ServerSocket!");

return;

}



socket=new Socket[max];



System.out.println("waiting for connect");

try {

while((socket[i]=serverSocket.accept())!=null){

temp=i;

i++;

new Thread(this).start(); //每侦听到一个客户端的连接,就会开启一个工作线程



}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public static void main(String[] args) {

new Test();



}



@Override

public void run() {

Socket sk=socket[temp];

System.out.println("accept:"+sk.getInetAddress().getHostAddress());

InputStream is=null;

OutputStream os=null;

BufferedReader br=null;

PrintWriter pw=null;

try {

is=sk.getInputStream();

os=sk.getOutputStream();

br=new BufferedReader(new InputStreamReader(is));

pw=new PrintWriter(os);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

try {

sk.close();

} catch (IOException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

return;

}

String str;

try {

int m=0;

while((str=br.readLine())!=null){

System.out.println(str);

pw.println(m);

pw.flush();

m++;

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}



}



}

android设备客户端代码:

MainActivity.java代码:



[java] view
plaincopy

package com.tobacco.phonetest;



import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.Socket;

import java.net.UnknownHostException;



import android.app.Activity;

import android.os.Bundle;

import android.os.Handler;

import android.util.Log;

import android.view.Menu;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.Toast;



public class MainActivity extends Activity implements OnClickListener,Runnable{



private Button button;

private EditText editText;

private Socket socket;

private PrintWriter pw;

private BufferedReader br;

private Handler handler;



@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

handler=new Handler();

button=(Button)findViewById(R.id.button);

button.setOnClickListener(this);

editText=(EditText)findViewById(R.id.edittext);

try {

socket=new Socket("tobacco5648.xicp.net",5648); //连接到tobacco5648.xicp.net的5648端口

[java] view
plaincopy

<span style="white-space:pre"> </span>//tobacco5648.xicp.net是我申请的域名



} catch (UnknownHostException e) {

// TODO Auto-generated catch block

e.printStackTrace();

Log.e("socket","unknown host");

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

Log.e("socket","io execption");

}

if(socket==null){

Log.e("socket","null");

}

else

try {

pw=new PrintWriter(socket.getOutputStream());

br=new BufferedReader(new InputStreamReader(socket.getInputStream()));

if(pw!=null&&br!=null){

new Thread(this).start();

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}



@Override

public boolean onCreateOptionsMenu(Menu menu) {

getMenuInflater().inflate(R.menu.activity_main, menu);

return true;

}



public void onClick(View view) {

if(view==button){

String str;

str=editText.getText().toString();

pw.println(str);

pw.flush();

}



}



public void run() {



try {

String str;

while((str=br.readLine())!=null){

final String s=str;

handler.post(new Runnable(){



public void run() {

Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();



}});



}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}



}





}



activity_main.xml代码:



[html] view
plaincopy

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >



<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/hello_world" />



<EditText

android:id="@+id/edittext"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:hint="@string/message" />



<Button

android:id="@+id/button"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/hello_world" />



</LinearLayout>

因为此客户端程序要用到网络,所以要在manifest文件中添加权限。

Manifest.xml代码:



[html] view
plaincopy

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.tobacco.phonetest"

android:versionCode="1"

android:versionName="1.0" >



<uses-sdk

android:minSdkVersion="8"

android:targetSdkVersion="15" />

<uses-permission android:name="android.permission.INTERNET"></uses-permission>



<application

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

<activity

android:name=".MainActivity"

android:label="@string/title_activity_main" >

<intent-filter>

<action android:name="android.intent.action.MAIN" />



<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

</application>



</manifest>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: