好久不写网络连接,有点手生,今天闲来试写一个demo,实现让Android设备与服务器(以Windows本机为例)的socket通信。这里只写了服务器发送一段消息到手机端。
服务端:用Java Project写Server代码,由于Socket通信需要一对套接字,只需在代码中通过serverSocket获得clientSocket,得到其输入输出流并操作即可。其中注意ServerSocket的accept方法是阻塞式的。
服务端代码如下:
public class ServerDemo {
private static final int port = 8888;
public static void main(String[] args){
try {
ServerSocket serverSocket = new ServerSocket(port);
Thread.sleep(1000);
System.out.println("server is running...");
Socket clientSocket = serverSocket.accept();
if(clientSocket != null){
System.out.println("get clientSocket...");
OutputStream out = clientSocket.getOutputStream();
out.write("hello android!".getBytes());
System.out.println("write message...");
clientSocket.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
客户端代码如下:
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
private static final int LOADING = 0;
protected static final int SHOW = 1;
private boolean isLog = true;
private TextView tv;
private boolean flag = true;
private void log(String msg) {
if (isLog) {
Log.d(TAG, msg);
}
}
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case LOADING:
tv.setText("loading");
break;
case SHOW:
String message = (String) msg.obj;
tv.setText(message);
break;
default:
break;
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
//开始执行线程
new Thread(new MyRunnable()).start();
}
class MyRunnable implements Runnable{
@Override
public void run() {
while(flag){
SystemClock.sleep(1000);
InputStream in = null;
Socket socket = null;
try {
//修改tv为loading
Message msg1 = Message.obtain();
msg1.what = LOADING;
handler.sendMessage(msg1);
log("client is loading...");
SystemClock.sleep(1000);
socket = new Socket("192.168.43.225", 8888);
in = socket.getInputStream();
byte buf[] = new byte[1024];
in.read(buf);
String message = new String(buf);
//修改tv显示server发来的信息
Message msg2 = Message.obtain();
msg2.what = SHOW;
msg2.obj = message;
handler.sendMessage(msg2);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (socket != null) {
socket.close();
log("socket closed");
}
if(in != null){
in.close();
log("inputstream closed");
flag = false;
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
}
}
测试:保证手机和电脑在同一个局域网内。运行Java程序,阻塞等待clientSocket的接入。运行android application,当接收到服务端发来的消息后停止循环,在屏幕上显示“hello android”,测试成功。