终于把socket通信调通了
1. 【客户端】
package com.example.ioclient;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class Client extends Activity {
private Button send;
private TextView text;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置布局文件
setContentView(R.layout.client_activity);
//设置按钮和文本id
send = (Button) findViewById(R.id.send);
text = (TextView) findViewById(R.id.text);
//设置按钮字符串
send.setText(R.string.send);
//设置监听器
send.setOnClickListener(new ClientListener());
}
class ClientListener implements OnClickListener {
private Socket socket;
private DataInputStream in;
private DataOutputStream out;
public void onClick(View v) {
//在监听器里面把连接服务器代码写在一个新建一个线程里,主线程里面不能用
Thread thread = new Thread() {
public void run() {
try {
System.out.println("msg");
//socket设置服务器ip地址和端口号
socket = new Socket("10.47.31.21", 10001);
//取得数据输入输出流,getOutputStream字节流,DataOutputStream字节流以各种数据类型输入数据
out = new DataOutputStream(socket.getOutputStream());
in = new DataInputStream(socket.getInputStream());
//以UTF形式输入流中
out.writeUTF("输入数据。。。");
//刷新输入到流中
out.flush();
final String msg;
if ((msg = in.readUTF()) != null) {
//新建一个线程实现ui更新
runOnUiThread(new Runnable() {
public void run() {
text.setText(msg);
}
});
System.out.println("msg1" + msg);
}
} catch (Exception e) {
e.printStackTrace();
}
}
};
//开始线程
thread.start();
}
}
}
2. 【服务端】
package www;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
private ServerSocket serversocket;
private Socket socket;
private DataInputStream in;
private DataOutputStream out;
public static void main(String [] agrs) {
new Server();
}
public Server() {
//开始线程
new ServerThread().start();
}
class ServerThread extends Thread {
public void run() {
try {
//设置服务器端口号
serversocket = new ServerSocket(10001);
System.out.println("服务器启动");
while (true) {
//接收客户端发送请求
socket = serversocket.accept();
System.out.println("有客户端连接到服务器");
//取得socket输入输出字节流
in = new DataInputStream(socket.getInputStream());
out = new DataOutputStream(socket.getOutputStream());
String msg;
//读取从客户端发送的数据
if ((msg = in.readUTF()) != null) {
System.out.println(msg);
}
//把输出数据返回给客户端
out.writeUTF("连接服务器成功");
//刷新输出流
out.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
in.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
3. 在manifest文件中注册网络权限
<uses-permission android:name="android.permission.INTERNET"/>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.ioclient"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.ioclient.Client"
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>
</manifest>
<?xml version="1.0" encoding="utf-8"?>
<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:id="@+id/text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/send"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">IOClient</string>
<string name="hello_world">Hello world!</string>
<string name="menu_settings">Settings</string>
<string name="send">连接服务器</string>
</resources>
4. 运行结果
5. 总结
1> 在UI编程中,执行网络程序的时候, 最好是开启一个单独的网络线程, 这样才不会导致UI主线程被阻塞住的情况。
2> 模拟器总是启动慢,老出现一些怪异的现象。