java 服务器群发客户端_基于java的聊天室/群发控制台程序

该博客介绍了如何使用Java实现一个基于TCP协议的聊天室系统,其中服务器能够接收一个客户端的消息并广播给所有连接的客户端。文章详细展示了客户端和服务器的代码实现,包括套接字的创建、消息的发送与接收,以及服务器的群发功能。
摘要由CSDN通过智能技术生成

java聊天室

1、概述

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

2、代码如下

public classClient {public static voidmain(String[] args) throws IOException {//创建套接字

Socket socket = new Socket("localhost",81);//获取套接字的输出流

BufferedOutputStream bos = newBufferedOutputStream(socket.getOutputStream());//启动线程监听接收服务器端的消息

new Thread(newClientMessage(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();

}

}classClientMessage implements Runnable{privateSocket socket;publicClientMessage(Socket socket) {

super();this.socket =socket;

}

@Overridepublic voidrun() {try{

BufferedInputStream bis= newBufferedInputStream(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 sockets = new ArrayList();

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 sockets;

public ChatMessage(Socket socket, List 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和端口号确定对应的服务器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值