安卓Socket通信
2016-04-07 11:37
471 查看
进来做项目需要用到消息推送,顺手写一下Socket通信。
Socket是神马就不多说啦,说下它的特点以及和HTTP通信的区别。两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据。而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求。
下面先上一个Socket服务器端程序:
在服务器端我们主要是用到ServerSocket设置服务器监听端口,以及获得Socket对象。而我们主要的操作就是对这个Socket对象进行的操作。
下面是客户端代码:
布局部分:
SocketAvtivity类:
代码只有这么多,基本完成了Socket功能的介绍。
Socket是神马就不多说啦,说下它的特点以及和HTTP通信的区别。两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据。而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求。
下面先上一个Socket服务器端程序:
public class SocketServer { //消息编码方式 public static final String bm = "utf-8"; BufferedReader reader; BufferedReader inReader; BufferedWriter writer; /** * @param args */ public static void main(String[] args) { SocketServer socketServer = new SocketServer(); socketServer.StartServer(); } private void StartServer() { ServerSocket serverSocket = null; Socket socket = null; try { //设置服务器监听端口 serverSocket = new ServerSocket(9898); System.out.println("启动成功"); while (true) { socket = serverSocket.accept(); System.out.println("客户端联入" + socket.hashCode()); manageConnection(socket); sendMessage(socket); } } catch (Exception e) { e.printStackTrace(); } finally { try { // 关闭流 socket.close(); serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } // 向客户端发送消息 private void sendMessage(final Socket socket) { new Thread(new Runnable() { @Override public void run() { try { // 发送的消息从命令行得到 inReader = new BufferedReader(new InputStreamReader( System.in)); writer = new BufferedWriter(new OutputStreamWriter( socket.getOutputStream(), bm)); String recivedmsg; while ((recivedmsg = inReader.readLine()) != null) { System.out.println("发送:" + recivedmsg); writer.write(recivedmsg + "\n"); writer.flush(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { inReader.close(); writer.close(); } catch (IOException e) { e.printStackTrace(); } } } }).start(); } // 接受客户端发来的消息 private void manageConnection(final Socket socket) { new Thread(new Runnable() { @Override public void run() { try { // 读取信息 reader = new BufferedReader(new InputStreamReader( socket.getInputStream(), bm)); String recivedMsg; while ((recivedMsg = reader.readLine()) != null) { System.out.println(recivedMsg); } } catch (IOException e) { e.printStackTrace(); } finally { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } }).start(); } }
在服务器端我们主要是用到ServerSocket设置服务器监听端口,以及获得Socket对象。而我们主要的操作就是对这个Socket对象进行的操作。
下面是客户端代码:
布局部分:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="5dp"> <EditText android:id="@+id/ip_address" android:layout_width="match_parent" android:layout_height="wrap_content" /> <EditText android:id="@+id/neirong" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" /> <Button android:id="@+id/sendBtn" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:gravity="center_horizontal" android:text="发送" android:textColor="#1133aa" android:textSize="20sp" /> <TextView android:id="@+id/receiveText" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="20dp" android:gravity="center_horizontal" android:textColor="#000000" android:textSize="20sp" /> </LinearLayout>
SocketAvtivity类:
public class SocketAvtivity extends Activity implements View.OnClickListener { private TextView receiveText; private Button sendBtn; private EditText ip_address; private EditText neirong; private String ip; private Handler mHandler; private static final int ww = 123; private Socket socket; private BufferedReader reader; private BufferedWriter writer; //设置消息编码方式 public static final String bm = "utf-8"; public String serverip = "192.168.1.115"; public int server_port = 9898; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_socket); sendBtn = (Button) findViewById(R.id.sendBtn); sendBtn.setOnClickListener(this); receiveText = (TextView) findViewById(R.id.receiveText); ip_address = (EditText) findViewById(R.id.ip_address); neirong = (EditText) findViewById(R.id.neirong); //服务器地址 ip_address.setText(serverip); mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case ww: receiveText.setText((String) msg.obj); break; } } }; new Thread(new Runnable() { @Override public void run() { ip = ip_address.getText().toString(); try { socket = new Socket(ip, server_port); reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), bm)); ReadServermsg(reader); } catch (IOException e) { e.printStackTrace(); } } }).start(); } @Override public void onClick(View v) { if (v.getId() == R.id.sendBtn) { new Thread(new Runnable() { @Override public void run() { try { String msg = neirong.getText().toString(); writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), bm)); writer.write(msg + "\n"); writer.flush(); } catch (IOException e) { e.printStackTrace(); } } }).start(); } } private void ReadServermsg(final BufferedReader reader) { new Thread(new Runnable() { @Override public void run() { String readerMsg; try { while ((readerMsg = reader.readLine()) != null) { Message message = new Message(); message.what = ww; message.obj = readerMsg; mHandler.sendMessage(message); } } catch (IOException e) { e.printStackTrace(); } } }).start(); } }
代码只有这么多,基本完成了Socket功能的介绍。
相关文章推荐
- java-模拟tomcat服务器
- Linux socket 初步
- 小心服务器内存居高不下的元凶--WebAPI服务
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题