聊天室功能实现
来源:互联网 发布:什么是云计算服务 编辑:程序博客网 时间:2024/05/16 05:51
服务器端代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;
/*
* 聊天服务器
*/
public class ChatServer {
private boolean serverNormal = true;
private ServerSocket ss;
//把负责通信的对象放到集合,以便遍历
private List<TongxinThread> list = new ArrayList<TongxinThread>();
public ChatServer(int port)throws Exception{
ss = new ServerSocket(port);//创建服务器
new Thread(){
public void run(){
try{
while(serverNormal){
//每建立一个连接,都会产生一个连接通道socket
//阻塞方法要使用独立线程执行,不影响其它的代码执行。
Socket socket = ss.accept();//如果有异常代表服务停止,不能建立连接了
if(!serverNormal){//服务器正在停止
socket.close();
return ;
}
//设置接收数据超时时间,如果此时间内收不到数据,则会抛出SocketTimeoutException
socket.setSoTimeout(1000*60);
//把socket交给通信线程
TongxinThread tx = new TongxinThread(socket);
list.add(tx);//可以遍历发送数据
tx.send("欢迎登陆聊天室");
tx.send("当前在线人数: "+list.size());
tx.start();
}
}catch(Exception e){
e.printStackTrace();
System.out.println("服务已经停止");
}
}
}.start();
new Thread(){
public void run(){
try {
Scanner sc = new Scanner(System.in);
while(true){
String s = sc.nextLine();
if("close".equals(s)){
//停止服务器
//*不允许建立新的连接
//*断开所有的客户端
//*停止服务器
serverNormal = false;
for(TongxinThread tx : list){
tx.s.close();
}
ss.close();//停止服务器
}
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("服务器停止时出错");
}
}
}.start();
}
/*
* 通信线程类,使用内部类实现
*/
class TongxinThread extends Thread{
Socket s;
BufferedReader in ;//readLine();
PrintStream out;//println(String);
public TongxinThread(Socket s)throws Exception{
this.s = s;
in = new BufferedReader(new InputStreamReader(s.getInputStream()));
out = new PrintStream(s.getOutputStream());
}
public void run(){
//接收数据
try{
while(true){
String line = null;
try{
line = in.readLine();//针对每个客户端发过来的每句话。如果客户端断开,会抛出SocketException异常//Connection Reset异常
}catch(SocketTimeoutException e){
send("你很久没说话了。。");
continue;
}
if(line==null){
break;
}
//接收到的line,遍历发送到每个客户端。
for(Iterator<TongxinThread> it = list.iterator();it.hasNext();){
TongxinThread tx = it.next();
try{
tx.send(line);//如果发不出去,可能已断开,会出现异常
}catch(Exception e){
//对其中一个客户端发送失败,将其移除掉
it.remove();
}
}
}
}catch(Exception e){
e.printStackTrace();
//从当前客户端接收数据失败,即自己断开,把自己移除掉
list.remove(this);
}
}
public void send(String s){
out.println(s);
out.flush();
}
}
public static void main(String[] args)throws Exception{
ChatServer s = new ChatServer(8000);
System.out.println("聊天服务器已经启动。。。");
}
}//ChatServer
客户端代码:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
/*
* 客户端读与写都是阻塞操作,得在不同的线程执行其代码。
*/
public class ChatClient {
private Socket s;
private BufferedReader in;
private PrintStream out;
private String name;
private Scanner sc = new Scanner(System.in);
public ChatClient(String ip,int port)throws Exception{
s = new Socket(ip, port);
in = new BufferedReader(new InputStreamReader(s.getInputStream()));
out = new PrintStream(s.getOutputStream());
}
public void start(){
System.out.print("请输入姓名: ");
name = sc.nextLine();
new Thread(){
public void run(){
try{
while(true){
System.out.println("......................");
String line = in.readLine();//如果出现异常,表示已经断开,接收不到数据
if(line==null)
break;
System.out.println(line);
}
}catch(Exception e){
e.printStackTrace();
System.out.println("你已断开");
}
}
}.start();
new Thread(){
public void run(){
try{
while(true){
String s = sc.nextLine();
System.out.println("-------------------");
out.println(name + " 说: " + s);
out.flush();
System.out.println("=======================");
}
}catch(Exception e){
e.printStackTrace();
System.out.println("你已断开");
}
}
}.start();
}
public static void main(String[] args)throws Exception{
ChatClient c = new ChatClient("localhost", 8000);
c.start();
}
}
- 聊天室功能实现
- 聊天室功能实现代码
- dwr实现聊天室功能
- 消息队列实现聊天室功能
- java实现qq聊天室功能
- Redis实现多人多聊天室功能
- java nio实现聊天室功能
- websocket实现聊天室等功能
- websocket+tomcat实现聊天室功能
- C++和flex实现聊天室功能
- C++和flex实现聊天室功能
- 聊天室的功能实现(主要部分)
- Tornado实现聊天室功能(websocket)
- 【linux】多进程实现聊天室功能
- 【转】用socket实现聊天室功能
- WebSocket jfinal 实现简单的聊天室功能
- 在同一个页面中实现登陆验证进入聊天室功能
- DWR使用:文字提示功能实现、简易聊天室
- xxxxxxxxxxxxxxxxxxxxx
- 鸭子-策略模式(Strategy)
- opencsv
- 防止下载apk文件变成zip文件的方法--服务器端配置
- 抽象工厂模式
- 聊天室功能实现
- oracle 数据加载方法
- Bash中对变量的操作
- VC6.0图形处理10--腐蚀膨胀
- 重新开始写博客啦!
- 网络协议
- sed命令详解
- 测试管理工具TestDirector安装部署及常见问题解决方法
- telnet 远程登录电脑的例子