今天在极客学院上看到了一个关于Socket的视频讲解,感觉还不错,就写了份代码,拿来分享一下。


Socket使用方法


关于Socket的使用,我们首先要弄清楚的是,在服务器端还是在客户端使用。因为这的确是很重要的。

  • 对于客户端,需要使用new Socket(ip,port)就可以了。

  • 对于服务器端的话,我们需要借助于ServerSocket 的accept方法获得与特定的客户端相关联的Socket实例。

  • 然后通信的双方借助于socket里面的方法,获得输出流和输入流完成相关的通信的逻辑处理就可以了


我的服务器端的实现

首先先展示一下我的目录结构吧。



每个类的实现的功能就是:

  • ChatManager:添加socket到队列;发送数据
  • ChatSocket: 实现了单独的线程的通信处理
  • MainTest: 本类的测试入口
  • ServerListener: 服务器端的侦听类,负责获取连接成功的客户端

然后是具体的代码。

个人建议代码的阅读顺序为:MainTest.java–>ServerListener.java–>ChatSocket.java–> ChatManager.java


package com.mark.chatserver;

import java.util.Vector;

/**
 * 通信客户端管理类
 * 实现的业务就是将产生的客户端添加到服务器端的一个队列中
 * 并把所有客户端产生的信息,发送给所有的客户端对象
 * @author lhdn
 *
 */
public class ChatManager {

    private ChatManager(){}
    private static final ChatManager newInstance = new ChatManager();
    public static Vector<ChatSocket> vector = new Vector<ChatSocket>();

    public static ChatManager getChatManager() {

        return newInstance;
    }

    /**
     * 添加一个客户端到队列中
     * @param cm
     */
    public void add(ChatSocket cm ){
        vector.add(cm);
    }

    /**
     * 发布客户端的消息
     * @param chatSocket
     * @param line
     */
    public void publish(ChatSocket chatSocket, String line) {
        for(int i = 0 ; i< vector.size() ;i++) {
            ChatSocket temp = (ChatSocket) vector.get(i);
            //过滤自身发送给服务器端的信息
            if(!temp.equals(chatSocket)){
                temp.out(line);
            }
        }

    }

}
package com.mark.chatserver;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;

/**
 * 用来和客户端进行通信的线程类
 * @author lhdn
 *
 */
public class ChatSocket extends Thread {

    private Socket socket ;

    public ChatSocket(Socket s) {
        this.socket = s;
    }

    /**
     * 向客户端输出信息(以字节的方式)
     * @param str
     */
    public void out(String str) {
        try {
            OutputStream os = socket.getOutputStream();
            os.write((str+"\n").getBytes("UTF-8"));
            os.flush();
        } catch (Exception e) {
            throw new RuntimeException("没有向客户端输出正确的信息");
        }
    }

    @Override
    public void run() {
        out("\n恭喜,您已经连接到了我们的服务器了!\n");
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));
            String line = "";
            while((line = reader.readLine())!=null) {
                System.out.println(line);
                ChatManager.getChatManager().publish(this,line);
            }
        } catch (Exception e) {
            // TODO: handle exception
        }
    }

}
package com.mark.chatserver;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.JOptionPane;

/**
 * 主要的框架类,用于侦听客户端的链接并将服务器端产生的socket以一个新的线程的方式进行运行
 * @author lhdn
 *
 */
public class ServerListener extends Thread {

    @Override
    public void run() {
        try {
            ServerSocket server = new ServerSocket(9999);
            while(true){
                Socket socket = server.accept();
                JOptionPane.showMessageDialog(null, "现在有客户端连接上了服务器!");
                ChatSocket chatSocket = new ChatSocket(socket);
                chatSocket.start();
                ChatManager.getChatManager().add(chatSocket);
            }
        } catch (IOException e) {
            // TODO: handle exception
        }

    }

}
package com.mark.chatserver;

public class MainTest {

    public static void main(String []args){
        ServerListener serverListener = new ServerListener();
        serverListener.start();
    }

}

下面一起来看一下代码的测试效果吧

这里使用到的是XUbuntu终端telnet方式



总结


这个小程序的核心的思想就在于使用线程来进行客户端的信息的处理。

再来回顾一下整个服务器端的原理和流程吧。

*-* 1首先创建出一个ServerSocket对象来侦听来自于客户端的链接

*-* 2将链接到的客户端对应的Socket添加到一个队列中(这里使用了一个单独的类ChatManager进行了实现),并开启这个新的线程进行处通信

*-* 3使用相关的输入流,输出流进行数据的交互

*-* 4使用终端的telnet的方式实现了服务器端的测试,对于从事后台开发的很方便哦。

