简单的C/S聊天室

C/S聊天室分为服务器端和客户端,均需要采用多线程来实现。

服务器端主线程需要不断地监听端口,一旦有客户端的请求时,产生相应的Socket,将其加入到队列中并启动子线程,子线程负责接收客户端消息(使用Socket的getInputStream()函数来处理),再将消息发送到所有的客户端(使用Socket的getOutputStream()函数)。

客户端主线程负责获取键盘输入(相当于侦听键盘输入),并传递给Socket的输出流(使用Socket的getOutputStream(),为什么这里是getOutputStream(),因为对Socket而言是输出流),而子线程负责取得服务器端发过来的消息(使用Socket的getInputStream())。

代码如下,代码没有实现界面:

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class Server {

	private final int PORT=30000;
	public static ArrayList<Socket> socketList=new ArrayList<Socket>();
	public void init()
	{
		try (
			ServerSocket serverSocket=new ServerSocket(PORT);
		)
		{
			while(true)
			{
				Socket socket=serverSocket.accept();
				socketList.add(socket);
				new Thread(new ServerThread(socket)).start();
			}
		}catch (IOException e) {
			// TODO Auto-generated catch block
			System.out.println("服务器启动失败,是否"+PORT+"端口已被占用?");
		}

	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Server s=new Server();
		s.init();

	}

}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

public class ServerThread implements Runnable
{
	private Socket s=null;
	private BufferedReader br=null;

	public ServerThread(Socket s)
	{
		this.s=s;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			br=new BufferedReader(new InputStreamReader(s.getInputStream()));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			System.out.println("Socket对应的输入流获取失败!");
		}
		String content=null;
		while((content=readFromClient())!=null)
		{
			for(Socket s:Server.socketList)
			{
				try (
					PrintStream ps=new PrintStream(s.getOutputStream()); // 让该程序通过该输出流向socket中输出数据
				)
				{
					ps.println(content);
				}catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}

	}

