在实际应用中,Server总是在指定的端口上监听是否有Client请求,一旦监听到Client请求,Server就会启动一个线程来响应该请求,而Server本身在启动完线程之后马上又进入监听状态。

示例:Socket应用之简易聊天室

当一个Client连接Server之后,Server将向所有Client发送一个消息,这就需要Server和Client都一直处于监听状态。

在Server,1. 通过一个List来存储所有连接进来的Socket 2. 为每个client开启了一个线程来响应请求。

服务端程序

public class Server {

  private static final int SERVER_PORT = 54321;

  private static List<Socket> mClientList = new ArrayList<Socket>();

  private ExecutorService mExecutorService;

  private ServerSocket mServerSocket;

  public Server () {

    try {

      mServerSocket = new ServerSocket(SERVER_PORT);

      mExecutorService = Executors.newCachedThreadPool();

      socket client = null;

      while(true) {

        client = mServerSocket.accept();

        mClientList.add(client);

        mExecutorService.execute(new ThreadServer(client));

      }

    } catch (IOException e) { }

  }

  // 为每个client独立开启一个线程。

  static class ThreadServer implements Runnable {

    private Socket mSocket;

    private BufferedReader mBufferedReader;

    private PrintWriter mPrintWriter;

    private String mStrMsg;

    public ThreadServer(Socket socket) throw IOException {

      mSocket = socket;

      mBufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream));

      mStrMsg = “user(”+mSocket.getInetAddress()+”) come, total client count: ” + mClientList.size();

      sendMessage();

    }

    public void run() {

      try {

        while((mStrMsg = mBufferedReader.readLine())!=null){

          if(mStrMsg.trim().equals(“exit”)) {

            // 当一个client退出时

            mClientList.remove(mSocket);

            mBufferedReader.close();

            mPrintWriter.close();

            mStrMsg = “user(”+mSocket.getInetAddress()+”) exit, total client count: ” + mClientList.size();

            mSocket.close();

            sendMessage();

            break;

          } else {

            mStrMsg = mSocket.getInetAddress() + “:”+ mStrMsg;

            sendMessage();

          } // else

        } // while

      }  catch(IOException e) { }

    }

    // 发送信息给所有client

    private void sendMessage() throws IOException {

      for(Socket socket : mClientList) {

        mPrintWriter = new PrintWriter(client.getOutputStream(), true);

        mPrintWriter.println(mStrMsg);

      }

    }

  }

}

 

客户端程序

// android client app

在onCreate方法中

// 点击“登录”连接服务器

mSocket = new Socket(SERVER_IP, SERVER_PORT);

// 取得输入输出流

mBufferedReader = new BufferedReader(new InputStreamReader(mSocket.getInputStream()));

mPrintWriter = new PrintWriter(mSocket.getOutputStream(), true);

// 点击“发送消息”

String msg = mMsgBox.getText().toString();

mPrintWriter.print(msg);

mPrintWriter.flush();

// 开启线程监听服务器发来的消息

new Thread(mRunnable).start();

 

// 监听Server发来消息的线程

private Runnable mRunnable = new Runnable(){

  public void run() {

    while(true) {

      try {

        if((mStrMsg = mBufferedReader.readLine())!=null) {

          mStrMsg += “\n”;

          mHandler.sendMessage(mHandler.obtainMessage());

        }

      } catch(Exception e) { }

    }

  }

};

 

Handler mHandler = new Hander(){

  super.handleMessage(msg);

  try {

    mMsgLabel.append(mstrMsg);

  } catch(Exception e) { }

}