Socket实现聊天客户端的更多相关文章

  1. Python Socket 编程——聊天室示例程序

    上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...

  2. Socket.IO聊天室~简单实用

    小编心语:大家过完圣诞准备迎元旦吧~小编在这里预祝大家元旦快乐!!这一次要分享的东西小编也不是很懂啊,总之小编把它拿出来是觉地比较稀奇,而且程序也没有那么难,是一个比较简单的程序,大家可以多多试试~ ...

  3. 用c#写的一个局域网聊天客户端 类似小飞鸽

    用c#写的一个局域网聊天客户端 类似小飞鸽 摘自: http://www.cnblogs.com/yyl8781697/archive/2012/12/07/csharp-socket-udp.htm ...

  4. Android 基于Socket的聊天应用(二)

    很久没写BLOG了,之前在写Android聊天室的时候答应过要写一个客户(好友)之间的聊天demo,Android 基于Socket的聊天室已经实现了通过Socket广播形式的通信功能. 以下是我写的 ...

  5. 使用socket实现聊天功能

    public class Service { //服务器 public static void main(String[] args) { ServerSocket serverSocket=null ...

  6. windows phone 8.1开发:socket通信聊天

    本例用WPF程序做服务器端,windows phone程序做客户端.我们使用基于UDP协议的Socket通信.更多关于socket信息请查看:http://msdn.microsoft.com/zh- ...

  7. java Socket多线程聊天程序

    参考JAVA 通过 Socket 实现 TCP 编程 参考java Socket多线程聊天程序(适合初学者) 以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包 ...

  8. Java Socket聊天室编程(一)之利用socket实现聊天之消息推送

    这篇文章主要介绍了Java Socket聊天室编程(一)之利用socket实现聊天之消息推送的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下 网上已经有很多利用socket实现聊天的例子了 ...

  9. 【WebSocket No.2】WebSocket和Socket实现聊天群发

    介绍: 前面写过一篇简单的websocke实现服务端.这一篇就不在说什么基础的东西主要是来用实例说话,主要是讲一下实现单聊和群组聊天和所有群发的思路设计. 直接不懂的可以看一下上一篇简单版本再来看也行 ...

随机推荐

  1. splay模板(BZOJ3224)

    用splay实现二叉搜索树的模板,支持插入,删除,找前缀后缀,x的排名以及第x名的数. #include <cstdio> #define l(x) t[x].s[0] #define r ...

  2. C语言程序第一次作业

    (一)实验总结 1. 求圆面积和周长 (1)题目 输入圆的半径,计算圆的周长和面积. (2)流程图 (3)测试数据及运行结果 测试数据1:r=2 运行结果: (4)实验分析 没有问题 2.判断闰年 ( ...

  3. C语言程序设计第二次作业—————顺序结构改

    1.输出带框文字:在屏幕上输出以下3行信息. ************* Welcome ************* 源程序 #include <stido.h> int mian() { ...

  4. 【linux】---常用命令整理

    linux常用命令整理 一.ls命令 就是list的缩写,通过ls 命令不仅可以查看linux文件夹包含的文件,而且可以查看文件权限(包括目录.文件夹.文件权限)查看目录信息等等 常用参数搭配: l ...

  5. 开源小工具 - swagger API访问代码生成器(js/typescript)

    现在流行前后端分离,后端通常会使用swagger生成api文档,提供给前端的同事来调用,一般前端是查看这个文档,根据文档说明编写调用代码.其实,swagger已经提供了足够多的描述信息,我们可以基于s ...

  6. PLSQL(2)

      游标                      [1] 不带参数的游标 -- 取出EMP表中的所有人名字 DECLARE CURSOR C IS SELECT * FROM EMP; V_EMP ...

  7. 4月18开始看《C++Primer Plus》

    好久没有写博客了,之前也说过水平有限,也写不出什么技术博客,只能写些感悟. 过年之后,陆续做了2.3个项目,刚开始可能不太熟悉流程,怎么和页面传数据?最近一个项目1/2天就写完代码了,真的很简单,主要 ...

  8. JavaScript数据结构和算法----队列

    前言 队列和栈很像,只是用了不同的原则.队列是遵循先进先出(FIFO)原则的一组有序的的项,队列在尾部添加新元素,从顶部移除元素.最新添加的元素必须必须排队在队列的,末尾.可以想象食堂排队买饭的样子. ...

  9. node之子线程child_process模块

    node.js是基于单线程模型架构,这样的设计可以带来高效的CPU利用率,但是无法却利用多个核心的CPU,为了解决这个问题,node.js提供了child_process模块,用于新建子进程,子进程的 ...

  10. DDL/DML/DCL区别概述

    DDL DDL的概述 DDL(Data Definition Language 数据定义语言)用于操作对象和对象的属性,这种对象包括数据库本身,以及数据库对象,像:表.视图等等,DDL对这些对象和属性 ...