`
java2liwei
  • 浏览: 14366 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

关于java实现群聊和同步画图小结。

    博客分类:
  • java
 
阅读更多

       这几天一直在做通信这方面的东西,刚开始的时候真的觉得不能很好的理解,但是同时也觉得

真的很神奇。现在就讲解一下我再这方面学到的东西,以及在学习的过程中所遇到的问题。
话不多说,先传上我的成果。

 

      可能你刚开始的时候也会觉得这里有的东西是无法理解的。让我一步一步解释。
首先这是一个通信的问题,我记得有个人说过计算机因为有了通信而变得很不一样了,当时刚

听这句话是,没有明白到底是神马意思,学过通信过后才深刻的领悟了这句话。话不多说,开

启我们的通信之旅。

        首先通信是有服务器和客户端构成的,也就是我们必须要通过服务器来实现链接,在java中有

这样的一个类 ServerSocket ;我们可以通过这个类创建一个服务器对象代码如下:

 

ServerSocket serverSocket = new ServerSocket(9090);

      9090是我们创建的服务器的端口号,这个端口号是有1-60000多的数字,我们要竟可能挑选大

一点的数字,因为小的数字可能已经被系统占用,这样我们创建了一个服务器了,那么怎么与

客户端链接呢,看下面代码:

Socket socket = serverSocket.accept()

          这句代码的意思是我们的服务器在等待客户端

来连接,如果没有链接那么整个程序就一直阻塞在这里,换句话说我们必须有客户端链接程序

才能继续运行,试想如果没有客户端链接,服务器还用运行吗,当我们获得socke对象后我们

就必须要获取服务器的输入输出流;看下面代码:

 

InputStream ins = socket.getInputStream();
OutputStream out = socket.getOutputStream();

       那么我们为什么要获取输入流输出流呢?这是因为我们整个通信就是读写数据,我们要获取从

客户端输入的数据然后再进写给其他的客户端,同时我们客户端也要实现一些公告什么的功能

,我可以说整个服务器就是上面的四行代码。服务器就先到这了,我们接下来要说一下客户端

,同样客户端也是几行代码.首先我们要创建一个客户端,这个客户端要链接上服务器,看下

面的代码:

Socket socket = new Socket("localhost",9090);

 这行代码是创建一个客户端,构造方法的第一个参数是服务器的ip地址,第二个参数是服务器

的端口号,这样就创建了一个客户端了 同样我们也要获取客户端的输入输出流;代码如下:

	InputStream ins = socket.getInputStream();
	OutputStream out = socket.getOutputStream();

 

这样我们应该大体上对客户端和服务器有了一定的了解了,让我举个形象化的列子吧。两桶水
在这两桶水中间有跟管道,当客户端与服务器连接上了,就打开管道阀门了,这时就可以传递

了,服务器那边写客户端就读,客户端写服务器就读。就此我也讲一下群聊的实现吧,就是我

客户端写给服务器读,当服务器读到了就发给每个链接上的客户端,这样就实现了群聊的功能

,你是不是也觉得挺简单的。
接下来我们通过一个群聊和同步画图实例来讲解。
先看上图:



 
接下来让我们来好好分析一下这个小项目,同时也将一下我在这个项目中遇到的问题。
首先看一下我们的项目的UML分析图:

先看我们的服务器的:



 在看我们的客户端的:



 现在我们再来说一下这个到底是怎么实现的,首先我们的服务器是创建成功了,但是我们在上面已经说过了

Socket socket = serverSocket.accept()

 服务器是一直在等待客户端来连接,那么整个程序就不再向下运行了,这时候我们考虑到使用线程,这样我们就能很好的解决这个问题,因为线程是并发同时运行的。当我们解决好这个问题后,我们要考虑服务器的读取数据,在这个问题中跟客户端是一样的,因为我们客户端和服务器是一直在读取数据,那么也就是说

我们用一个死循环来调用读取的方法,代码如下:

	public void process(){
		
		try {
			ins = this.socket.getInputStream();
			out = this.socket.getOutputStream();
			dins =  new DataInputStream(ins);
			dout = new DataOutputStream(out);
			while (true) {
				byte b = dins.readByte();
				if(b==1){
					int x1 = dins.readInt();
					int y1 = dins.readInt();
					int x2= dins.readInt();
					int y2 = dins.readInt();
					transDate( b, x1, y1, x2, y2);
					g.drawLine(x1, y1, x2, y2);
				}else if(b==2){
					int x1 = dins.readInt();
					int y1 = dins.readInt();
					int x2= dins.readInt();
					int y2 = dins.readInt();
					transDate( b, x1, y1, x2, y2);
					g.drawOval(x1, y1, x2-x1, y2-y1);
				}else if(b==3){
					sendMsg();
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	//创建一个传输数据的方法
	public void transDate(byte b,int x1,int y1,int x2,int y2){
		
		int t = SeverThreadList.SeverList.size();
		for(int i=0;i<t;i++){
			try {
				SeverThreadList.SeverList.get(i).dout.writeByte(b);
				SeverThreadList.SeverList.get(i).dout.writeInt(x1);
				SeverThreadList.SeverList.get(i).dout.writeInt(y1);
				SeverThreadList.SeverList.get(i).dout.writeInt(x2);
				SeverThreadList.SeverList.get(i).dout.writeInt(y2);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

 上面我们用一个while的死循环,但是这时问题又来了,整个程序又卡在这里了,解决方法如上,也是放在一个线程里,这样就可以了;同样客户端也是这样处理的,就是我们将一个客户端的读取数据也放在线程里。

,接下来我们来说一下群聊的实现:

 

Socket socket = serverSocket.accept()

 这是我们获取的socket,我要解释一下,这可socket是不一样的,也就是处理每个客户端的socket是不一样的,那么我们可以将它放入链表中,这样当服务器接受到客户端发来的信息,我们在遍历这个链表将信息发出去,这样我们就实现了群聊了,看下面代码:

 

public void createServer(){
		try {
			ServerSocket serverSocket = new ServerSocket(9090);
			System.out.println("服务器创建成功");
			while (true) {
				Socket socket = serverSocket.accept();
				System.out.println("有客户端连接了");
				IoThread ioThread = new IoThread(socket,this.g,area);
				SeverThreadList.SeverList.add(ioThread);
				ioThread.start();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

//创建一个传输数据的方法
	public void transDate(byte b,int x1,int y1,int x2,int y2){
		
		int t = SeverThreadList.SeverList.size();
		for(int i=0;i<t;i++){
			try {
				SeverThreadList.SeverList.get(i).dout.writeByte(b);
				SeverThreadList.SeverList.get(i).dout.writeInt(x1);
				SeverThreadList.SeverList.get(i).dout.writeInt(y1);
				SeverThreadList.SeverList.get(i).dout.writeInt(x2);
				SeverThreadList.SeverList.get(i).dout.writeInt(y2);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

 这样我们就实现了群聊的功能了,接下来我再说一下我在写通信是所遇到的问题,有的注意点已经在上面讲过了,就不再赘述了。在实现通信时,要先注意你的通信协议,这个是通信的灵魂,比如我上面的项目就是我换线的时候我先写一个byte为1然后在写数据,我花圆的时候先写一个byte为2然后在写数据,这样当我接收到数据时就先读取这个byte数据,如果为1那么我就读取画线的数据,如果为2那么我就读取画圆的数据,

第2 要注意读取数据的细节之处,看下面的代码:

 

                                     c = (char)dins.read();
			while(c!='#'){
				message +=c;
				c = (char)dins.read();
			}
			message = new String(message.getBytes("ISO-8859-1"),"GB2312");

 我们必须有一个读取结束的标志,在标志前的数据我们要保存。

这样我们就对通信有了一定的了解,后面就得靠自己来实际动手来做,我报上面的项目的代码放在附件中,如有问题,请给我留言。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 34.6 KB
  • 大小: 48.9 KB
  • 大小: 64.8 KB
分享到:
评论

相关推荐

    java做的简单群聊

    在群聊系统中,Java用于编写客户端和服务器端的程序逻辑,实现用户交互和消息传递。 2. **Socket编程**:Socket是网络通信的基础,它为两台计算机之间的通信提供了一种标准接口。在群聊系统中,服务器通过监听...

    java实现群聊功能

    根据提供的文件信息,我们可以总结出以下关于如何使用Java实现群聊功能的知识点: ### Java实现群聊系统的关键组件 #### 服务器端(`ChatServer`类) 1. **初始化ServerSocket**: - 使用`ServerSocket`监听指定...

    基于java GUI界面的简易netty聊天室(实现群聊和私聊)

    【标题】基于Java GUI界面的简易Netty聊天室实现了群聊和私聊功能,通过集成FastJSON库处理JSON格式的数据编码与解码。这个项目旨在为用户提供一个简单易用的聊天平台,用户可以通过图形化界面进行实时通信。下面将...

    JAVA实现局域网群聊(开源)

    要实现这个Java群聊程序,我们需要以下几个核心组件: 1. **多播套接字**:Java中的`java.net.MulticastSocket`类是处理多播数据包的关键。我们需要创建一个MulticastSocket实例,并将其加入到特定的多播组。多播组...

    简单实现群聊 java小程序

    总结来说,通过`ChatServer.java`和`ChatClient.java`这两个文件,我们可以实现一个基础的Java群聊系统。这个系统利用Java的网络编程能力,让多个客户端能够通过服务器进行实时的信息交换。在实际开发中,我们还需要...

    用java代码 实现群聊

    基本实现类似QQ的群聊 有界面,用SERVERSOCKET来实现群聊私聊

    基于Java的群聊系统

    首先,Java Socket编程是实现客户端和服务器之间通信的基础。Socket是TCP/IP协议族的一部分,它为两台机器间的应用程序提供了一种建立和维护连接的方法,以及交换数据的机制。在群聊系统中,服务器端创建一个Socket...

    Java实现简单的QQ群聊系统

    利用Java实现的一个简单的群聊程序,模仿群聊,通过本地通讯,实现了简单的群聊功能,目的是为了熟悉Java的Socket、线程、输入/输出流、Swing以及利用javadoc生成HTML文档。练习时候写的,所以功能和界面都比较简单...

    一键登录,实现群聊、私聊功能的java聊天室

    【标题】"一键登录,实现群聊、私聊功能的java聊天室"涉及的主要知识点包括Java编程语言、网络通信机制BIO(Blocking I/O)、图形用户界面GUI以及多线程编程。下面将对这些关键点进行详细介绍。 1. **Java编程语言*...

    java版群聊室

    在Java编程领域,实现一个基于网络的群聊室是一项基础且重要的练习,它涉及到网络编程、多线程和并发处理等多个关键知识点。本项目“Java版群聊室”旨在为初学者提供一个学习和实践这些概念的平台。下面将详细阐述...

    Java开发的及时通讯使用websocket 实现了qq群聊 和单聊

    我是一名Java开发工程师,项目用到了客服聊天,查了很多文档,websocket实现了双向通道协议,可以实现服务器的推送,实现单聊和群聊的功能,下载文档也是写的不全,有的还是没用的项目,我就自己看视频,查询文档,...

    java swing实现群聊功能

    使用java swing,socket,多线程实现。 1) 客户端用来接收和展示数据,服务器实现与底层数据的交互。 2) 实现服务器端与客户端的分离,如果要操作数据库,可以在服务器端改代码调用Model。 3) 实现用户上线/下线...

    使用Java后台,Socket方法实现android群聊(android服务端+java后台)

    在本文中,我们将深入探讨如何使用Java后台和Socket方法来实现Android群聊功能。这个解决方案涵盖了Android客户端的开发,以及Java后台服务器的构建。我们将会分析每个部分的关键知识点,并提供必要的代码片段以帮助...

    Java实现的聊天室,具有群聊和私聊功能

    本项目“Java实现的聊天室”展示了如何使用Java的网络编程API来构建一个具备群聊和私聊功能的实时通讯平台。以下是对该项目核心知识点的详细阐述: 1. **Java Socket编程**: Java的`ServerSocket`类用于创建...

    Java-QQ.zip_QQ java_java qq_java 私聊 群聊_java 群聊_java仿QQ

    在Java中实现QQ功能,首先需要熟悉Java的基础语法、类和对象的概念、异常处理以及多线程。 2. **图形用户界面(GUI)**:Java中的Swing或JavaFX库用于构建QQ的用户界面,包括登录窗口、主面板、聊天窗口等。开发者...

    javaWeb(四个范围)实现聊天室功能(群聊+私聊)

    在这个项目中,"javaWeb(四个范围)实现聊天室功能(群聊+私聊)"主要是利用了JavaWeb的四个作用域——Page、Request、Session和Application,来实现用户之间的即时通信。下面将详细解释这些知识点。 1. **Servlet...

    Java聊天室(界面完整,群聊,私聊,用户列表)

    这可能涉及到状态机的设计和实现。 总的来说,这个Java聊天室项目涵盖了从用户界面设计到网络通信的多个核心Java编程概念,是学习和实践Java全栈开发的一个很好的实例。通过这个项目,开发者不仅可以提升Java编程...

    Java聊天室—-多线程实现群聊、私聊、系统消息 (服务端完整代码奉上)

    是不是试了很多次都没有达到自己想要的效果呢? 没关系,看到这你就已经有收获了 文章目录一、动图效果展示二、服务端代码(核心)三、bug吐槽四、分享交流 一、动图效果展示 ...import java.util.conc

    javaqq(私聊+群聊+截图+文件传送)

    JavaQQ 是一个基于Java编程语言实现的即时通讯软件,它具备了私聊、群聊、截图和文件传输等核心功能,旨在提供与QQ类似的用户体验。这个项目不仅展示了Java在开发复杂应用程序上的能力,还体现了面向对象设计原则和...

Global site tag (gtag.js) - Google Analytics