最近一直在看安卓方面的相关知识,看到了网络编程方面,就弄了个小程序练练手,这个程序分为客户端和服务器端,主要实现的功能就是客户端通过socket连接到pc服务器,然后pc服务器输出收到的消息,并返回消息给安卓客户端,其中pc服务器是多线程操作,一直处于监听状态,收到一个连接请求后就产生一个子线程处理相应的操作。
下面就是具体点代码了:
android客户端:
package com.example.client;//安卓客户端程序
import java.io.*;
import java.net.Socket;
import android.os.*;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.*;
public class MainActivity extends Activity {
private final String DEBUG_TAG="Activity01";
private TextView mTextView=null;
private EditText mEditText=null;
private Button mButton=null;
private Handler hd=new Handler()
{
public void handleMessage(Message message)
{
mTextView.setText((CharSequence) message.obj);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton=(Button)findViewById(R.id.Button01);
mTextView=(TextView)findViewById(R.id.TextView01);
mEditText=(EditText)findViewById(R.id.EditText01);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
connect();
}
});
}
void connect()
{
new Thread()
{
public void run()
{
Socket socket=null;
String message=mEditText.getText().toString()+"\r\n";
//创建socket
try{
socket =new Socket("192.168.1.123",12345);
//向服务器发送消息
PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
out.println(message);
//接收来自服务器的消息
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String msg=br.readLine();
if(msg!=null)
{
Message messag=new Message();
messag.obj=msg;
hd.sendMessage(messag);
}
else
{
Message messag=new Message();
messag.obj="数据错误";
hd.sendMessage(messag);
}
//关闭流
out.close();
br.close();
//关闭socket
socket.close();
}
catch(Exception e)
{
Log.e(DEBUG_TAG, e.toString());
}
}
}.start();
}
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical" >
<TextView
android:id="@+id/TextView01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="收到的消息显示"
android:textSize="8pt" />
<EditText
android:id="@+id/EditText01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="请输入发送给服务器的消息"
android:textSize="8pt" />
/>
<Button
android:id="@+id/Button01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送"
android:textSize="8pt" />
</LinearLayout>
下面是服务器端程序:
package org.zq.server;//服务器端程序
import java.io.*;
import java.net.*;
public class Server implements Runnable{
public void run()
{
try
{
//创建serversocket
ServerSocket serverSocket =new ServerSocket(12345);
while(true)
{
//接收客户端请求
System.out.println("等待连接");
Socket client=serverSocket.accept();
System.out.println("收到连接");
try
{
//接收客户端消息
BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
String str=in.readLine();
System.out.println("read:"+str);
//向客户端发送消息
PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())),true);
out.println("Server message");
//关闭流
out.close();
in.close();
}
catch(Exception e)
{
System.out.println(e.getMessage());
e.printStackTrace();
}
finally
{
//关闭
client.close();
System.out.println("close");
}
}
}catch(Exception e)
{
System.out.println(e.getMessage());
}
}
public static void main(String[] args) {
Thread task=new Thread(new Server());
task.start();
}
}
其中存在一些问题后来解决了,一开始安卓客户端连接服务器始终连接不上,没反应,后来发现原来没给程序权限问题导致,如果要使安卓程序能够连上网的话必须在AndroidManifest.xml中添加<uses-permission android:name="android.permission.INTERNET"/>,然后就能连接服务器了。
还有是一开始将socket操作写在了UI线程中,也导致socket操作始终无法顺利进行,客户端程序一直卡在了socket那,后来查阅资料后将socket操作写在了子线程中而不是UI线程中,于是就连上了,UI线程一般只是负责界面的更改吧。
因为这个程序用来练手,所以比较简单,界面也比较简陋,具体改进在以后的学习中不断进行吧。把具体实现过程写下来既给大家一些参考,也给自己留着看看吧。