java 聊天程序

package cn.apr.chart;

import java.net.*;
import java.io.*;
import java.util.*;

public class ChatServer {
    /**
     * @param args
     *            m_threads是一个Vector静态变量,维护所有Server方的ServerThread对象,
     *            通过该变量能向所有加入聊天室的聊天者ChatApplet广播信息,撤销退出的聊天者。
     *            聊天服务者ChatServer的主方法。该方法监听聊天者Chat Applet的请求, 并为新连接的聊天者创建一个服务线程。
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ServerSocket socket = null;
        Vector m_threads = new Vector();
        System.out.println("listen...");
        try {
            // 设置ServerSocket监听端口号为5555,这个数字必须和程序聊天者ChatApplet中的port参数一致
            socket = new ServerSocket(5555);
        } catch (Exception e) {
            System.out.println("new ServerSocket() failed!");
            return;
        }
        try {
            int nid = 0;
            while (true) {
                // 监听是否有新聊天者Chat Applet连接到聊天Server,
                // 线程运行到该语句会封锁,直到有新的连接产生
                Socket s = socket.accept();
                System.out.println("accepted");
                // 创建一个新的ServerThread
                ServerThread st = new ServerThread(s, m_threads);
                // 为该线程设置一个ID号
                st.setID(nid++);
                // 将线程加入到m_threads Vector中
                m_threads.addElement(st);
                // 启动服务线程
                new Thread(st).start();
                // 通知所有ChatApplet有一个新的网友加入
                for (int i = 0; i < m_threads.size(); i++) {
                    ServerThread st1 = (ServerThread) m_threads.elementAt(i);
                    st1.write("<#>welcome" + st.getID() + "to enter chatroom!");
                }
                System.out.println("Listen again...");
            }
        } catch (Exception e) {
            System.out.println("Server is down...");
        }
    }
}

// 监听线程,监听对应的Chat Applet是否有信息传来
class ServerThread implements Runnable {
    Vector m_threads;
    Socket m_socket = null;
    DataInputStream m_in = null;
    DataOutputStream m_out = null;
    int m_nid;

    // 初始化线程
    public ServerThread(Socket s, Vector threads) {
        m_socket = s;
        m_threads = threads;
        try {
            // 构造数据输入、输出流对象
            m_in = new DataInputStream(m_socket.getInputStream());
            m_out = new DataOutputStream(m_socket.getOutputStream());
        } catch (Exception e) {
        }
    }

    public void run() // 线程的执行体
    {
        System.out.println("thread is running");
        try {
            while (true) {
                // 监听对应的ChatApplet是否传来消息
                // 线程封锁在m_in.readUTF()中,直到有信息传来才返回
                String s = m_in.readUTF();
                if (s == null)
                    break;
                // 如果Chat Applet传来的信息为“leave”,则通知所有其他的ChatApplet自己推出了
                if (s.trim().equals("leave"))
                    for (int i = 0; i < m_threads.size(); i++) {
                        ServerThread st = (ServerThread) m_threads.elementAt(i);
                        st.write("***" + getID() + "leave..." + "***");
                    }
                else
                    // 向所有ChatApplet广播该消息
                    for (int i = 0; i < m_threads.size(); i++) {
                        ServerThread st = (ServerThread) m_threads.elementAt(i);
                        st.write("<" + getID() + ">" + s);
                    }
            } // while(true)
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 从m_threads Vector中删除该线程,表示该线程已经离开聊天室
        m_threads.removeElement(this);
        System.out.println("remove element!");
        try {
            m_socket.close();
        } catch (Exception e) {
        }
    }

    // 将msg送回对应的Applet
    public void write(String msg) {
        synchronized (msg) {
            try {
                m_out.writeUTF(msg);
            } catch (IOException e) {
            }
        }
    }

    public int getID() // 获得该线程的ID
    {
        return m_nid;
    }

    public void setID(int nid) // 设置线程的ID
    {
        m_nid = nid;
    }
}

//////////////

package cn.apr.chart;

import java.awt.*;
import java.applet.*;
import java.io.*;
import java.net.*;

//继承Applet,实现Runnable
public class ChatApplet1 extends Applet implements Runnable {
    TextArea m_textarea; // 接受消息显示窗口
    TextField m_textfield; // 发送消息输入窗口
    DataInputStream m_in; // 消息输入流
    DataOutputStream m_out; // 消息输出流

    /**
     * @param args
     *  ChatApplet的初始化方法
     */
    public void init() {
        // 创建窗口
        setLayout(null);
        setSize(426, 266);
        m_textarea = new TextArea(10, 10);
        m_textfield = new TextField();
        m_in = null;
        m_out = null;
        // 初始化Appleton,并连接到聊天服务者
        try {
            // 获取applet的URL,即通过服务器地址
            URL url = getCodeBase();
            // 获取服务器IP地址
            InetAddress inetaddr = InetAddress.getByName(url.getHost());
            Socket m_socket;
            // 屏幕显示服务器IP地址、通信协议
            System.out.println("Server:" + inetaddr + "" + url.getHost() + ""
                    + url.getProtocol());
            // 创建与服务器IP地址连接的套接口,5555是聊天服务器套接口端口
            m_socket = new Socket(inetaddr, 5555);
            // 在套接口上建立输入流
            m_in = new DataInputStream(m_socket.getInputStream());
            // 在套接口上建立输出流
            m_out = new DataOutputStream(m_socket.getOutputStream());
        } catch (Exception e) {
            System.out.println("Error:" + e);
        }
        setLayout(new BorderLayout());
        add("Center", m_textarea);
        add("South", m_textfield);
        m_textarea.setEditable(false);
        // 启动监听线程
        new Thread(this).start();
    }

