示例:Socket应用之简易聊天室
在实际应用中,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应用之简易聊天室的更多相关文章
- Express+Socket.IO 实现简易聊天室
代码地址如下:http://www.demodashi.com/demo/12477.html 闲暇之余研究了一下 Socket.io,搭建了一个简易版的聊天室,如有不对之处还望指正,先上效果图: 首 ...
- Socket实现简易聊天室,Client,Server
package seday08; import java.io.BufferedWriter;import java.io.OutputStream;import java.io.OutputStre ...
- php+websocket搭建简易聊天室实践
1.前言 公司游戏里面有个简单的聊天室,了解了之后才知道是node+websocket做的,想想php也来做个简单的聊天室.于是搜集各种资料看文档.找实例自己也写了个简单的聊天室. http连接分为短 ...
- 学习JavaSE TCP/IP协议与搭建简易聊天室
一.TCP/IP协议 1.TCP/IP协议包括TCP.IP和UDP等 2.域名通过dns服务器转换为IP地址 3.局域网可以通过IP或者主机地址寻找到相应的主机 4.TCP是可靠的连接,效率低,且连接 ...
- node+websocket创建简易聊天室
关于websocket的介绍太多,在这就不一一介绍了,本文主要实现通过websocket创建一个简易聊天室,就是90年代那种聊天室 服务端 1.安装ws模块,uuid模块,ws是websocket模块 ...
- 基于Node.js + WebSocket 的简易聊天室
代码地址如下:http://www.demodashi.com/demo/13282.html Node.js聊天室运行说明 Node.js的本质就是运行在服务端的JavaScript.Node.js ...
- Java实现简易聊天室
Java实现简易聊天室 在学习<Java从入门到精通>这本书,网络通信,基于TCP实现的简易聊天室,我这里对书中的代码略做了修改,做个记录. 这里先放一下运行效果图,代码放在最后. 运行效 ...
- C#编程 socket编程之unity聊天室
上面我们创建了tcp的客户端和服务端,但是只能进行消息的一次收发.这次我们做一个unity的简易聊天室,使用了线程,可以使用多个客户端连接服务器,并且一个客户端给服务器发消息后,服务器会将消息群发给所 ...
- node.js+websocket实现简易聊天室
(文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) websocket提供了一种全双工客户端服务器的异步通信方法,这种通信方法使用ws或者wss协议,可 ...
随机推荐
- [部署Mantis]用Administrator注册新用户时设置密码
伤不起的Mantis邮箱配置,在新的Mantis配置里面默认通过接收激活邮件来设定密码. 如果你Mantis邮箱配置OK的话一切OK,遇到我这样死活配不成功,网络上大神们众说纷纭,一一参照,无奈死伤无 ...
- MapReduce任务分析与讨论MapReduce job explained
In the last post we saw how to run a MapReduce job on Hadoop. Now we're going to analyze how a MapRe ...
- Objective-C:分类(Category、extension)
分类(Category .Extension) (一)分类的划分 (2) 1.(命名的类别)类别Category:只能添加新的方法,不能添加新变量. 2.(未命名的类别)类 ...
- Style 的查找 FindResource
1)根据名称查找 PrintPreview fe = new PrintPreview(new Summary()); string strResourceHeader = "headerS ...
- Mac 苹果OS X小技巧:如何更改文件的默认打开方式
OS X小技巧:如何更改文件的默认打开方式 1.command + i 打开简介 2.选择合适的软件打开方式 3.选择全部更改 如图: 转自:http://digi.tech.qq.com/a/201 ...
- Endv 博客简介
Endv 博客简介 此博客收集了 C++.Android.C#.java.php 等优秀的开源项目, 同时也对 Windows.Linux.CentOS 等系列操作系统的开发环境.办公环境的配置写了一 ...
- Linux远程上传、下载文件的方法
主要内容: ftp命令 scp命令 WinScp Putty (PSCP) Xshell 一.ftp命令 服务器有安装ftp Server,另外一台linux可以使用ftp的client程序来进行文件 ...
- Android控件之HorizontalScrollView 去掉滚动栏
在默认情况下.HorizontalScrollView控件里面的内容在滚动的情况下,会出现滚动栏,为了去掉滚动栏.仅仅须要在<HorizontalScrollView/>里面加一句 ...
- 矩阵经典题目四:送给圣诞夜的礼品(使用m个置换实现对序列的转变)
https://vijos.org/p/1049 给出一个序列,含n个数.然后是m个置换,求对初始序列依次进行k次置换,求最后的序列. 先看一个置换.把置换表示成矩阵的形式.然后将m个置换乘起来.那么 ...
- winform暴走表情制作器
c# winform暴走表情制作器,项目工程下载地址:项目下载地址 程序运行截图: 部分代码:获取鼠标所在的图片中坐标 private void pictureBox1_MouseDown(objec ...