	private String readFromClient() {
		// TODO Auto-generated method stub
		try {
			return br.readLine();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			Server.socketList.remove(s);
		}
		return null;
	}

}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {

	private final static int PORT=30000;
	private final static String host="127.0.0.1";

	public static void main(String[] args) throws UnknownHostException, IOException {
		// TODO Auto-generated method stub
		Socket s=new Socket(host,PORT);
		new Thread(new ClientThread(s)).start(); // 子线程完成与服务器通信
		PrintStream ps=new PrintStream(s.getOutputStream()); // 让程序通过该输出流向Socket中输出数据,得到了socket的输出流
		String line=null;

		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		// br.readline()不断读取键盘输入内容
		while((line=br.readLine())!=null)
		{
			ps.println(line);
		}
	}

}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class ClientThread implements Runnable {

	private Socket s=null;
	private BufferedReader br=null;
	public ClientThread(Socket s) throws IOException
	{
		this.s=s;
		br=new BufferedReader(new InputStreamReader(s.getInputStream())); // 该句只是返回了这样一个对象,里面并不包含屏幕中的语句
	}																	  // 其用readline()的时候才得到输入语句

	@Override
	public void run() {
		// TODO Auto-generated method stub
		String content=null;
		try {
			while((content=br.readLine())!=null) // readline()遇到输入末尾的时候才会返回null
			{
				System.out.println(content);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

参考资料:疯狂JAVA讲义

简单的C/S聊天室,布布扣,bubuko.com

时间: 2024-10-26 13:04:16

简单的C/S聊天室的相关文章

简单 《实现局域网聊天室》----待更新...

先运行一个java写的局域网聊天,效果图如下 后使用c#图形修改如下: c#代码: servlet服务端 using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; using System.Net; using System.Net.Sockets; using System.Threading; using System.IO; using System.T

Android开发之简单的聊天室(客户端与服务器进行通信)

1.使用ServerSocket创建TCP服务器端 Java中能接收其他通信实体连接请求的类是ServerSocket, ServerSocket对象用于监听来 自客户端的Socket连接,如果没有连接,它将一直处于等待状态.ServerSocket包含一个监听来自客户端连接请求的方法. 1) Socket accept():如果接收到一个客户端Socket的连接请求,该方法将返回一个与连接客户端Socket对应的Socket;否则该方法将一直处于等待状态,线程也被阻塞. 创建ServerSoc

Java网络编程 - 基于UDP协议 实现简单的聊天室程序

最近比较闲,一直在抽空回顾一些Java方面的技术应用. 今天没什么事做,基于UDP协议,写了一个非常简单的聊天室程序. 现在的工作,很少用到socket,也算是对Java网络编程方面的一个简单回忆. 先看一下效果: 实现的效果可以说是非常非常简单,但还是可以简单的看到一个实现原理. "聊天室001"的用户,小红和小绿相互聊了两句,"聊天室002"的小黑无人理会,在一旁寂寞着. 看一下代码实现: 1.首先是消息服务器的实现,功能很简单: 将客户端的信息(进入了哪一个聊

谈谈对视频聊天室开发的几点看法?

现在网上视频聊天室.视频开会软件.可视IP电话硬件随处可见,你是否想本人做一个玩玩?实在这类硬件无非是视频加上网络而建起的.假如了解视频捕捉和网络传输技能,基本就难不倒你.文章细致描述了如何应用外人需要的sdk来开拓视频聊天室. 首先简单介绍一下视频聊天室开发技术发展进程 1. C/S构造的视频聊天室硬件或者插件.这是最早的视频聊天室制作技能,曾经被淘汰. 2. P2P形式的视频聊天室硬件或者插件.这是前多少年以及眼前很多重型视频聊天项手段次要运用技能.也是很多中型视频聊天室制作运用的技能. 3

从聊天室代码看epoll的使用和对比

网上找到了一份基于epoll的简单的多人聊天室代码,感觉对epoll的学习十分有用,代码会附在后面,简单看一下epoll相关的API. epoll相关的API主要有三个:epoll_create.epoll_ctl和epoll_wait int epoll_create(int size); 参数size:用来告诉内核要监听的数目一共有多少个.返回值:成功时,返回一个非负整数的文件描述符,作为创建好的epoll句柄.调用失败时,返回-1,错误信息可以通过errno获得. int epoll_ct

Ajax PHP JavaScript MySQL实现简易的无刷新在线聊天室

思路 消息显示区 发消息 板块 消息显示 消息发送 优化 显示非重复性的数据 优化显示 加上滚动条 每次都显示最新消息 完整代码 前端代码 数据库表结构 服务器端代码 总结与展望 总结 展望 为更好的运用这两天学到的Ajax的相关的知识,就做了个简单的在线网络聊天室. 思路 实现聊天室,基本上就是通过Ajax来传递数据,让PHP来实现对数据的差入和查找,再交给前端JavaScript实现页面的更新,达到即时聊天的功能. 消息显示区 消息显示区就是一个DIV块,我们会借助Ajax获取到服务器端信息

python socket 聊天室

import socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #绑定端口 s.bind(("127.0.0.1", 8888)) while True: data = s.recvfrom(1024) print(str(data[0].decode("gbk"))) send_data = input("请输入聊天内容") if "exit" in se

Python Socket 简单聊天室2

上篇文章写了一个简单的单线程的一问一答的简单聊天室.这次我们使用SocketServer模块搭建一个多线程异步的聊天室. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # -*- coding:utf-8 -*- import SocketServer class  mysocketclass(SocketServer.BaseRequestHandler):     def handle(self):         client_inform

玩转Node.js(四)-搭建简单的聊天室

玩转Node.js(四)-搭建简单的聊天室 Nodejs好久没有跟进了,最近想用它搞一个聊天室,然后便偶遇了socket.io这个东东,说是可以用它来简单的实现实时双向的基于事件的通讯机制.我便看了一些个教程使用它来搭建一个超级简单的聊天室. 初始化项目 在电脑里新建一个文件夹,叫做“chatroom”,然后使用npm进行初始化: $ npm init 然后根据提示以及相关信息一步一步输入,当然也可以一路回车下去,之后会在项目里生成一个package.json文件,里面的信息如下: 1 $ ca