    // 当聊天者在消息输入窗口键入回车后,读取字符串,发送给聊天服务者。

    public boolean handleEvent(Event event) {
        String b = m_textfield.getText();
        if ((event.target == m_textfield) && (event.id == Event.ACTION_EVENT)) {
            m_textfield.setText("");
            // 将聊天者输入的消息发送给ChatServer
            try {
                m_out.writeUTF(b); // 向聊天服务者发送一个UFT格式字符串
            } catch (IOException e) {
            }
            return true;
        } else
            return super.handleEvent(event);
    }

    // 聊天者监听对应的服务线程,在读取对应服务线程传来的消息,并显示在通信显示窗口中

    public void run() {
        try {
            while (true) {
                // 聊天者监听对应服务线程发来的消息,它将封锁在该语句中,直到消息到来
                String s = m_in.readUTF(); // 读一个UTF格式字符串
                if (s != null)
                    // 将消息显示在信息显示窗口中
                    m_textarea.append(s + "\n");
            }
        } catch (Exception e) {
            m_textarea.append("Network problem or Server down.\n");
            m_textfield.setVisible(false);
        }
    }

    public void stop() {
        try {
            m_out.writeUTF("leave");
        } catch (IOException e) {
        }
    }

    public static void main(String[] args) {
        // TODO 自动生成方法存根
    }
}

时间: 2024-10-12 16:04:51

java 聊天程序的相关文章

java Socket多线程聊天程序(适合初学者)

一个非常简单的java聊天程序,有客户端和服务器端,目前只有群聊功能,其他的所有功能都可以在这个基础上添加,现在我分享出来主要是为了保持一个最简单的java聊天程序便于初学者学习,界面也非常的简洁,只有两个文件,主要是用了socket,java多线程,知识点不是很多,很适合初学者 下面是服务器端代码 package tk.socket; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.Act

java swing聊天程序--带语音

原文:java swing聊天程序--带语音 源代码下载地址:http://www.zuidaima.com/share/1550463712758784.htm java 聊天程序--带语音 聊天室服务端启动界面: ServerFrame.java ClientFrame.java 由于没有多个电脑测试多个账号登陆,所以尚未测试语音和传文件.

