文档章节

Android Socket编程学习笔记

短短的歼击机
 短短的歼击机
发布于 2014/08/24 16:12
字数 941
阅读 110
收藏 1

通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。

       网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。

       在java中,Socket和ServerSocket类库位于java .net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。

 

       下面通过一个极为简单的客户端和服务端的连接例子演示下最基本的android socket通信:

       服务端的代码,在服务端特定的端口9999监听客户端请求,一旦有请求,便会执行,而后继续监听。使用accept()这个阻塞函数,就是该方法被调用后一直等待客户端的请求,直到有请求且连接到同一个端口,accept()返回一个对应于客户端的Socket。本例中很简单,服务端不断监听,一旦有请求就输出一段信息:

 

源码打印

  1. <span style="font-family:Comic Sans MS;font-size:18px;">import java.io.BufferedWriter;  

  2. import java.io.IOException;  

  3. import java.io.OutputStreamWriter;  

  4. import java.net.ServerSocket;  

  5. import java.net.Socket;  

  6.   

  7. public class Main {  

  8.     private static final int PORT = 9999;  

  9.     public static void main(String[] args) {  

  10.   

  11.         try {  

  12.             // 实例化服务器套接字 设置端口号9999  

  13.             ServerSocket server = new ServerSocket(PORT);  

  14.             while (true) {  

  15.                 Socket socket = server.accept();  

  16.                 // 获取输出流  

  17.                 BufferedWriter writer = new BufferedWriter(  

  18.                         new OutputStreamWriter(socket.getOutputStream()));  

  19.                 // 写字符串  

  20.                 writer.write("这是一段来自服务器的问候:Hello沃德!");  

  21.                 writer.flush();  

  22.                 writer.close();  

  23.             }  

  24.         } catch (IOException e) {  

  25.             // TODO Auto-generated catch block  

  26.             e.printStackTrace();  

  27.         }  

  28.   

  29.     }  

  30.   

  31. }  

  32.   

  33. </span>  


       下面是android客户端的相关内容,界面有一个按钮,点击后请求服务端的制定端口,然后显示服务端的内容,值得注意的是在android4.0以上的系统中,是不允许在主线程里面去执行网络相关的请求,否则会报错:NetworkOnMainThreadException,所以本例中新开辟一个线程初始化socket的内容:

 

源码打印

  1. <span style="font-family:Comic Sans MS;font-size:18px;">package com.example.socketdemo;  

  2.   

  3. import java.io.BufferedReader;  

  4. import java.io.IOException;  

  5. import java.io.InputStreamReader;  

  6. import java.net.Socket;  

  7. import java.net.UnknownHostException;  

  8. import android.annotation.SuppressLint;  

  9. import android.app.Activity;  

  10. import android.os.Bundle;  

  11. import android.os.Handler;  

  12. import android.os.Message;  

  13. import android.util.Log;  

  14. import android.view.View;  

  15. import android.view.View.OnClickListener;  

  16. import android.widget.Button;  

  17. import android.widget.TextView;  

  18.   

  19. @SuppressLint("HandlerLeak")  

  20. public class SocketDemo extends Activity {  

  21.     /** Called when the activity is first created. */  

  22.     private Button btn_receive;  

  23.     private TextView txt;  

  24.     private String line;  

  25.       

  26.     private static final String HOST = "192.168.1.101";    

  27.     private static final int PORT = 9999;    

  28.   

  29.   

  30.     @Override  

  31.     public void onCreate(Bundle savedInstanceState) {  

  32.         super.onCreate(savedInstanceState);  

  33.         setContentView(R.layout.activity_main);  

  34.         initControl();  

  35.     }  

  36.   

  37.     private void initControl() {  

  38.         btn_receive = (Button) findViewById(R.id.btn_receive);  

  39.         txt = (TextView) findViewById(R.id.txt);  

  40.         btn_receive.setOnClickListener(new ReceiverListener());  

  41.     }  

  42.   

  43.       

  44.     @SuppressLint("HandlerLeak")  

  45.     class ReceiverListener implements OnClickListener {  

  46.   

  47.         @Override  

  48.         public void onClick(View v) {  

  49.             // TODO Auto-generated method stub  

  50.             new Thread() {  

  51.                 @Override  

  52.                 public void run() {  

  53.                     // 执行完毕后给handler发送一个空消息  

  54.                     try {  

  55.                         // 实例化Socket  

  56.                         Socket socket = new Socket(HOST, PORT);  

  57.                         // 获得输入流  

  58.                         BufferedReader br = new BufferedReader(  

  59.                                 new InputStreamReader(socket.getInputStream()));  

  60.                         line = br.readLine();  

  61.                         br.close();  

  62.                     } catch (UnknownHostException e) {  

  63.                         // TODO Auto-generated catch block  

  64.                         e.printStackTrace();  

  65.                     } catch (IOException e) {  

  66.                         // TODO Auto-generated catch block  

  67.                         e.printStackTrace();  

  68.                     }  

  69.                     handler.sendEmptyMessage(0);  

  70.                 }  

  71.             }.start();  

  72.         }  

  73.   

  74.     }  

  75.   

  76.     // 定义Handler对象  

  77.     private Handler handler = new Handler() {  

  78.         @Override  

  79.         // 当有消息发送出来的时候就执行Handler的这个方法  

  80.         public void handleMessage(Message msg) {  

  81.             super.handleMessage(msg);  

  82.             // 处理UI  

  83.             txt.setText(line);  

  84.             Log.i("PDA""----->" + line);  

  85.         }  

  86.     };  

  87.   

  88. }  

  89.   

  90. </span>  


       效果图如下:

                                      

