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

android手机客户端连接服务器实现交互

2015-11-10 14:24 465 查看
这几天想做一个android手机客户端连接PC服务器实现聊天功能的小程序,无奈客户端连接服务器就出现了问题,最后终于连接成功。其中遇到了两个问题,1、android版本问

题,我手机版本是5.0而我eclipse里面项目版本是4.3,会提示android.os.NetworkOnMainThreadException错误,解决办法在onCreate方法下面加一段代码,

@Override
protected void onCreate(Bundle savedInstanceState) {

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork() // 这里可以替换为detectAll() 就包括了磁盘读写和网络I/O
.penaltyLog() //打印logcat,当然也可以定位到dropbox,通过文件保存相应的log
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects() //探测SQLite数据库操作
.penaltyLog() //打印logcat
.penaltyDeath()
.build());
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_socket_);

1、ip地址的问题,不同于本地测试,android手机连接PC端要求在同一个网络下面,最好是共享一个网络,但是当我用360wifi共享同一个网络后还是现实连接不成功,最后选择了我的实验室网址才连接成功,



最后附上利用socket套接字编程实现android手机连接服务器的源代码;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;

import android.os.Bundle;
import android.os.StrictMode;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class Socket_Activity extends Activity {
private TextView text;
private Button button;
private EditText editext;

@Override
protected void onCreate(Bundle savedInstanceState) {

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork() // 这里可以替换为detectAll() 就包括了磁盘读写和网络I/O
.penaltyLog() //打印logcat,当然也可以定位到dropbox,通过文件保存相应的log
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects() //探测SQLite数据库操作
.penaltyLog() //打印logcat
.penaltyDeath()
.build());
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_socket_);
text = (TextView)findViewById(R.id.text);
button = (Button)findViewById(R.id.button);
button.setText(R.string.button);
editext = (EditText)findViewById(R.id.editText);

button.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
System.out.println("click....");
Socket socket = null;
try {
socket = new Socket();
System.out.println("2222");
socket.connect(new InetSocketAddress("192.168.1.100", 5333), 10000);
System.out.println("socket-->");
// 将信息通过这个对象来发送给Server
PrintWriter printWriter = new PrintWriter(new
BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
// 把用户输入的内容发送给server
String toString = editext.getText().toString();
printWriter.println(toString);
printWriter.flush();
// 接收服务器信息
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 得到服务器信息
String msg = bufferedReader.readLine();
// 在页面上进行显示
text.setText(msg);
} catch (Exception e1) {
// TODO: handle exception
System.out.println(e1.toString());
}finally{
try {
socket.close();
} catch (Exception e2) {
// TODO: handle exception
e2.printStackTrace();
}
}
}
});

}
}服务器端就是普通java代码
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server implements Runnable{

@Override
public void run() {

try {
ServerSocket serverSocket = new ServerSocket(5333);
while(true){
// 等待接受客户端请求
System.out.println("server starting....");
Socket client = serverSocket.accept();
System.out.println("received");
// 接受客户端信息
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(client.getInputStream()));
// 发送给客户端的消息
PrintWriter printWriter = new PrintWriter(new BufferedWriter(new
OutputStreamWriter(client.getOutputStream())),true);
// 读取客户端的信息
String string = bufferedReader.readLine();
System.out.println(string);

if(string!=null){
printWriter.println("end"+string);
printWriter.flush();
}
client.close();
}

} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}

}

public static void main(String[] args) throws Exception {
new Thread(new Server()).start();

}
}

最后别忘了加一个访问权限
<uses-permission android:name="android.permission.INTERNET"/>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: