首页
登录 | 注册

Android之socket编程

 因为要用就拿来学习一下,但总也理解的不透彻,就总结一下,也算是学习的过程了。
一。基础知识
socket用于描述IP地址和端口,是一个通信链的句柄。它是网络通信过程中端点的抽象表示。Socket编程有TCP和UDP两种操作方式,TCP是基于连接的,采用数据流套接字Stream Socket;UDP是基于无连接的,采用数据包套接字DatagramSocket。Socket编程主要分服务器端编程和客户端编程。
二.基于TCP的Socket编程
服务器端编程步骤:    
1.创建服务器套接字ServerSocket,并绑定到一个端口上(可取0-65535,但0-1023是系统预留的)
2.
服务器套接字ServerSocket设置监听等待客户端连接请求
3.接收客户端连接请求,并返回一个Socket
客户端编程步骤:
1.创建客户端套接字Socket,需指定服务器端的IP地址和端口号
2.连接(Android创建socket时会自动连接),与服务器端通信
3.关闭套接字

注意:中间管道连接是通过InputStream/OutputStream流实现的,一旦管道建立,就可实现通信。
如下代码为在服务器端建立一个ServerSocket:
  1. package com.exaple.ServerSocket;

  2. public class ServerSocket {

  3.     public static void main(String[] args) {
  4.         
  5.       ListenSocket listenSocket = new ListenSocket();
  6.       listenSocket.start();
  7.     }

  8. }
  1. package com.exaple.ServerSocket;

  2. import java.io.IOException;
  3. import java.net.ServerSocket;
  4. import java.net.Socket;
  5. import javax.swing.JOptionPane;

  6. public class ListenSocket extends Thread {
  7.     @Override
  8.     public void run() {
  9.         try {
  10.             ServerSocket serverSocket = new ServerSocket(9999);
  11.             while (true) {
  12.                 Socket socket = serverSocket.accept();
  13.                 JOptionPane.showMessageDialog(null, "有客户端连接到了本机的9999端口");

  14.                 ChatSocket chatSocket = new ChatSocket(socket);
  15.                 chatSocket.start();
  16.                 SocketManager.GetSocketManager().add(chatSocket);
  17.             }
  18.         } catch (IOException e) {
  19.             // TODO Auto-generated catch block
  20.             e.printStackTrace();
  21.         }
  22.     }
  23. }
  1. package com.exaple.ServerSocket;

  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.InputStreamReader;
  6. import java.io.OutputStream;
  7. import java.net.Socket;

  8. public class ChatSocket extends Thread {

  9.     Socket socket;

  10.     public ChatSocket(Socket ss) {
  11.         socket = ss;
  12.     }

  13.     @Override
  14.     public void run() {
  15.         String str = "helloworld";
  16.         String line = null;

  17.         try {
  18.             // 向客户端发送信息
  19.             OutputStream outputStream = socket.getOutputStream();
  20.             outputStream.write(str.getBytes("gbk"));
  21.             outputStream.flush();
  22.             // 关闭输出流
  23.             socket.shutdownOutput();

  24.             // 接收客户端的的信息
  25.             InputStream inputStream = socket.getInputStream();
  26.             BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

  27.             while ((line = bufferedReader.readLine()) != null) {
  28.                 System.out.print(line+"\n");
  29.             }
  30.             bufferedReader.close();
  31.             outputStream.close();
  32.             inputStream.close();
  33.             socket.close();
  34. //          System.out.println("isClosed:" + socket.isClosed());
  35.         } catch (IOException e) {
  36.             // TODO Auto-generated catch block
  37.             e.printStackTrace();
  38.         }
  39.     }
  40. }
  1. package com.exaple.ServerSocket;

  2. import java.util.Vector;

  3. public class SocketManager {

  4.     private static final SocketManager sm = new SocketManager();

  5.     private SocketManager() {
  6.     }
  7.     public static SocketManager GetSocketManager() {
  8.         return sm;
  9.     }

  10.     Vector<ChatSocket> vector = new Vector<ChatSocket>();

  11.     public void add(ChatSocket cs) {
  12.         vector.add(cs);
  13.     }
  14. }
虽然看着有点多,但调理还是比较清晰的,考虑到accept()是阻塞函数,故在主线程中,新开一个线程用来监听,当有客户端连接时再开启另一个线程进行输入和输出的处理。另外SocketManager用来管理多个客户端的情况,在这用到了单例模式,即只有一个管理对象。可能有点麻烦的地方,是InputStream/OutputStream部分。这一部分是建立在java工程里面中,运行后利用终端的telnet 命令即可实现客户端与服务器的连接了。具体步骤:win+R -> cmd ->telnet localhost 9999。连接成功会弹出"有客户端连接到了本机的9999端口"窗口,在eclipse

如下为在客户端的代码:






相关文章

  • Centos zeromq 消息队列 安装
    这是个类似于Socket的一系列接口,他跟Socket的区别是:普通的socket是端到端的(1:1的关系),而ZMQ却是可以N:M 的关系,人们对BSD套接字的了解较多的是点对点的连接,点对点连接需要显式地建立连接.销毁连接.选择协议(T ...
  • Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect.accept.recv或recvfrom这样的阻塞程序(所谓阻塞方式block,顾名思义,就是进 ...
  • 现象: linux下C++开发的网络服务器程序,在页面刷新时有时候会出现进程退出的情况.使用gdb调试,发现是系统发送了SIGPIPE信号,导致进程退出的. 规避或解决方法: 最根本的解决办法是提高socket编程recv或send函数的健 ...
  • 分享个JAVA学习路线[新手可以参考看下]觉得不好的,大家可以提出来我补充. 第一阶段 技术名称 技术内容 J2SE (java基础部分) java开发前奏 计算机基本原理,Java语言发展简史以及开发环境的搭建,体验Java程序的开发,环 ...
  • 原文:http://www.rosoo.net/a/201112/15430.htmlandroid 模拟器使用的IP 地址为"127.0.0.1";使用PC机的端口号,在模拟器TCP连接调试之前必须使用android ...
  • 基于指纹的音乐检索 - Java与C之间的socket通信
    最近正在开发一个基于指纹的音乐检索应用,算法部分已经完成,所以尝试做一个Android App.Android与服务器通信通常采用HTTP通信方式和Socket通信方式.由于对web服务器编程了解较少,而且后台服务器已经采用原始socket ...

2020 unjeep.com webmaster#unjeep.com
12 q. 0.013 s.
京ICP备10005923号