另外在配置文件中记得加上权限:<uses-permission android:name="android.permission.INTERNET">

       测试的时候先启动服务端,然后启动客户端,点击按钮就可获取到服务端信息。这是在是一个灰常简单的有关android socket的小例子,可以初步对socket有个简单的了解,这个笔记就先记到这里!


本文转载自:

短短的歼击机

短短的歼击机

粉丝 82
博文 262
码字总数 265749
作品 0
武汉
高级程序员
私信 提问
Android--面试中遇到的问题总结(三)

《Android 开发工程师面试指南 LearningNotes 》,作者是陶程,由梁观全贡献部分。大家可以去知乎关注这两位用心的少年。这份指南包含了大部分Android开发的基础、进阶知识,不仅可以帮助准备...

sealin
2017/02/22
0
0
Android Socket编程学习笔记

度娘给出的描述: 通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个...

长平狐
2013/04/25
24.1K
4
Android必备:Android Socket编程的了解与学习整理

看这里:Android必备:Android Socket编程的了解与学习整理 最近学习Android的过程中,由于项目、业务等因素影响,服务端通过Socket进行通信,于是开始学习Socket编程,之前的开发中,很少涉...

Realfighter
2015/03/02
0
0
Android实战经验之图像处理及特效处理的集锦(总结版)

1 Android学习笔记进阶之在图片上涂鸦(能清屏) 2 Android学习笔记之详细讲解画圆角图片 3 Android学习笔记进阶20之得到图片的缩略图 4 Android学习笔记进阶19之给图片加边框 5 Android学习笔...

xiaosi
2012/03/12
39.3K
25
android网络通信之socket教程实例汇总

一、socket基础 1、Socket通讯机制(详细),如何将socket通信的客户端与服务器 http://www.eoeandroid.com/thread-61727-1-1.html 2、Http和Socket区别 http://www.eoeandroid.com/thread-9...

程序袁_绪龙
2014/12/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

弹性盒模型常见例子

这篇文章主要是分享了三个例子( 垂直居中、响应式、圣杯 ),介绍了Flexbox的主要应用场景,并与传统方式对比, 感受Flexbox布局带来的便捷开发体验。 1 垂直居中对齐 不使用Flexbox <style>...

凌兮洛
14分钟前
0
0
Redis分布式锁服务

概述 在多线程环境下,通常会使用锁来保证有且只有一个线程来操作共享资源。比如: object obj = new object();lock (obj) { //操作共享资源 } 利用操作系统提供的锁机制,可以确保多线...

中关村的老男孩
19分钟前
1
0
idea+mybatis

报错信息如下 Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException: ### Error building SqlSession.### The error may exist in com/bdqn/dao/UserDaoMappe......

冥焱
19分钟前
2
0
Android之用sharedUserId来实现不同应用(APK)数据共享

android:sharedUserId 当APK安装的时候,userid这个标志就会产生。APK在设备上的整个生命周期中,这个ID不再改变。不同设备上同一个应用包可能有不同的userid,重要的是在给定的设备上,每个...

天王盖地虎626
21分钟前
1
0
如何给龙芯电脑录屏

vokoscreen

gugudu
29分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部