之前的Socket程序(一个Android设备做server,其他几个Android做clients)好像还有些问题,所以晚上想先对Android的Socket编程做点总结,以备后续工作的开展。因为资料来源于多篇网络帖子、书籍,还有我自己的总结,所以对其中引用部分不一一列出,望各位原作者见谅!
总的来说,Android Socket编程是基于java Socket相关内容的,但是又不完全相同。比如说Android的Bluetooth通信,也是通过BluetoothSocket实现的,BluetoothSocket虽然在大体上还是和Socket相近,但是还有很多Sokcet支持的方法,BluetoothSocket却并不支持,比如java Socket有判断连接超时的方法,但是BluetoothSocket中就没有,需要自己写判断超时,比如用Timer或者就干脆读取本地时间,然后来读秒计数。
先来最简单的两个Java Socket例子,一个UDP,一个TCP的,就我个人而言,其实只写过TCP的,而且是Linux、Windows、Android各个平台,但是UDP只是耳闻,没有实践。
- //UDP的客户端代码实现如下
- public static void main(String[] args) {
- try {
- //首先创建一个DatagramSocket对象
-
- DatagramSocket socket = new DatagramSocket(4567);
- //创建一个InetAddree
- InetAddress serverAddress = InetAddress.getByName("192.168.1.104");
-
- String str = "hello"; //这是要传输的数据
- byte data [] = str.getBytes(); //把传输内容分解成字节
-
- //创建一个DatagramPacket对象,并指定要讲这个数据包发送到网络当中的哪个、地址,以及端口号
-
- DatagramPacket packet = new
- DatagramPacket(data,data.length,serverAddress,4567);
- //调用socket对象的send方法,发送数据
-
- socket.send(packet);
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
-
- //UDP的服务端代码实现如下:
- //创建一个DatagramSocket对象,并指定监听的端口号
- DatagramSocket socket = new DatagramSocket(4567);
- byte data [] = new byte[1024];
- //创建一个空的DatagramPacket对象
- DatagramPacket packet =new DatagramPacket(data,data.length);
- //使用receive方法接收客户端所发送的数据,
- //如果客户端没有发送数据,该进程就停滞在这里
- socket.receive(packet);
- String result = new
- String(packet.getData(),packet.getOffset(),
- packet.getLength());
- System.out.println("result--->" + result);
- //TCP客户端实现:
- //创建一个Socket对象,指定服务器端的IP地址和端口号
-
- Socket socket = new Socket("192.168.1.104",4567);
- //使用InputStream读取硬盘上的文件
- InputStream inputStream = new
- FileInputStream("f://file/words.txt");
-
- //从Socket当中得到OutputStream
- OutputStream outputStream = socket.getOutputStream();
- byte buffer [] = new byte[4*1024];
- int temp = 0 ;
- //将InputStream当中的数据取出,并写入到OutputStream当中
- while((temp = inputStream.read(buffer)) != -1){
- outputStream.write(buffer, 0, temp);
- }
- outputStream.flush();
- }
-
- //TCP服务器端实现:
- //声明一个ServerSocket对象
- ServerSocket serverSocket = null;
- try {
- //创建一个ServerSocket对象,并让这个Socket在4567端口监听
-
- serverSocket = new ServerSocket(4567);
- //调用ServerSocket的accept()方法,接受客户端所发送的请求,
- //如果客户端没有发送数据,那么该线程就停滞不继续
- Socket socket = serverSocket.accept();
- //从Socket当中得到InputStream对象
-
- InputStream inputStream = socket.getInputStream();
- byte buffer [] = new byte[1024*4];
- int temp = 0;
-
- //从InputStream当中读取客户端所发送的数据
- while((temp = inputStream.read(buffer)) != -1){
- System.out.println(new String(buffer,0,temp));
- }
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- serverSocket.close();
- }
上面的两个例子就非常简单粗暴,没有任何的滑头,Server端就是先指定监听的端口,然后就等待建立连接(对于UDP而言,没有这一步),其后就等待数据接收。Client端绑定Server的IP和Port,发送数据。
额,感觉困了...意欲就此停笔...反正Android Socket和Java Socket还是基本很类似的,从上面的小例子中以小见大吧,基本的模式就是这样!发现那些洋洋洒洒几千子的技术贴真真是来之不易,以后我一定好好认认真真回帖,踏踏实实做人,bonne nuit, le monde.