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