示例:Socket应用之简易聊天室的更多相关文章

  1. Express+Socket.IO 实现简易聊天室

    代码地址如下:http://www.demodashi.com/demo/12477.html 闲暇之余研究了一下 Socket.io,搭建了一个简易版的聊天室,如有不对之处还望指正,先上效果图: 首 ...

  2. Socket实现简易聊天室,Client,Server

    package seday08; import java.io.BufferedWriter;import java.io.OutputStream;import java.io.OutputStre ...

  3. php+websocket搭建简易聊天室实践

    1.前言 公司游戏里面有个简单的聊天室,了解了之后才知道是node+websocket做的,想想php也来做个简单的聊天室.于是搜集各种资料看文档.找实例自己也写了个简单的聊天室. http连接分为短 ...

  4. 学习JavaSE TCP/IP协议与搭建简易聊天室

    一.TCP/IP协议 1.TCP/IP协议包括TCP.IP和UDP等 2.域名通过dns服务器转换为IP地址 3.局域网可以通过IP或者主机地址寻找到相应的主机 4.TCP是可靠的连接,效率低,且连接 ...

  5. node+websocket创建简易聊天室

    关于websocket的介绍太多,在这就不一一介绍了,本文主要实现通过websocket创建一个简易聊天室,就是90年代那种聊天室 服务端 1.安装ws模块,uuid模块,ws是websocket模块 ...

  6. 基于Node.js + WebSocket 的简易聊天室

    代码地址如下:http://www.demodashi.com/demo/13282.html Node.js聊天室运行说明 Node.js的本质就是运行在服务端的JavaScript.Node.js ...

  7. Java实现简易聊天室

    Java实现简易聊天室 在学习<Java从入门到精通>这本书,网络通信,基于TCP实现的简易聊天室,我这里对书中的代码略做了修改,做个记录. 这里先放一下运行效果图,代码放在最后. 运行效 ...

  8. C#编程 socket编程之unity聊天室

    上面我们创建了tcp的客户端和服务端,但是只能进行消息的一次收发.这次我们做一个unity的简易聊天室,使用了线程,可以使用多个客户端连接服务器,并且一个客户端给服务器发消息后,服务器会将消息群发给所 ...

  9. node.js+websocket实现简易聊天室

    (文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) websocket提供了一种全双工客户端服务器的异步通信方法,这种通信方法使用ws或者wss协议,可 ...

随机推荐

  1. ASP.NET Core 1.0基础之依赖注入

      来源https://docs.asp.net/en/latest/fundamentals/dependency-injection.html ASP.NET Core 1.0在设计上原生就支持和 ...

  2. Memcached 集群架构方面的问题

    *  集群架构方面的问题 o memcached是怎么工作的? o memcached最大的优势是什么? o memcached和MySQL的query cache相比,有什么优缺点? o memca ...

  3. linux下通过iptables只允许指定ip地址访问指定端口的设置方法

    这篇文章主要介绍了linux下通过iptables只允许指定ip地址访问指定端口的设置方法,需要的朋友可以参考下. 首先,清除所有预设置 iptables -F#清除预设表filter中的所有规则链的 ...

  4. Java集合框架2

    8. 枚举(Enum)使用示例 声明一个枚举类型的简单形式如下: 访问类型 enum 枚举类名{值1[,值2,......]}; 例8. 为枚举类添加辅助方法. package set; public ...

  5. Objective-C:协议protocol

    六.协议(protocol) 关键字:@optional.@required (1)是一个类共享的一个方法列表 (2)它声明了一系列的方法而不进行实现 (3)遵从某个协议,就是需要实现协议中的方法 ( ...

  6. Faster\Slower 快慢指针的应用

    leetcode很多题目都是利用快慢指针来解决题目,下面具体讲解下快慢指针. 概念: 快指针在每一步走的步长要比慢指针一步走的步长要多.快指针通常的步速是慢指针的2倍.在循环中的指针移动通常为:fas ...

  7. 7 个 Bootstrap 在线编辑器用于快速开发响应式网站

    Bootstrap 已经使响应式网站开发变得简单很多. 但是如果你不必手动写全部代码,事情会如何呢? 如果你可以自由地选择你想要使用的Bootstrap 组件.并可以把它们拖拽到画布中,事情会如何呢? ...

  8. JavaScript中将html字符串转化为Jquery对象或者Dom对象

    实例代码: $('<a href="javascript:void(0);" onclick="showUI(this,"4028f65d5d1bb627 ...

  9. A5-1和DES两个加密算法的学习

    A5-1加密算法 1.基本原理 A5-1加密算法是一种流password,通过密钥流对明文进行加密.然后用密钥流进行对密文的解密操作. 这样的算法主要用于GSM加密.也就是我们平时打电话的时候.通信数 ...

  10. easyui combobox实现本地模糊查询

    直接上代码 $("#combobox1").combobox({ valueField : "value", textField : "text&qu ...