关于Android Socket的总结

来源:互联网 发布:北京冰灯节 知乎 编辑:程序博客网 时间:2024/06/05 11:25
之前的Socket程序(一个Android设备做server,其他几个Android做clients)好像还有些问题,所以晚上想先对Android的Socket编程做点总结,以备后续工作的开展。因为资料来源于多篇网络帖子、书籍,还有我自己的总结,所以对其中引用部分不一一列出,望各位原作者见谅!

总的来说,Android Socket编程是基于javaSocket相关内容的,但是又不完全相同。比如说Android的Bluetooth通信,也是通过BluetoothSocket实现的,BluetoothSocket虽然在大体上还是和Socket相近,但是还有很多Sokcet支持的方法,BluetoothSocket却并不支持,比如javaSocket有判断连接超时的方法,但是BluetoothSocket中就没有,需要自己写判断超时,比如用Timer或者就干脆读取本地时间,然后来读秒计数。

先来最简单的两个JavaSocket例子,一个UDP,一个TCP的,就我个人而言,其实只写过TCP的,而且是Linux、Windows、Android各个平台,但是UDP只是耳闻,没有实践。
  1. //UDP的客户端代码实现如下
  2. public static void main(String[] args) {
  3. try {
  4. //首先创建一个DatagramSocket对象

  5. DatagramSocket socket = new DatagramSocket(4567);
  6. //创建一个InetAddree
  7. InetAddress serverAddress =InetAddress.getByName("192.168.1.104");

  8. String str = "hello"; //这是要传输的数据
  9. byte data [] = str.getBytes(); //把传输内容分解成字节

  10. //创建一个DatagramPacket对象,并指定要讲这个数据包发送到网络当中的哪个、地址,以及端口号

  11. DatagramPacket packet = new
  12. DatagramPacket(data,data.length,serverAddress,4567);
  13. //调用socket对象的send方法,发送数据

  14. socket.send(packet);
  15. } catch (Exception e) {
  16. // TODO Auto-generated catch block
  17. e.printStackTrace();
  18. }
  19. }

  20. //UDP的服务端代码实现如下:
  21. //创建一个DatagramSocket对象,并指定监听的端口号
  22. DatagramSocket socket = new DatagramSocket(4567);
  23. byte data [] = new byte[1024];
  24. //创建一个空的DatagramPacket对象
  25. DatagramPacket packet =newDatagramPacket(data,data.length);
  26. //使用receive方法接收客户端所发送的数据,
  27. //如果客户端没有发送数据,该进程就停滞在这里
  28. socket.receive(packet);
  29. String result = new
  30. String(packet.getData(),packet.getOffset(),
  31. packet.getLength());
  32. System.out.println("result--->" + result);

  1. //TCP客户端实现:
  2. //创建一个Socket对象,指定服务器端的IP地址和端口号

  3. Socket socket = new Socket("192.168.1.104",4567);
  4. //使用InputStream读取硬盘上的文件
  5. InputStream inputStream = new
  6. FileInputStream("f://file/words.txt");

  7. //从Socket当中得到OutputStream
  8. OutputStream outputStream = socket.getOutputStream();
  9. byte buffer [] = new byte[4*1024];
  10. int temp = 0 ;
  11. //将InputStream当中的数据取出,并写入到OutputStream当中
  12. while((temp = inputStream.read(buffer)) != -1){
  13. outputStream.write(buffer, 0, temp);
  14. }
  15. outputStream.flush();
  16. }

  17. //TCP服务器端实现:
  18. //声明一个ServerSocket对象
  19. ServerSocket serverSocket = null;
  20. try {
  21. //创建一个ServerSocket对象,并让这个Socket在4567端口监听

  22. serverSocket = new ServerSocket(4567);
  23. //调用ServerSocket的accept()方法,接受客户端所发送的请求,
  24. //如果客户端没有发送数据,那么该线程就停滞不继续
  25. Socket socket = serverSocket.accept();
  26. //从Socket当中得到InputStream对象

  27. InputStream inputStream = socket.getInputStream();
  28. byte buffer [] = new byte[1024*4];
  29. int temp = 0;

  30. //从InputStream当中读取客户端所发送的数据
  31. while((temp = inputStream.read(buffer)) != -1){
  32. System.out.println(new String(buffer,0,temp));
  33. }
  34. } catch (IOException e) {
  35. // TODO Auto-generated catch block
  36. e.printStackTrace();
  37. }
  38. serverSocket.close();
  39. }

上面的两个例子就非常简单粗暴,没有任何的滑头,Server端就是先指定监听的端口,然后就等待建立连接(对于UDP而言,没有这一步),其后就等待数据接收。Client端绑定Server的IP和Port,发送数据。

额,感觉困了...意欲就此停笔...反正AndroidSocket和JavaSocket还是基本很类似的,从上面的小例子中以小见大吧,基本的模式就是这样!发现那些洋洋洒洒几千子的技术贴真真是来之不易,以后我一定好好认认真真回帖,踏踏实实做人,bonnenuit, le monde.
原创粉丝点击