JAVA实现UDP组播聊天程序

分类: Java 一.实验环境 编程语言:Java1.5(运行在JVM(Java Virsual Machine)) 开发工具:eclipce3.2 测试环境:局域网 二.实验目的 社会已经进入信息时代,网络技术在飞速发展.大量应用都依赖于从一个主机向多个主机或者从多个主机向多个主机发送同一信息的能力,在Internet上分布的数目可能达数十万台,这些都需要更高的带宽,并且大大超出了单播的能力.一种能最大限度地利用现有带宽的重要技术是IP组播. 三.组播聊天程序的实现: /** * 该程序实现了

Java网络编程以及简单的聊天程序

网络编程技术是互联网技术中的主流编程技术之一,懂的一些基本的操作是非常必要的.这章主要讲解网络编程,UDP和Socket编程,以及使用Socket做一个简单的聊天软件. 全部代码下载:链接 1.网络编程简要概述: 网络编程实质实质就是两个(或多个)设备(例如计算机)之间的数据传输.而要实现两台计算机通过互联网连接进行数据传输,必输要满足计算机网络的5层协议(物理层,数据链路层,网络层,运输层,应用层):当然有划分可能不同,但现在大家比较容易接受理解的是五层模型.而其中前三层物理层,数据链路层以及

《Java项目实践》:简单聊天程序

<Java项目实践>:简单聊天程序 由于这个简单程序,还是涉及到很多的知识点,下面我们就一点一点的来完成. 我们熟悉的QQ聊天,就有一个界面,是吧,我们自己做一个简单的聊天程序,因此我们也就需要为Client写一个界面.因此,这就是我们第一步需要完成的任务. 第一步:为Client端写一个界面 完成一个界面有两种方法,一种是使用Frame对象来完成,另外一种是继承JFrame类来完成.本项目使用第二种. 第二种继承JFrame类完成的界面的程序如下: public class ChatClie

JAVA学习第六十课 — UDP协议 &amp;基于多线程模拟简单的QQ聊天程序

UDP传输 UDP有发送端和接受端,有两大类,DatagramSocket.DatagramPacket 建立发送端和接收端 建立数据包 调用Socket的接收发送方法 关闭Socket 注意:发送端和接收端是两个独立的运行程序 UDP发送端演示 DatagramPacket(byte[] buf, int length, InetAddress address, int port) 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号. public static voi

Java UDP 多用户 组播 聊天程序

一.实验环境 编程语言:Java1.8(运行在JVM(Java Virsual Machine)) 开发工具:eclipce 测试环境:局域网 二.实验目的 社会已经进入信息时代,网络技术在飞速发展.大量应用都依赖于从一个主机向多个主机或者从多个主机向多个主机发送同一信息的能力,在Internet上分布的数目可能达数十万台,这些都需要更高的带宽,并且大大超出了单播的能力.一种能最大限度地利用现有带宽的重要技术是IP组播. 三.组播聊天程序的实现: package cn.gdut.edu.udp;

java实现hello/hi的简单的网络聊天程序与ServerSocket调用栈跟踪

java实现hello/hi的简单的网络聊天程序 网络聊天采用TCP协议通过java实现 import java.io.*; import java.net.Socket; public class Client { public static void main(String[] args) throws Exception{ Socket socket = new Socket("192.168.31.68", 6666); BufferedReader reader = new

利用java的Socket实现一个简单hello/hi聊天程序

利用java的Socket实现一个简单hello/hi聊天程序 首先,我们来用java实现一个简单的hello/hi聊天程序.在这个程序里,我学习到了怎么用socket套接套接字来进行编程.简单理解了一些关于socket套接字和底层调用的关系.关于java的封装思想,我学会了一些东西,java里真的是万物皆对象.还学到了一点多线程的知识. TCP 在这里,不得不先介绍以下TCP.TCP是传输层面向连接的协议.提供了端到端的进程之间的通信方式.TCP在通信之前要先建立连接.这里我们称这个建立连接的