java简易聊天室1.2

系统正在退出

先通知服务器,让服务器该做什么做什么。

停掉线程,监听等一段时间,时间到cut掉

SERVER端

import java.net.*;
import java.io.*;
import java.util.*;
public class Chatserver {

    boolean started=false;//有没有监听好
    ServerSocket ss=null;//初始化
    List<Client>clients=new ArrayList<Client>();

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

    public void start()
    {
        try {
            ss=new ServerSocket(8888);//端口号8888,TCP,监听在8888端口
            started=true;//连接上
        }catch (BindException e){
            System.out.println("端口使用中");
            System.exit(0);
        }catch(IOException e){
            e.printStackTrace();//给出方法的调用程序,一直到异常的产生位置
        }
        try{

            while(started)//已经启动
            {
                Socket s=ss.accept();//已经启动不断接收客户端的连接
                Client c=new Client(s);//接收进来以后起一个线程
                System.out.println("a client connected!");
                new Thread(c).start();//让这个线程启动,为它服务
                clients.add(c);
              //dis.close();
                }

            }catch (IOException e) {
            e.printStackTrace();
            }finally{
                try
                {
                    ss.close();
                }catch(IOException e){
                    e.printStackTrace();
                    }
            }

    }

    class Client implements Runnable{//线程内部类

