Android手机的应用,除了它的手机功能之外,另外一个吸引人的地方在于它的开放性,这一点iphone无法比拟,至少iphone太多商业化气息。

如同当年windows95一样,android为我们开启另一扇交流之窗,而要实现交流,socket通信必不可少。

java在socket通信方面上已经有了很好的范例,我只是抛砖引玉,将其引入到android之中,疏漏之处在所难免,很多地方也值得深思与考量,高手不必拍砖,可跳过此文。

下面,用敲门的方式演示Android如何实现套接字的通信。

本例实现功能如下:

Server端开启服务
Client端发起链接请求,并向Server端发送数据
Server端响应请求,并在Server显示,向Client端返回数据
Client端接收Server的数据并显示



终端1:



终端2:



Server端:



本例源代码如下:

Server端:

package com.android.Yao;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class YaoChatServer extends Thread {

private YaoChatServer() throws IOException {
CreateSocket();
//创建Socket服务器
}

public void run() {
Socket client;
String txt;
try {
while (true)
//线程无限循环,实时监听socket端口
{
client=ResponseSocket();
//响应客户端链接请求。。

while(true)
{
txt=ReceiveMsg(client);
System.out.println(txt);
//链接获得客户端发来消息,并将其显示在Server端的屏幕上

SendMsg(client,txt);
//向客户端返回消息

if(true)break;
//中断,继续等待链接请求
}

CloseSocket(client);
//关闭此次链接
}
}
catch (IOException e) {
System.out.println(e);
}

}

private ServerSocket server = null;
private static final int PORT = 5000;
private BufferedWriter writer;
private BufferedReader reader;

private void CreateSocket() throws IOException
{
server = new ServerSocket(PORT, 100);
System.out.println("Server starting..");
}

private Socket ResponseSocket() throws IOException
{
Socket client = server.accept();
System.out.println("client connected..");

return client;
}

private void CloseSocket(Socket socket) throws IOException
{
reader.close();
writer.close();
socket.close();
System.out.println("client closed..");
}

private void SendMsg(Socket socket,String Msg) throws IOException
{
writer = new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream()));
writer.write(Msg+"\n");
writer.flush();

}

private String ReceiveMsg(Socket socket) throws IOException
{
reader = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
System.out.println("server get input from client socket..");
String txt="Sever send:"+reader.readLine();

return txt;
}

public static void main(final String args[]) throws IOException {
YaoChatServer yaochatserver = new YaoChatServer();
if (yaochatserver != null) {
yaochatserver.start();
}
}

}


Client端:

package com.android.Yao;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.net.UnknownHostException;

import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.*;


public class YaoChatRoomAndroid extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.chatroom);


findviews();
setonclick();

}

private EditText chattxt;
private TextView chattxt2;
private Button chatok;

public void findviews()
{
chattxt = (EditText)this.findViewById(R.id.chattxt);
chattxt2 = (TextView)this.findViewById(R.id.chattxt2);
chatok = (Button)this.findViewById(R.id.chatOk);
}

private void setonclick()
{
chatok.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
try {
connecttoserver(chattxt.getText().toString());
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}


public void connecttoserver(String socketData) throws UnknownHostException, IOException
{
Socket socket=RequestSocket("192.168.0.107",5000);
SendMsg(socket,socketData);
String txt = ReceiveMsg(socket);
this.chattxt2.setText(txt);
}


private Socket RequestSocket(String host,int port) throws UnknownHostException, IOException
{
Socket socket = new Socket(host, port);
return socket;
}

private void SendMsg(Socket socket,String msg) throws IOException
{
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
writer.write(msg.replace("\n", " ")+"\n");
writer.flush();
}

private String ReceiveMsg(Socket socket) throws IOException
{
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

String txt=reader.readLine();
return txt;

}
}

备注:原作者有个问题没说清楚的是:要在android使用上面的客户端的话,必然要在AndroidManifest.xml中注册(<uses-permission android:name="android.permission.INTERNET"/>"),也正是因为这个问题让我纠结了好久。

来源:http://hi.baidu.com/gk14/blog/item/a25c0e463fbc1a056a63e52c.html

更多相关文章

  1. Nginx系列教程(二)| 一文带你读懂Nginx的正向与反向代理
  2. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  3. 2012-04-10 16:32 android与WEB服务器交互时,如何保证在同一个会
  4. 一种基于Android智能手机的远程视频监控的设计[图]
  5. android 模拟器和PC用sockets通讯
  6. 【OSC手机App技术解析】- 集成新浪微博Android(安卓)SDK
  7. 开源项目之Android(安卓)最新篇
  8. Android在网页下(WebView中运用HTML)点击按钮打开本地手机应用程
  9. XMPP协议之Androidpn介绍

随机推荐

  1. Android:EditText屏蔽输入法弹窗
  2. 学习心得(二)
  3. eclipse 配置android sdk和maven
  4. android Style样式
  5. android表格布局
  6. 启动AVD时候失败PANIC: ANDROID_SDK_HOME
  7. Android + jQuery Mobile
  8. andriod布局常用控件
  9. Android(安卓)使用Matrix进行图像变换
  10. android 网络下载图片 效率对比