Android网络编程Socket长连接

在实际的应用中客户端可能需要和服务器端保持长时间的通信,即服务器需要不断地读取客户端数据,并向客户端写入数据;客户端也需要不断地读取服务器数据,并向服务器写入数据。

简单实现代码如下:

 1 public class MyServer {
 2    //定义保存所有Socket的ArrayList
 3    public staticArrayList socketList = newArrayList();
 4
 5    public static voidmain(String[] args) throws IOException {
 6       // TODOAuto-generated method stub
 7       ServerSocket ss = newServerSocket(30000);
 8       while(true){
 9          //此代码会阻塞,将一直等待别人连接
10          Socket s = ss.accept();
11          socketList.add(s);
12          //每当客户端连接后启动一条ServerThread线程为该客户端服务
13          new Thread(newServerThread(s)).start();
14       }
15    }
16 }
17 服务端通信线程
18 public classServerThread implements Runnable {
19    //定义当前线程所处理的Socket
20    Socket s = null;
21    //该线程所处理的Socket所对应的输入流
22    BufferedReader br = null;
23    public ServerThread(Socket s) throws IOException {
24       this.s = s;
25       //初始化该Socket对应的输入流
26       br = newBufferedReader(new InputStreamReader(s.getInputStream(),
27             "utf-8"));
28    }
29    @Override
30    public void run() {
31       // TODOAuto-generated method stub
32       try
33       {
34          String content = null;
35          //采用循环不断从Socket中读取客户端发送过来的数据
36          while((content = readFromClient())!=null){
37             //遍历socketList中的每个Socket
38             //将读到的内容向每个Socket发送一次
39             for(Socket s : MyServer.socketList){
40                 OutputStream os = s.getOutputStream();
41                 os.write((content + "\n").getBytes("utf-8"));//注意发送消息的时候一定要加换行符,因为在readLine的时候看的就是换行符
42             }
43          }
44       }catch(IOException e) {
45          e.printStackTrace();
46       }
47    }
48
49    public String readFromClient()
50    {
51       try{
52          return br.readLine();
53       }catch(IOException e){   //如果捕捉到异常,表明该Socket对应的客户端已经被关闭
54          //删除该Socket
55          MyServer.socketList.remove(s);
56       }
57       return null;
58    }
59 }
public classMainActivity extends Activity {
   EditText input, show;
   Button send;
   OutputStream os;
   Handler handler;
   @Override
   protected voidonCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      input = (EditText) findViewById(R.id.input);
      send = (Button) findViewById(R.id.send);
      show = (EditText) findViewById(R.id.show);
      handler = new Handler() {
         public voidhandleMessage(android.os.Message msg) {
            if (msg.what == 0x123) {
                show.append("\n" + msg.obj.toString());
            }
         };
      };
      newAsyncTask(){
         @Override
         protected String doInBackground(String... params) {
            // TODOAuto-generated method stub
            Socket s;
            try {
                s = new Socket("192.168.1.75", 30000);
                //客户端启动ClientThread线程,不断读取来自服务器的数据
                new Thread(newClientThread(s, handler)).start();
                os = s.getOutputStream();
            } catch(Exception e) {
                e.printStackTrace();
            }
            return null;
         }
      }.execute("");
      send.setOnClickListener(newOnClickListener() {
         @Override
         public voidonClick(View v) {
            // TODOAuto-generated method stub
            try {
                //将用户在文本框中输入的内容写入网络
                os.write((input.getText().toString() + "\r\n")
                      .getBytes("utf-8"));
                input.setText("");
            } catch(IOException e) {
                // TODOAuto-generated catch block
                e.printStackTrace();
            }
         }
      });
   }
}
客户端通信线程
public classClientThread implements Runnable {
   private Socket s;  //该线程负责处理的Socket
   private Handler handler;
   //该线程所处理的Socket对应的输入流
   BufferedReader br = null;
   public ClientThread(Socket s, Handler handler) throws IOException {
      this.s = s;
      this.handler = handler;
      br = newBufferedReader(new InputStreamReader(s.getInputStream()));
   }
   @Override
   public void run() {
      // TODOAuto-generated method stub
      try {
         String content = null;
         //不断读取Socket输入流中的内容
         while ((content = br.readLine()) != null) {
            //每当读到来自服务器的数据后,发送消息通知程序界面显示数据
            Message msg = newMessage();
            msg.what = 0x123;
            msg.obj = content;
            handler.sendMessage(msg);
         }
      } catch(Exception e) {
         e.printStackTrace();
      }
   }
}

