Socket实现聊天客户端
今天在极客学院上看到了一个关于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实现聊天客户端的更多相关文章
- Python Socket 编程——聊天室示例程序
上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...
- Socket.IO聊天室~简单实用
小编心语:大家过完圣诞准备迎元旦吧~小编在这里预祝大家元旦快乐!!这一次要分享的东西小编也不是很懂啊,总之小编把它拿出来是觉地比较稀奇,而且程序也没有那么难,是一个比较简单的程序,大家可以多多试试~ ...
- 用c#写的一个局域网聊天客户端 类似小飞鸽
用c#写的一个局域网聊天客户端 类似小飞鸽 摘自: http://www.cnblogs.com/yyl8781697/archive/2012/12/07/csharp-socket-udp.htm ...
- Android 基于Socket的聊天应用(二)
很久没写BLOG了,之前在写Android聊天室的时候答应过要写一个客户(好友)之间的聊天demo,Android 基于Socket的聊天室已经实现了通过Socket广播形式的通信功能. 以下是我写的 ...
- 使用socket实现聊天功能
public class Service { //服务器 public static void main(String[] args) { ServerSocket serverSocket=null ...
- windows phone 8.1开发:socket通信聊天
本例用WPF程序做服务器端,windows phone程序做客户端.我们使用基于UDP协议的Socket通信.更多关于socket信息请查看:http://msdn.microsoft.com/zh- ...
- java Socket多线程聊天程序
参考JAVA 通过 Socket 实现 TCP 编程 参考java Socket多线程聊天程序(适合初学者) 以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包 ...
- Java Socket聊天室编程(一)之利用socket实现聊天之消息推送
这篇文章主要介绍了Java Socket聊天室编程(一)之利用socket实现聊天之消息推送的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下 网上已经有很多利用socket实现聊天的例子了 ...
- 【WebSocket No.2】WebSocket和Socket实现聊天群发
介绍: 前面写过一篇简单的websocke实现服务端.这一篇就不在说什么基础的东西主要是来用实例说话,主要是讲一下实现单聊和群组聊天和所有群发的思路设计. 直接不懂的可以看一下上一篇简单版本再来看也行 ...
随机推荐
- 容器化分布式日志组件ExceptionLess的Angular前端UI
写在前面 随着微服务架构的流行,日志也需要由专门的分布式日志组件来完成这个工作,我们项目使用的是 ExceptionLess 这个组件,它是前后端分离的:这篇文章我们就来实践容器化 Exception ...
- 【TensorFlow 官网 可以直接访问】让中国开发者更容易地使用TensorFlow打造人工智能应用
人工智能的神奇之处,在于它能被应用在医疗保健.交通运输和环境保护等方方面面,为复杂的社会问题探寻解决方案.如今,在人工智能的协助下,人们得以探索全新的研究领域,开发创新的产品,让数以百万计的用户从中获 ...
- 如何为分布式系统优雅的更换RPC
为啥需要更换RPC? 很多小伙伴都遇到过需要为分布式系统调用更换RPC的问题,为什么会遇到这种事呢?其实,在系统搭建初期,需求简单,架构简单,最重要的是请求量也少,所以很多系统都采用快速原型开发模式, ...
- gulp将多张小图自动合成雪碧图
最近一直在做移动端的改版项目,做之前老大就跟我说了好几次,说这次改版一定要用雪碧图减少一个页面的图片的请求次数,能加快页面的加载速度就一定要加快,我说可以.因为之前的项目开发时间过短,也没有时间去慢慢 ...
- thinkphp零碎小知识
在使用thinkphp搭建后台的时候,有很多的参数需要去配置,有的记不住还要去查找,这里把一些基本的参数整理一下,还有些零碎的知识点,与大家共勉,希望能方便大家. 友情提示:这些配置是 thinkph ...
- 利用create-react-app结合react-redux、react-router4构建单页应用
1.创建项目: a.全局安装create-react-app: npm install create-react-app -g b.执行create-react-app my-projectN ...
- Python中的数据类型
计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等各种各样的数据,不同的数据,需要定义不同的数 ...
- 如何处理JS,css与smarty标签的冲突
smarty的默认标记符是大括号:{}, 假如我们页面上有JS且定义了函数或者对象,或者有CSS定义了样式,就会出现大括号, smary引擎就会把这些大括号当作smarty语法来解释, 很明显,这些C ...
- 实验与作业(Python)-02 Python函数入门与温度转换程序
截止日期 实验目标 学会定义函数,使用函数.学会导入在某个文件中定义的函数. input获得值,然后通过eval或者int.float将其转换为相应的类型. 学会使用列表:访问列表.append.遍历 ...
- 我为什么放弃使用MyBatis3的Mapper注解
最近在使用MyBatis3做项目.在使用注解实现Mapper的时候遇到了比较奇葩的问题:在实现数据的batch insert的时候总是报错.好不容易可以正常插入了,但是又不能返回自增的主键id到实体b ...