在Android中可以直接利用java中的Socket与ServerSocket构建socket通信。
代码的运行环境:
pc端:普通pc,作为服务器,已经设置有域名(通过动态域名软件设置),在5648端口进行监听。
Android手机客户端:android2.3设备。
代码运行一切正常,客户端发送的文字将在服务器端接收并显示,服务器每接收到客户端的一行文字,就会返回一个从0开始递增的整数,此整数将在客户端显示出来。
pc端代码:
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代码:
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端口
//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代码:
<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代码:
<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>