java Socket实现简单在线聊天(二)
接《java Socket实现简单在线聊天(一)》,在单客户端连接的基础上,这里第二步需要实现多客户端的连接,也就需要使用到线程。每当有一个新的客户端连接上来,服务端便需要新启动一个线程进行处理,从而解决之前的循环读取中造成阻塞的问题。
package chat.chat;
import java.io.DataInputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
/**
* java使用socket和awt组件以及多线程简单实现在线聊天功能服务端 : 实现多个客户端连接后不断向服务端发送消息,
* 相对于第一个版本,重点在于使用了多线程。服务端还未实现转发功能,客户端图形窗口中只能看到自己输入的信息, 不能看到其他客户端发送的消息
*
* @author tuzongxun123
*
*/
public class ChatServer {
public static void main(String[] args) {
new ChatServer().start();
}
// 是否成功启动服务端
private boolean isStart = false;
// 服务端socket
private ServerSocket ss = null;
// 客户端socket
private Socket socket = null;
public void start() {
try {
// 启动服务器
ss = new ServerSocket(8888);
} catch (BindException e) {
System.out.println("端口已在使用中");
// 关闭程序
System.exit(0);
} catch (Exception e) {
e.printStackTrace();
}
try {
isStart = true;
while (isStart) {
// 启动监听
socket = ss.accept();
System.out.println("one client connect");
// 启动客户端线程
Client client = new Client(socket);
new Thread(client).start();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭服务
try {
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 客户端线程
*
* @author tuzongxun123
*
*/
class Client implements Runnable {
// 客户端socket
private Socket socket = null;
// 客户端输入流
private DataInputStream dataInputStream = null;
private boolean isConnect = false;
public Client(Socket socket) {
this.socket = socket;
try {
isConnect = true;
// 获取客户端输入流
dataInputStream = new DataInputStream(socket.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
isConnect = true;
try {
while (isConnect) {
// 读取客户端传递的数据
String message = dataInputStream.readUTF();
System.out.println("客户端说:" + message);
}
} catch (EOFException e) {
System.out.println("client closed!");
} catch (SocketException e) {
System.out.println("Client is Closed!!!!");
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭相关资源
try {
dataInputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
java Socket实现简单在线聊天(二)的更多相关文章
- java Socket实现简单在线聊天(一)
最近的项目有一个在线网页交流的需求,由于很久以前做过的demo已经忘记的差不多了,因此便重新学习一下. 我计划的大致实现步骤分这样几大步: 1.使用awt组件和socket实现简单的单客户端向服务端持 ...
- java Socket实现简单在线聊天(三)
在上一篇,利用线程使服务端实现了能够接收多客户端请求的功能,这里便需要客户端接收多客户端消息的同时还能把消息转发到每个连接的客户端,并且客户端要能在内容显示区域显示出来,从而实现简单的在线群聊. 在实 ...
- vue.js+socket.io+express+mongodb打造在线聊天[二]
vue.js+socket.io+express+mongodb打造在线聊天[二] 在线地址观看 http://www.chenleiming.com github地址 https://github. ...
- vue实现简单在线聊天
vue实现简单在线聊天 引用mui的ui库,ES6的 fetch做网络请求 //html <!DOCTYPE html> <html> <head> <met ...
- 基于Server-Sent Event的简单在线聊天室
Web即时通信 所谓Web即时通信,就是说我们可以通过一种机制在网页上立即通知用户一件事情的发生,是不需要用户刷新网页的.Web即时通信的用途有很多,比如实时聊天,即时推送等.如当我们在登陆浏览知乎时 ...
- AngularJS+Node.js+socket.io 开发在线聊天室
所有文章搬运自我的个人主页:sheilasun.me 不得不说,上手AngularJS比我想象得难多了,把官网提供的PhoneCat例子看完,又跑到慕课网把大漠穷秋的AngularJS实战系列看了一遍 ...
- Socket实现简单的聊天通信
最近学习了Socket后,感觉Socket挺好玩的,在博客中看到socket在实时聊天功能的很强大,于是乎就做了一个简单的聊天功能,今天贴出来,能够与大家一起共享,有不对之处,能够给予指出,谢谢! 服 ...
- WinForm的Socket实现简单的聊天室 IM
1:什么是Socket 所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象. 一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制. 从 ...
- JAVA Socket 编程学习笔记(二)
在上一篇中,使用了 java Socket+Tcp/IP 协议来实现应用程序或客户端--服务器间的实时双向通信,本篇中,将使用 UDP 协议来实现 Socket 的通信. 1. 关于UDP UDP协 ...
随机推荐
- 解决C#编译中"csc不是内部或外部命令"的问题
安装完 VisualStudio 编译环境后,是不能用命令行直接编译写好的csc文件的,如果不配置环境变量,在命令提示符(cmd)中编译扩展名为cs的文件,会出现错误提示"csc不是内部或外 ...
- mybatis不可忽略的细节
自我总结,欢迎拍砖! 目的:在需要返回int,long等基础类型数据的情况下,尽量在mybatis的Mapper中用基础类型的包装类. 原因:当查询的字段为空值时,mybatis会返回null,用基础 ...
- [SQL] 函数整理(T-SQL 版)
函数整理(T-SQL 版) 一.数学函数 1.求绝对值 ABS() 函数用来返回一个数值的绝对值. SELECT ABS(-5.38) AS absValue; 2.求指数 POWER() 函数是用 ...
- C#基础(三)--运算符及条件控制语句
上一章我们了解了C#的一些数据基本类型.如何定义使用变量及类型之间的相互转换.可能大家会发现程序只能按照我们的要求从上向下这样顺序一条一条的执行. 那么程序能按照我们的要求,当某个条件成立的时候才执行 ...
- JMeter基础教程1:若隐若现的参数化
1. 什么是参数化? 在开始学习JMeter参数化之前,我们先了解下什么是参数化: 参数化是自动化测试脚本的一种常用技巧.简单来说,参数化的一般用法就是将脚本中的某些输入使用参数来代替,在脚本运行时指 ...
- javascript 中 dom.getAttribute("value") 与dom.value的差异
dom 是一个 input type="text" 手动修改 input 的值, 使用 dom.getAttribute("value") 只能得到 html ...
- win7 重装 docker 启动后无法启动错误解决
描述 win7 重新安装Docker 后启动 Docker Quickstart Terminal 出现如下错误 Starting "default"... (default) ...
- WPF项目学习.三
工具代码记录 版权声明:本文为博主初学经验,未经博主允许不得转载. 一.前言 记录在学习与制作WPF过程中遇到的解决方案. 分页控件的制作,邮件发送,日志代码,excel导入导出等代码的实现过程: 二 ...
- java生产者与消费者模式
前言: 生产者和消费者模式是我们在学习多线程中很经典的一个模式,它主要分为生产者和消费者,分别是两个线程, 目录 一:生产者和消费者模式简介 二:生产者和消费者模式的实现 声明:本例来源于java经典 ...
- [SCOI2007]最大土地面积
首先,最大四边形的四个点一定在凸包上 所以先求凸包 有个结论,若是随机数据,凸包包括的点大约是\(\log_2n\)个 然鹅,此题绝对不会这么轻松,若\(O(n^4)\)枚举,只有50分 所以还是要想 ...