基于java的聊天室/群发控制台程序

java聊天室

  1、概述

     基于tcp协议的,由一个服务器和多个客户端组成,一个客户端发送消息,其他所有客户端都能接收到消息。在服务器端设置一个线程监听客户端发来的请求(消息),并且向所有的客户端响应。每个客户端也有一个线程用来接收服务器端的请求。

  2、代码如下

  

public class Client {
    public static void main(String[] args) throws  IOException {
        //创建套接字
        Socket socket = new Socket("localhost",81);
        //获取套接字的输出流
        BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
        //启动线程监听接收服务器端的消息
        new Thread(new ClientMessage(socket)).start();
        Scanner sc = new Scanner(System.in);
        //客户端发送消息
        while(true){
            String msg = sc.nextLine();
            if("exit".equals(msg)){
                break;
            }
            byte[] b = msg.getBytes();
            bos.write(b, 0, b.length);
            bos.flush();
        }
        bos.close();
        socket.close();
    }
}

class ClientMessage implements Runnable{
    private Socket socket;

    public ClientMessage(Socket socket) {
        super();
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
            byte[] b = new byte[1024*8];
            while(true){
                int i = bis.read(b);
                if(i == -1){
                    break;
                }
                String msgFromServer = new String(b,0,i);
                System.out.println(msgFromServer);
            }
            bis.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

}
public class Server {
	public static void main(String[] args) throws IOException {
		ServerSocket s = new ServerSocket(81);// 创建服务器套接字,指定端口号
		List<Socket> sockets = new ArrayList<Socket>();
		System.out.println("服务器启动了");
		int i = 0;
		for (; i <= 100; i++) {// 可以有100个客户端
			// accept()是一个阻塞方法,如果客户端没有请求到来,该方法就不会执行。请求到达后立即产生一个Socket对象
			// 侦听并接收到此套接字的连接
			Socket socket = s.accept();
			// 输出该套接字的字符串格式
			System.out.println(socket);
			sockets.add(socket);
			// 启动线程用来接收消息并且群发
			new Thread(new ChatMessage(socket, sockets)).start();
		}
	}
}
class ChatMessage implements Runnable {
	private Socket socket;
	private List<Socket> sockets;

	public ChatMessage(Socket socket, List<Socket> sockets) {
		super();
		this.socket = socket;
		this.sockets = sockets;
	}

	@Override
	public void run() {
		try {
			// 获取当前socket的输入流
			BufferedInputStream bis = new BufferedInputStream(
					socket.getInputStream());
			byte[] b = new byte[1024];
			String msg = "";
			while (true) {
				int i = bis.read(b);
				if (i == -1) {
					break;
				}
				//获取客户端的消息
				msg = new String(b, 0, i);
				//群发
				for (Socket s : sockets) {
					out(s, socket.getInetAddress().getHostName() + ":" + msg);
				}
			}
		} catch (IOException e) {
		}
	}

	private void out(Socket s, String msg) {
		try {
			BufferedOutputStream bos = new BufferedOutputStream(
					s.getOutputStream());
			byte[] b = msg.getBytes();
			bos.write(b, 0, b.length);
			bos.flush();
		} catch (IOException e) {

		}
	}
}

  

  3、总结

    首先创建服务器对象ServerSocket,并指定端口号,端口不能被占用。然后调用其accept()方法侦听并接收到此套接字的连接。这是服务器的准备工作。客户端需要创建套接字指定ip和端口号确定对应的服务器。

    

  

时间: 2024-10-29 02:54:05

基于java的聊天室/群发控制台程序的相关文章

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

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

基于java网络聊天室--客户端

ChatClient.java 包含名为ChatClient的public类,其主要功能为定义客户端的界面,添加时间监听与事件处理.该类定义了Connect()与DisConnect()方法实现与客户端的连接与断开连接.当登陆到指定的服务器时,调用ClientReceive类实现消息收发,同时该类还定义了SendMessaga()方法来其他用户发送带有表情的消息或悄悄话. 1 /* 2 * To change this license header, choose License Headers

基于java网络聊天室--服务器端

服务器端: ChatServer.java 包含名为ChatServer的public类,其主要功能为定义服务器端的界面,添加时间监听与时间处理.调用ServerListen类来实现服务端用户上线与下线的监听,调用ServerListen来实现服务器端的消息收发. 1 package com.silianbo.server; 2 3 import com.silianbo.CaptureScreen; 4 import java.awt.BorderLayout; 5 import java.a

基于java网络聊天室--截图实现

package com.silianbo; /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ import java.awt.BorderLayout; import java.awt.C

java swing聊天室代码

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

Unity手游之路&lt;三&gt; 基于Unity+Java的聊天室源码

http://blog.csdn.net/janeky/article/details/17233199 项目介绍 这是一个简单的Unity项目,实现最基本的聊天室群聊功能.登录聊天室后,用户可以输入信息进行发言,其他人可以收到消息.玩家还可以更改昵称.项目详细描述的前后端Socket通信,编码,解析二进制流的过程. 这个项目的主要目标有几个: 1.实现Unity的前后端通信进制          2.学习Protobuf的应用 最终的效果 前端            a.网络通信NetClie

基于SSH的聊天室

随网络聊天室是用户比较喜欢的一种WEB应用程序,借助聊天室,用户可以及时互通信息,交流思想.本系统主要采用了基于B/S(Browser/Server,即浏览器/服务器)模式开发的简易聊天室系统.本系统主要是采用了S2SH技术和JSP技术开发的动态网站.系统开发主要包括前台页面设计.功能设计和后台数据处理设计(即发言区管理和用户管理). 本系统采用了MYECLIPSE8.5作为开发工具,后台数据库采用了MYSQL数据库设计,利用JAVA的框架技术S2SH和后台数据处理.利用TOMCAT6.0以上的

Java简单聊天室

实现Java简单的聊天室 所用主要知识:多线程+网络编程 效果如下图 /** * * @author Administrator * * 简单的多人聊天系统——重点:同时性,异步性 * 1.客户端:发送消息,并且接收消息 * 1.1 消息发送至服务器:服务器每次都将客户发过来的信息发送到每个客户端 * 1.2 接收消息:发送的同时也要接收消息,所以必须有两个线程,一个发送消息,一个接收消息 * 1.3 关于这两个线程:如果没有线程,接收和发送就是按顺序执行的了,那么是发送后接收还是接收后发送?或

php+html5基于websocket实现聊天室的方法

<?php error_reporting(E_ALL); ob_implicit_flush(); $sk=new Sock('127.0.0.1',8000); $sk->run(); class Sock{ public $sockets; public $users; public $master; public function __construct($address, $port){ $this->master=$this->WebSocket($address, $