        private Socket s;//包装的每个客户端一个单独的Socket,一个半连接
        private DataInputStream dis=null;//每个客户端都保有自己的inputStream;从Socket里面赌内容的输入管道
        //保留有自己的连接
        private DataOutputStream dos=null;
        private boolean bConnected=false;//是否连上,初始化false
        public Client(Socket s){//传递Socket这个属性,构造函数
            this.s=s;//初始化
            try {
                dis=new DataInputStream(s.getInputStream());//初始化
                dos=new DataOutputStream(s.getOutputStream());
                 bConnected=true;//连上以后等于TRUE
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public void send(String str){
             try {
                dos.writeUTF(str);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public void run(){//单独的线程为单独的客户端服务
            //接收到对方之后变成true
            try{
              while(bConnected){//有东西来就读
                String str=dis.readUTF();//阻塞式,接受客户端给我的字符串且打印
                System.out.println(str);

                for(int i=0;i<clients.size();i++){//集合类
                    Client c=clients.get(i);
                    c.send(str);
System.out.println("发出了一句话");
                }

                /*for(Iterator<Client> it=clients.iterator();it.hasNext();){
                    Client c=it.next();
                    c.send(str);
                }*/
                /* Iterator it=clients.iterator();
                while(it.hasNext()){
                    Client c=it.next();
                    c.send(str);
                                    }//内部锁定,没必要 效率低*/
               }
            }catch (EOFException e){
                System.out.println("Client closed!");
            }
            catch (IOException e) {
                e.printStackTrace();
            }finally{
                try{
                    if(dis !=null) dis.close();
                    if(dos !=null) dos.close();
                    if(s!=null){
                        s.close();
                        //s=null;
                    }
                }catch(IOException e1){
                    e1.printStackTrace();
                }
            }
        }
    }
}

Client

import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import java.net.*;
import java.io.*;
public class Chatclient extends Frame{

    Socket s=null;
    DataOutputStream dos=null;
    DataInputStream dis=null;
    private boolean bConnected =false;

    TextField tfTxt=new TextField();//只有一行可以写,有一个ACTION
    TextArea taContent=new TextArea();//标签定义多行的文本输入控件

    Thread tRecv=new Thread(new RecvThread());

    public static void main(String[] args) {
        new Chatclient().LaunchFrame();
    }

    public void LaunchFrame()
    {
        setLocation(400,300);
        this.setSize(300,300);
        add(tfTxt,BorderLayout.SOUTH);
        add(taContent,BorderLayout.NORTH);
        pack();
        this.addWindowListener(new WindowAdapter(){//关闭窗口

            @Override
            public void windowClosing(WindowEvent e) {
                disconnect();
                System.exit(0);
            }

        });//匿名类
        tfTxt.addActionListener(new TFListener());
        setVisible(true);
        connect();

        //new Thread(new RecvThread()).start();
        tRecv.start();
    }

    public void connect()
    {
        try {
            s=new Socket("127.0.0.1",8888);
            dos=new DataOutputStream(s.getOutputStream());
            dis=new DataInputStream(s.getInputStream());//初始化
            System.out.println("connected!");
            bConnected=true;
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public void disconnect()//关闭方法
    {
        try{
          dos.close();
          dis.close();
          s.close();
          }catch (IOException e){
                e.printStackTrace();
           }

        /*try{
            bConnected=false;//关闭线程
            tRecv.join();//合并        

        }catch(InterruptedException e){
            e.printStackTrace();
        }finally{
            try{
                    dos.close();
             dis.close();
            s.close();
        }catch (IOException e){
            e.printStackTrace();
            }
        }*/
    }
    private class TFListener implements ActionListener

    {
        public void actionPerformed(ActionEvent e) {//一敲回车
            String str=tfTxt.getText().trim();
            //taContent.setText(str);
            tfTxt.setText("");//回车之后清空
            try {
                //DataOutputStream dos=new DataOutputStream(s.getOutputStream());
                dos.writeUTF(str);//把stream输出去
                dos.flush();
                //dos.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }

        }    

    }//内部类
    private class RecvThread implements Runnable{
        public void run(){
            try{
              while(bConnected){
                  String str=dis.readUTF();
                  System.out.println(str);
                  taContent.setText(taContent.getText()+str+‘\n‘);
               }
            }catch (SocketException e){
                System.out.println("退出");
            }catch(IOException e){
                e.printStackTrace();
             }
        }
    }
}
时间: 2024-10-16 13:57:22

java简易聊天室1.2的相关文章

基于java网络聊天室---前言

很久之前做的一个东西,现在拿出来整理一下放在自己的博客中! 一. 设计目的 随着人互联网的发展,人和人之间的沟通方式也越来越便捷和多样化,在线聊天工具已经成为人们生活中够通不可缺少的部分,在学习完 java网络编程课程,如果能开发一款属于自己的聊天工具,和好友进行私密对话,则是一件令人兴奋的事.同时,安全可靠的TCP这两种 通信协议,是非常重要的内容,值得研究. 二. 设计内容 本聊天室程序基于C/S模式,聊天室共分为服务器端和客户端两部分,服务器端程序主要负责侦听客户端发来的消息,客户端需登陆

基于C/S模式的简易聊天室

一.任务简要描述 移动互联网技术的广泛应用为人们提供了非常便捷的沟通方式.QQ.微信和微博等是便携式聊天系统的典型代表,它们的功能非常强大. 本系统利用TCP/IP协议的Socket和ServerSocket类,实现基于C/S模式的简易聊天室.该聊天室包括服务端和客户端两部分,服务端是客户端发送消息的中转站:客户端之间可以直接通信,也可以与服务器通信.聊天结束后客户端断开与服务端的连接,服务器也可以停止信息中转服务. 二.系统需求分析 本系统采用C/S软件架构,服务器端负责监听客户端发来的消息,

php+websocket搭建简易聊天室实践

1.前言 公司游戏里面有个简单的聊天室,了解了之后才知道是node+websocket做的,想想php也来做个简单的聊天室.于是搜集各种资料看文档.找实例自己也写了个简单的聊天室. http连接分为短连接和长连接.短连接一般可以用ajax实现,长连接就是websocket.短连接实现起来比较简单,但是太过于消耗资源.websocket高效不过兼容存在点问题.websocket是html5的资源 如果想要详细了解websocket长连接的原理请看https://www.zhihu.com/ques

php_3_“简易聊天室 ”实现的关键技术 详解

                  PHP+MySQL实现Internet上一个简易聊天室的关键技术  系统目标: 聊天室使用数据库汇集每个人的发言,并可将数据库内的发言信息显示在页面,让每个用户都可以看到,具体功能如下: a.用户登录:用户发言时显示其登录名信息 b.用户发言:用户输入说的话 c.显示发言信息:用户浏览所有发言信息 设计思路: (1).建立聊天室数据库及相关数据表 (2).实现用户登录页面(login.php) (3).实现发言页面(speak.php) (4).实现发言显示页

Socket编程(简易聊天室客户端/服务器编写、CocoaAsyncSocket)

Socket编程(简易聊天室客户端/服务器编写.CocoaAsyncSocket) 一.Socket 1.1 Socket简介 Socket就是为网络服务提供的一种机制.网络通信其实就是Socket间的通信,通信的两端都是Socket,数据在两个Socket间通过IO传输. 在Web服务大行其道的今天,调用Web服务的代价是高昂的,尤其是仅仅是抓取少量数据的时候尤其如此.而使用Socket,可以只传送数据本身而不用进行XML封装,大大降低数据传输的开销.Socket允许使用长连接,允许应用程序运

java swing聊天室代码

原文:java swing聊天室代码 源代码下载地址:http://www.zuidaima.com/share/1550463525358592.htm 真正的java聊天室代码,实现简单,阅读方便,原理简单! 先启动server.ServerMain的效果如下: 再启动client.ClientMain的效果如下: 注册界面: 群聊界面: 已注册用户列表: 多个账号群聊界面: 多个账号群聊界面2:

socket.io入门,简易聊天室

介绍 通常我们web使用的是http协议,但是 HTTP 协议有一个缺陷:通信只能由客户端发起. 所以我们需要一个可以由服务端主动发出的协议,即WebSocket. WebSocket是HTML5新增的一种通信协议,其特点是服务端可以主动向客户端推送信息,客户端也可以主动向服务端发送信息,是真正的双向平等对话,属于服务器推送技术的一种. Socket.IO 是一个基于 Node.js 的实时应用程序框架,在即时通讯.通知与消息推送,实时分析等场景中有较为广泛的应用. socket.io 包含两个

docker搭建swoole简易聊天室

docker搭建swoole的简易聊天室 首先pull镜像 docker pull docker.io/kong36088/nginx-php7-swoole 创建容器 docker run --name {自己创建的名字} -p 9501:9501 -p 8089:80 -d -it kong36088/nginx-php7-swoole /bin/bash 进入容器 docker exec -it {容器名字或id} /bin/bash 进入容器之后进入nginx配置文件 cd /etc/n

[Redis]-Redis简易聊天室

代码来自图书<左手MongoDB,右手Redis>第六章-简易聊天室 1.下载代码 2.安装部署py运行环境 yum install python3 -y yum install python-virtualenv -y pip install pipenv pip install --upgrade pip 3.运行代码 cd /RedisChat/ pipenv install export FLASK_APP=main.py flask run -h 10.0.0.51 -p 5000