`

通信多人聊天基础

    博客分类:
  • JAVA
 
阅读更多

                                                         多个客户端实现多人聊天

           前面已经讲过一个客户端与一个服务器相连的情况,然而发现再加入一个客户端的时候,程序不能如期

运行,这是因为当你创建的只是一个客户端,另一个客户端是不能连入,简而言之就是服务器只把门牌号给了一个上访者,这时就要不断创建客户端,如下:

while(true){
     //等待客户端访问
     Socket socket=host.accept();
     System.out.println("有人访问了");
     //把跟客户端交流的事情交给线程处理
     ServerThread st = new ServerThread(socket);
     //开启线程     st.start();

    }

同一时间处理多个实物,就必须要用到线程了

这时创建一个ServerThread来继承线程类处理发送来的客户端对象

为了一会得到各个客户端对象,我们在线程里面建立对象来存储

private static ArrayList<ServerThread> list=new ArrayList<ServerThread>();
 private OutputStream output;
 private Socket socket;
 private String name;

一下是完整代码:

public class Server {
	
	public void setup(int port){
		
			try {
				//创建服务器
				ServerSocket host=new ServerSocket(port);
				System.out.println("通信端口"+port+"成功开启");
				while(true){
					//等待客户端访问
					Socket socket=host.accept();
					System.out.println("有人访问了");
					//把跟客户端交流的事情交给线程处理
					ServerThread st = new ServerThread(socket);
					//开启线程					st.start();

				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		
	}
	public static void main(String[] args){
		new Server().setup(8888);
	}

}

 

这是服务器类,具体过程参见博客通信初步

下面是线程处理类:

public class ServerThread extends Thread{
	private static ArrayList<ServerThread> list=new ArrayList<ServerThread>();
	private OutputStream output;
	private Socket socket;
	private String name;
	public ServerThread(Socket socket){
		this.socket=socket;
		list.add(this);
	}
	//发送给客户端的信息
	public void sendMessage(String msg){
		try {
			output.write(msg.getBytes("GBK"));
		
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public void run(){
		try {
			InputStream input=socket.getInputStream();
			output=socket.getOutputStream();
			String str="请输入你的昵称:";
			sendMessage(str);
			//用户名为第一次输入的名字及括号内包括其服务器地址与客户端地址
			name=readLine(input)+"("+socket.getInetAddress().getHostAddress()+")";
			while(true){
				String chat=readLine(input);
				if(chat.equals("再见")){
					System.out.println(name+"下线了");
					break;
				}
				System.out.println(name+"说:"+chat);
				//群发消息的功能
				for(int i=0;i<list.size();i++){
					ServerThread st=list.get(i);
					//if(this==st)
						//continue;
					//将显示咋服务器上的文字转发到其他客户端上,实现群聊的功能
					String chaton=name+"说:"+chat+"\r\n";
					st.sendMessage(chaton);
					
				}
			}
            //下线break到这里,关闭客户端端口,断开连接,同时移除客户端对象
			socket.close();
			list.remove(this);

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	public String readLine(InputStream input) throws IOException{
		ByteArrayOutputStream baos=new ByteArrayOutputStream();
		while(true){
			int n=input.read();
			if(n=='\r'){
				continue;
			}
			if(n=='\n'){
				break;
			}
			baos.write(n);
		}
		byte[] bytes=baos.toByteArray();
		String chat=new String(bytes,"GBK");
		return chat;
		
		
	}

}

 

实现的效果如下图,已经可以处理多人通信了:



 再多加几个人聊天效果一样,接下啦,就可以做个较为漂亮的聊天软件了,例如QQ,一起动手吧

 

 

  • 大小: 24.1 KB
2
1
分享到:
评论
1 楼 rainsilence 2014-10-20  
1.用ByteArrayOutputStream 的意义何在,而且用了也没有close
2.没有心跳测试
3.bio多线程的模型虽然简单,但是服务器负担很大
4.所有的close都没有放入finally里,万一try块中报错,stream全都不会关闭,从而造成内存泄露
5.static ArrayList如果不考虑负载均衡,只在局域网内用,那还可以

相关推荐

    java实现socket编程网络通信多人聊天室

    在多人聊天室的场景下,Socket编程扮演着至关重要的角色,它使得用户可以通过网络实时地发送和接收消息。下面我们将深入探讨这个主题。 首先,Java中的Socket类是客户端与服务器端进行通信的接口,它基于TCP(传输...

    socket 实现多人聊天

    总的来说,实现“socket多人聊天”涉及到的知识点包括TCP/IP协议基础、Socket编程、线程处理、数据传输以及错误处理等。通过理解和掌握这些技术,我们可以构建出一个高效、可靠的多人聊天系统。在提供的压缩包文件中...

    多人聊天程序 多人聊天程序 多人聊天程序 多人聊天程序

    首先,Java语言的网络编程是构建多人聊天程序的基础。Java提供了Socket类,它是网络通信的基本单元,允许客户端和服务器之间建立TCP/IP连接。Socket类提供了输入输出流接口,使得数据能够在客户端和服务器之间双向...

    java多人聊天功能

    在Java编程领域,实现多人聊天功能是一项常见的任务,尤其在构建网络应用程序时。在这个场景中,我们有两个核心的Java类,即`QQServer.java`和`QQClient.java`,分别代表服务器端和客户端。这两个类构成了一个简单的...

    大学生计算机网络课程期末作业java聊天系统(多人聊天室)原创

    3. **多线程**:为了实现多人聊天,需要处理多个并发连接,多线程技术是必不可少的,可能包括Thread类、Runnable接口的使用,以及线程同步和通信机制。 4. **用户界面**:可能使用Swing或JavaFX库创建图形用户界面,...

    java的Socket实现的多人聊天程序

    Java的Socket实现的多人聊天程序是一个基于网络通信的项目,主要利用了Java的Socket类来构建客户端和服务端的通信桥梁。Socket是TCP/IP协议的一部分,它提供了两台计算机之间进行数据传输的基础。在这个项目中,...

    C#Socket网络通信实现多人聊天

    在IT领域,网络通信是构建...通过以上介绍,我们可以看到,使用C# Socket实现多人聊天应用程序涉及到了网络编程基础、并发处理、数据收发等多个方面。理解并掌握这些知识点,将有助于开发更复杂、更健壮的网络应用。

    多人聊天室源码.rar

    【标题】:“多人聊天室源码.rar”是一个包含Java编程语言实现的多人在线聊天室的源代码压缩包。这个项目可能是一个实时通信系统的实例,旨在教授如何构建一个基本的网络聊天平台,允许用户进行实时交流。 【描述】...

    C#实现多人聊天

    本项目“C#实现多人聊天”是利用C#语言构建的一个基础的网络通信应用,它允许多个用户通过TCP协议进行实时的文本聊天。下面我们将详细探讨这个项目的相关知识点。 1. **C#语言基础**: C#是一种面向对象的编程语言...

    Python实现的多人聊天室源码,基于socket tcp通信,使用tkinter做客户端界面,含可执行文件

    在本项目中,我们探讨的是一个使用Python编程语言实现的多人聊天室,它基于socket TCP通信协议,并且利用Tkinter库构建了用户友好的客户端界面。这个聊天室系统允许多个用户同时在线交流,增强了实时互动性。以下是...

    多人聊天 socket编程实现

    在IT行业中,Socket编程是一种基础且...总之,实现多人聊天系统需要扎实的Socket编程基础,理解TCP协议的工作原理,并能熟练运用VS2008进行编程。通过不断练习和调试,你可以构建出稳定且功能丰富的多人聊天应用程序。

    《Java程序设计实训》报告 多人聊天室

    《Java程序设计实训》报告的主题是构建一个多人聊天室,旨在通过这个项目加深对Java语言的理解,特别是Java的多线程、GUI编程以及Socket网络编程技术。以下是对这些知识点的详细说明: 1. **Java语言**:Java是一种...

    Java 多人聊天室

    【Java 多人聊天室】是一个使用Java网络编程技术实现的项目,主要涉及了Socket通信、多线程以及UDP协议的应用。在这个项目中,我们将会深入理解如何构建一个支持多人实时交流的聊天环境。 首先,Java网络编程是实现...

    北京科技大学自动化学院小学期多人聊天室linux嵌入式系统课程设计.zip

    多人聊天室的核心功能是实现多用户之间的实时通信。为了达成这一目标,学生必须首先熟悉网络编程的基础,如IP地址分配、端口监听、数据封包和解包等概念。在此基础上,学生还需要为聊天室设计一套可靠的通信协议,...

    多人聊天小程序

    总的来说,这个多人聊天小程序的实现涉及到了C++语言基础、网络编程、多线程技术、数据库操作以及图形用户界面设计等多个方面,是学习和实践计算机科学基础技能的好例子。通过对这个项目的理解和实践,开发者可以...

    基于socket的简易多人聊天室

    【标题】: "基于socket的简易多人聊天室" 在计算机网络编程中,Socket是一种通信协议,它允许两台或多台计算机通过互联网进行双向通信。基于Socket的简易多人聊天室是利用这一技术实现的一个多用户交互的平台。在这...

    MFC 多人聊天程序

    《MFC实现多人聊天程序详解》 在信息技术领域,实时通信是不可或缺的一部分,尤其是在网络聊天应用中。MFC(Microsoft Foundation Classes)是微软提供的一种C++库,用于构建Windows应用程序,它极大地简化了...

    java多人聊天系统

    总的来说,这个Java多人聊天系统提供了一个基础的网络通信框架,让多个用户可以通过网络进行实时交流。开发者可能使用了Java的标准库,如Socket和I/O流,以及一些简单的控制台用户界面来实现这一功能。对于学习网络...

Global site tag (gtag.js) - Google Analytics