- 浏览: 540414 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
landerson:
明显就有要求的嘛
ANDROID轻量级JSON序列化和反序列化[转] -
jimode2013:
很不错,就是需要这个方法
多个UIViewController使用addSubView,第二个 UIViewController 不响应旋转[转] -
w11h22j33:
...
[转]NSMutableArray中的自动释放对象让我郁闷了一整天 -
w11h22j33:
UILabel* label = [[UILabel a ...
Iphone开发 -
w11h22j33:
http://mobile.51cto.com/iphone- ...
获得通讯录中联系人的所有属性[转]
http://hi.baidu.com/gk14/blog/item/a25c0e463fbc1a056a63e52c.html
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.*;
findviews(); } private EditText chattxt; }
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);
setonclick();
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;
}
评论
服务器端源代码:
01.import java.net.*;
02.import java.io.*;
03.
04.public class FileServer {
05. public static void main (String [] args ) throws IOException {
06. // create socket
07. ServerSocket servsock = new ServerSocket(13267);
08. while (true) {
09. System.out.println("Waiting...");
10.
11. Socket sock = servsock.accept();
12. System.out.println("Accepted connection : " + sock);
13.
14. // sendfile
15. File myFile = new File ("source.pdf");
16. byte [] mybytearray = new byte [(int)myFile.length()];
17. FileInputStream fis = new FileInputStream(myFile);
18. BufferedInputStream bis = new BufferedInputStream(fis);
19. bis.read(mybytearray,0,mybytearray.length);
20. OutputStream os = sock.getOutputStream();
21. System.out.println("Sending...");
22. os.write(mybytearray,0,mybytearray.length);
23. os.flush();
24. sock.close();
25. }
26. }
27.}
客户端源代码:
01.import java.net.*;
02.import java.io.*;
03.
04.public class FileClient{
05. public static void main (String [] args ) throws IOException {
06. int filesize=6022386; // filesize temporary hardcoded
07.
08. long start = System.currentTimeMillis();
09. int bytesRead;
10. int current = 0;
11. // localhost for testing
12. Socket sock = new Socket("127.0.0.1",13267);
13. System.out.println("Connecting...");
14.
15. // receive file
16. byte [] mybytearray = new byte [filesize];
17. InputStream is = sock.getInputStream();
18. FileOutputStream fos = new FileOutputStream("source-copy.pdf");
19. BufferedOutputStream bos = new BufferedOutputStream(fos);
20. bytesRead = is.read(mybytearray,0,mybytearray.length);
21. current = bytesRead;
22.
23. // thanks to A. Cádiz for the bug fix
24. do {
25. bytesRead =
26. is.read(mybytearray, current, (mybytearray.length-current));
27. if(bytesRead >= 0) current += bytesRead;
28. } while(bytesRead > -1);
29.
30. bos.write(mybytearray, 0 , current);
31. bos.flush();
32. long end = System.currentTimeMillis();
33. System.out.println(end-start);
34. bos.close();
35. sock.close();
36. }
37.}
1. Android与PC通讯的第一个例子:
PC: Java Server
Android:Java Client
Java Server 源代码:
01.public class TCPDesktopServer implements Runnable{
02.
03. public static final String SERVERIP = "192.168.0.149";
04. public static final int SERVERPORT = 51706;
05.
06. public void run() {
07. try {
08. System.out.println("S: Connecting...");
09.
10. ServerSocket serverSocket = new ServerSocket(SERVERPORT);
11. while (true) {
12.
13. Socket client = serverSocket.accept();
14. System.out.println("S: Receiving...");
15.
16. try {
17. BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
18. String str = in.readLine();
19. System.out.println("S: Received: '" + str + "'");
20. } catch(Exception e) {
21. System.out.println("S: Error");
22. e.printStackTrace();
23. } finally {
24. client.close();
25. System.out.println("S: Done.");
26. }
27.
28. }
29.
30. } catch (Exception e) {
31. System.out.println("S: Error");
32. e.printStackTrace();
33. }
34. }
35.
36. public static void main (String a[]) {
37. Thread desktopServerThread = new Thread(new TCPDesktopServer());
38. desktopServerThread.start();
39. }
40.}
对上边的源代码做一些介绍:
指定Server监听的端口和服务器IP地址。
1.public static final String SERVERIP = "192.168.0.149";
2.public static final int SERVERPORT = 51706;
应用之前所指定的IP和Port创建一个ServerSocket对象。
1.ServerSocket serverSocket = new ServerSocket(SERVERPORT);
用于侦听和捕捉通过Socket连接的客户端。
1.Socket client = serverSocket.accept();
应用Socket创建BufferedReader对象,用于接收Socket Stream中的数据。
1.BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
Android Client 源代码:
01.InetAddress serverAddr = InetAddress.getByName("192.168.0.149");//TCPServer.SERVERIP
02.Log.d("TCP", "C: Connecting...");
03.Socket socket = new Socket(serverAddr, 51706);
04.String message = "AndroidRes,Where is my Pig (Android)?";
05.try {
06. Log.d("TCP", "C: Sending: '" + message + "'");
07. PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);
08. out.println(message);
09.} catch(Exception e) {
10. Log.e("TCP", "S: Error", e);
11.} finally {
12. socket.close();
13.}
对上边的源代码做一些介绍:
指定Server的IP地址。
1.InetAddress serverAddr = InetAddress.getByName("192.168.0.149");
应用Server的IP和端口建立Socket对象。
1.Socket socket = new Socket(serverAddr, 51706);
根据已经建立的Socket来创建PrintWriter,将信息通过这个对象来发送给Server,其中包含了三个部分:
OutputStreamWriter
BufferedWriter
PrintWriter
1.PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);
以上是Android与运行在PC上的Java Server通讯的例子。来源由Anddev.org提供
2. Android与PC通讯的第二个例子:
PC: CSharp Server
Android:Java Client
通过上边的例子,本人通过一些转换,实现了Android与CSharp Server的通讯方法。原理没有太大差异,仅仅是应用的方法稍有不同。
CSharp Server 源代码:
01.TcpClient ConnectedClient = ServerListener.AcceptTcpClient();
02.
03.NetworkStream netStream = ConnectedClient.GetStream();
04.
05.BinaryReader br = new BinaryReader(netStream);
06.
07.byte[] tempByte = new byte[8192];
08.
09.tempByte = br.ReadBytes(8192);
10.
11.string RecevieString = System.Text.Encoding.Default.GetString(tempByte);
对上边的源代码做一些介绍:
通过TcpListener获得的Client信息创建一个TcpClient对象。
1.TcpClient ConnectedClient = ServerListener.AcceptTcpClient();
从TcpClient对象中提取NetworkStream对象,其目的是建立Socket数据流。
1.NetworkStream netStream = ConnectedClient.GetStream();
建立BinaryReader对象为刚刚创建的NetworkStream提供一个接口,借助于这个接口可以非常方便的读取信息。
1.BinaryReader br = new BinaryReader(netStream);
读取Stream中的byte array数据,转化为string字符串。
1.byte[] tempByte = new byte[8192];
2.
3.tempByte = br.ReadBytes(8192);
4.
5.string RecevieString = System.Text.Encoding.Default.GetString(tempByte);
Android Client 源代码:
这个Android Client所应用的方法与第一个例子中有很大区别,请各位特别注意(通过本人的反复验证,这个算是Java 与CSharp间可行的通讯方法)。
1.String message = "AndroidRes,Where is my Pig (Android)?";
2.Socket socket = new Socket("192.168.0.149", 51706);
3.OutputStream ops=socket.getOutputStream();
4.DataOutputStream dos=new DataOutputStream(ops);
5.dos.write(message.getBytes());
6.dos.close();
对上边的源代码做一些介绍:
同样是建立Socket对象。
1.Socket socket = new Socket("192.168.0.149", 51706);
根据Socket对象创建OutputStream对象,根据名称可以很容易的理解这个对象的目的,它是建立一个输出的NetworkStream。
1.OutputStream ops=socket.getOutputStream();
DataOutputStream类似于BinaryWriter,是为OutputStream建立一个接口,可以通过这个接口向Socket另外一端写数据。
1.DataOutputStream dos=new DataOutputStream(ops);
最后这两行代码是实施写的过程。
1.dos.write(message.getBytes());
2.dos.close();
以上就是本站为大家提供的两种Android与PC间通讯的方式(其中第一个方法来自Anddev.org,这里要特别指出)。如果你有更巧妙或者更方便的方法,希望能与大家共同分享!
发表评论
-
干掉你程序中的僵尸代码【转】
2012-12-22 11:05 973随着万圣节越来越流行,我感觉有必要跟大家讨论一下一个 ... -
一个文本框搞定信用卡相关信息的输入[转]
2012-12-22 11:03 1144http://beforweb.com/node/134 ... -
android 开源 OCR 项目 及手写识别[转]
2012-12-11 18:21 57831)一个为Android平台,将识别由手机的相机拍摄的图 ... -
Android通过共享用户ID来实现多Activity进程共享【转】
2012-12-10 14:33 1115http://mypyg.iteye.com/blog/720 ... -
Android应用程序组件Content Provider的启动过程源代码分析【转】
2012-12-05 18:31 1158通过前面的学习,我们知道在Android系统中,Cont ... -
理解android上的安全性【转】
2012-12-03 18:08 936开发 Android 应用程序时,必须处理很多与安全性相关的方 ... -
Android 安全机制概述 Permission【转】
2012-12-03 18:07 11861 Android 安全机制概述 Android 是一个权限分 ... -
Android学习笔记之一谁动了我的接口附checkPermission流程(Dean)[转]
2012-12-03 18:06 18160前段时间接到一个有趣的需求!我们实现的某某功能的手机对外提供了 ... -
(JAVA) 使用异或进行简单的密码加密(JAVA实现)[转]
2012-11-12 16:44 1224http://blog.sina.com.cn/s/bl ... -
SL4A 之实现原理解析【转】
2012-10-23 23:52 1293关于SL4A的简介和在Android系统的安装及使用,请参 ... -
百度地图API之根据经纬度查询地址信息(Android)[转]
2012-06-16 00:15 19819http://blog.csdn.net/lyq8479/ar ... -
百度地图的手动定位和自动定位[转]
2012-06-15 23:24 3474http://aokunsang.iteye.com/b ... -
如何编程实现开启或关闭GPS?
2012-06-09 22:14 1149来自 手机应用中最酷的可能就是位置服务相关的了, ... -
Android软键盘的隐藏显示研究[转]
2012-05-25 16:30 1465Android是一个针对触摸屏专门设计的操作系统,当点 ... -
15 个变量和方法命名的最佳实践[转]
2012-02-27 11:44 103915 个变量和方法命名的最佳实践 在每个代码范围内使用足够短 ... -
iPhone Android Web开发(概要)
2012-01-19 15:15 1080一、 前端使用技术 JavaScript、 jQuer ... -
移动 电信 联通 APN cmwap cmnet ctwap ctnet 3gwap uniwap 3gnet uninet设置[转]
2011-11-23 14:35 2795APN(Access Point Name),即“接入 ... -
Android Http CMWAP联网获取实例【转】
2011-10-24 13:24 1408上午的时候原本想通过改变切入点的方式来实现cmwap,但是我们 ... -
监听ListView滚动到最底部【转】
2011-09-13 10:27 5898监听ListView的滚动可以用两个东西: ListV ... -
Android蓝牙开发浅谈【转】
2011-09-07 14:20 1607转自:http://www.eoeandroid.co ...
相关推荐
本文将通过一个具体的聊天示例,详细介绍如何在Android中实现Socket编程,以及如何在Android应用中合理地运用多线程技术。 #### 二、Socket编程基本概念 Socket编程是基于TCP/IP协议的一种网络通信方式。在计算机...
1. 创建Socket:Android应用中,我们使用`java.net.Socket`类来创建Socket实例,连接到服务器的特定IP地址和端口号。 2. 输入/输出流:Socket建立连接后,我们需要使用输入流(InputStream)读取服务器发送的数据,...
Android Socket编程是移动应用开发中实现设备间网络通信的关键技术。Socket,又称套接字,是一种网络编程接口,允许应用程序通过网络与其他设备上的应用程序进行数据交换。本篇将深入探讨Socket的基本概念、通信模型...
android socket编程实例
Android Socket编程实践
在本项目中,我们利用Socket编程实现了一个简单的聊天工具,这个工具是基于C++语言,并使用Microsoft Visual Studio 2008作为开发环境。对于初学者来说,这是一个很好的实践项目,可以帮助理解Socket的工作原理和...
当连接建立后,服务器端的Socket会为每个客户端创建一个新的线程来处理单独的通信,以确保多用户同时在线聊天的可行性。在这个项目中,服务器可能使用Java的ServerSocket类来监听和接受连接。 数据库文件“qq.sql”...
在Android平台上进行网络通信时,Socket编程是一种常见且重要的技术,它允许设备通过TCP或UDP协议与其他设备或服务器进行双向数据传输。在这个实例中,我们将深入探讨如何在Android客户端和Java服务器端实现Socket...
通过学习和实践Android中的Socket编程,开发者能够创建自定义的网络应用,比如聊天应用、文件传输应用等。记住,理解网络基础知识(如TCP/IP协议)对Socket编程至关重要。同时,不断实践和调试是提升技能的关键。祝...
在Android平台上进行网络通信时,Socket通信是一种常见的方式,它基于TCP/IP协议,提供可靠的、面向连接的数据传输。本篇文章将深入探讨如何在Android中实现一个TCP客户端(Socket客户端),以便与服务器进行双向...
压缩包内的"www.pudn.com.txt"可能包含关于编程环境或Socket编程的额外信息,而"04371045夏健钊_实验二多人聊天"可能是实验代码或报告,对于深入理解多人聊天系统的实现非常有价值。应当参考这些资源来补充具体实现...
本资料详细介绍了如何在Android平台上使用Socket进行网络编程,并通过具体的示例代码展示了聊天室的开发过程,包括服务器端和Android客户端的开发。 #### 二、服务器端程序开发 服务器端程序通常运行在一台PC机上...
在这个“socket编程聊天室(C++)”项目中,我们主要会涉及到以下几个关键知识点: 1. **Socket概念**:Socket是网络上的两个进程间通信的一种端点,它允许程序通过网络发送和接收数据。在C++中,我们可以使用...
在Android开发中,Socket通信是实现设备间数据传输的重要手段,尤其在构建网络服务和进行设备间的实时交互时。...通过不断实践和学习,你可以更熟练地运用Socket通信技术,为你的Android应用构建稳定、高效的网络功能。
Socket编程是计算机网络通信的核心技术之一,主要用于实现进程间的网络通信。在本主题"Socket字节传输"中,我们将深入探讨Socket如何进行字节级别的数据交换,以及客户端和服务器之间的交互过程。 首先,Socket可以...
本文将深入探讨如何在Android中实现基于Socket的客户端和服务端通信,以构建一个简单的聊天应用。 首先,让我们理解Socket的基本概念。Socket是网络通信中的一个编程接口,它允许两台计算机通过网络进行数据交换。...
在Android开发中,Socket编程是实现设备间通信的重要手段,特别是在网络应用中,如即时通讯、数据传输等。本文将详细讲解Android中的Socket编程,并结合`UDPClient.java`和`TCPClient.java`两个示例文件,阐述UDP和...
在Android开发中,Socket编程是实现设备间通信的重要方式,特别是在构建客户端-服务器应用程序时。本案例中,我们将探讨如何使用Android作为客户端,通过Socket与Java服务器端进行数据交换。首先,确保Android应用...
读书笔记:java socket 编程计算机网络TCP作业