原文地址:http://i.cnblogs.com/EditPosts.aspx?opt=1

参考地址:

    android中对服务端的长连接【socket】

    http://blog.csdn.net/yaya_soft/article/details/11778593

      http://gavinwen.me/?post=2

    http://www.cnblogs.com/asi24/archive/2013/06/05/3119444.html

    http://coach.iteye.com/blog/2024444

    http://gstarwd.iteye.com/blog/619171

    

    Android学习笔记(七)之Android socket通信-解决中文乱码

    http://www.2cto.com/kf/201209/155337.html

    

时间: 2024-10-10 20:44:34

Android网络编程Socket长连接的相关文章

Android 网络编程 Socket

1.服务端开发 创建一个Java程序 public class MyServer { // 定义保存所有的Socket,与客户端建立连接得到一个Socket public static List<Socket> socketList = new ArrayList<Socket>(); public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(

Android 网络编程 Socket Http

在Android的网络通讯中,通常会使用Socket进行设备间数的数据通讯,使用Http来对网络数据进行请求. 1.Socket(套接字) 不管是有过Java开发经验还是.NET开发经验的同学都应该对Socket有或多或少的了解,常见的TCP或者UDP协议其实都是基于Socket来实现的. Socket是用于描述网络上的一个设备中的一个进程或者应用程序的,Socket由IP地址和端口号两部分组成.IP地址用来定位设备,端口号用来定位应用程序或者进程,比如我们常见的运行在80端口上的HTTP协议.

android 网络编程--socket tcp/ip udp http之间的关系

网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层,一般编程人员接触最多的就是应用层和运输层,再往下的就是所谓的媒体层了,不是我们研究的对象. 下面是应用层.运输层,网络层.链路层通信协议概图.我们经常接触到的一般是: http协议:应用层协议,并且http协议是基于tcp连接的,主要解决的是如何包装协议的 tcp协议:运输层协议,通常也叫做tcp/ip协议,主要解决数据如何在网络中传输 udp协议:运输层协议,用户数据报协议,不可靠的协议,只负责把应用层的协议的数

Android 网络编程——socket failed: EACES (Permission denied)

当Android网络socket编程时出现如下错误: "socket failed: EACES (Permission denied)" 是因为建立的套接字没有权限对外连接. 解决: 在AndroidManifest.xml文件中,加上这么一句,取得权限 即:<uses-permission android:name="android.permission.INTERNET"/>

Android网络编程Socket【实例解析】

Socket 其实和JavaWeb 里面的Socket一模一样 建立客服端,服务器端,服务器开一个端口供客服端访问 第一步创建服务器端:(这里把为了便于讲解,把服务器端,和客服端都放在手机上了) 创建Android工程 socketserver package com.example.socketserver; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import

网络编程-socket实现连接循环

解决报端口被使用错误 phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR)  bug 1:客户端敲回车被卡主,客户端被卡在recv等待接收数据 import socket client=socket.socket(socket.AF_INET,socket.SOCK_STREAM) client.connect(('127.0.0.1',8080)) #通信循环 while True: msg=input('>> ').strip()

Android网络编程(一)---Socket基础

Socket通常称为""套接字.Socket字面上的中文意思为"插座".一台服务器可能会提供很多服务,每种服务对应一个Socket,而客户的"插头"也是一个Socket.Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.Socket把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议.Socket用于描述IP地址和端口,是一个通信链的句柄.应

Android网络编程系列 一 Socket抽象层

在<Android网络编程>系列文章中,前面已经将Java的通信底层大致的描述了,在我们了解了TCP/IP通信族架构及其原理,接下来我们就开始来了解基于tcp/ip协议层的Socket抽象层.本篇文章将会让我们清楚的了解和学会使用Socket. 什么是Socket?它又是如何运作的?它的表现形式是什么?等等这些问题,本篇文章将逐步的揭晓. 一. 什么是Socket Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口,你可以借助它建立TCP连接等等,而http是个应用层的

Android网络编程网上文章总结

关于网络编程,网上也有许多好的文章,这里我就选了几篇觉得不错的归纳到了一起,仅供参考 Android网络编程概述 首先,应该了解的几个问题: 1)Android平台网络相关API接口 a) java.net.*(标准Java接口) java.net.*提供与联网有关的类,包括流.数据包套接字(socket).Internet协议.常见Http处理等.比如:创建URL,以及URLConnection/HttpURLConnection对象.设置链接参数.链接到服务器.向服务器写数据.从服务器读取数