这几天一直在做通信这方面的东西,刚开始的时候真的觉得不能很好的理解,但是同时也觉得
真的很神奇。现在就讲解一下我再这方面学到的东西,以及在学习的过程中所遇到的问题。
话不多说,先传上我的成果。
可能你刚开始的时候也会觉得这里有的东西是无法理解的。让我一步一步解释。
首先这是一个通信的问题,我记得有个人说过计算机因为有了通信而变得很不一样了,当时刚
听这句话是,没有明白到底是神马意思,学过通信过后才深刻的领悟了这句话。话不多说,开
启我们的通信之旅。
首先通信是有服务器和客户端构成的,也就是我们必须要通过服务器来实现链接,在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");
我们必须有一个读取结束的标志,在标志前的数据我们要保存。
这样我们就对通信有了一定的了解,后面就得靠自己来实际动手来做,我报上面的项目的代码放在附件中,如有问题,请给我留言。
相关推荐
在群聊系统中,Java用于编写客户端和服务器端的程序逻辑,实现用户交互和消息传递。 2. **Socket编程**:Socket是网络通信的基础,它为两台计算机之间的通信提供了一种标准接口。在群聊系统中,服务器通过监听...
根据提供的文件信息,我们可以总结出以下关于如何使用Java实现群聊功能的知识点: ### Java实现群聊系统的关键组件 #### 服务器端(`ChatServer`类) 1. **初始化ServerSocket**: - 使用`ServerSocket`监听指定...
【标题】基于Java GUI界面的简易Netty聊天室实现了群聊和私聊功能,通过集成FastJSON库处理JSON格式的数据编码与解码。这个项目旨在为用户提供一个简单易用的聊天平台,用户可以通过图形化界面进行实时通信。下面将...
要实现这个Java群聊程序,我们需要以下几个核心组件: 1. **多播套接字**:Java中的`java.net.MulticastSocket`类是处理多播数据包的关键。我们需要创建一个MulticastSocket实例,并将其加入到特定的多播组。多播组...
总结来说,通过`ChatServer.java`和`ChatClient.java`这两个文件,我们可以实现一个基础的Java群聊系统。这个系统利用Java的网络编程能力,让多个客户端能够通过服务器进行实时的信息交换。在实际开发中,我们还需要...
基本实现类似QQ的群聊 有界面,用SERVERSOCKET来实现群聊私聊
首先,Java Socket编程是实现客户端和服务器之间通信的基础。Socket是TCP/IP协议族的一部分,它为两台机器间的应用程序提供了一种建立和维护连接的方法,以及交换数据的机制。在群聊系统中,服务器端创建一个Socket...
利用Java实现的一个简单的群聊程序,模仿群聊,通过本地通讯,实现了简单的群聊功能,目的是为了熟悉Java的Socket、线程、输入/输出流、Swing以及利用javadoc生成HTML文档。练习时候写的,所以功能和界面都比较简单...
【标题】"一键登录,实现群聊、私聊功能的java聊天室"涉及的主要知识点包括Java编程语言、网络通信机制BIO(Blocking I/O)、图形用户界面GUI以及多线程编程。下面将对这些关键点进行详细介绍。 1. **Java编程语言*...
在Java编程领域,实现一个基于网络的群聊室是一项基础且重要的练习,它涉及到网络编程、多线程和并发处理等多个关键知识点。本项目“Java版群聊室”旨在为初学者提供一个学习和实践这些概念的平台。下面将详细阐述...
我是一名Java开发工程师,项目用到了客服聊天,查了很多文档,websocket实现了双向通道协议,可以实现服务器的推送,实现单聊和群聊的功能,下载文档也是写的不全,有的还是没用的项目,我就自己看视频,查询文档,...
使用java swing,socket,多线程实现。 1) 客户端用来接收和展示数据,服务器实现与底层数据的交互。 2) 实现服务器端与客户端的分离,如果要操作数据库,可以在服务器端改代码调用Model。 3) 实现用户上线/下线...
在本文中,我们将深入探讨如何使用Java后台和Socket方法来实现Android群聊功能。这个解决方案涵盖了Android客户端的开发,以及Java后台服务器的构建。我们将会分析每个部分的关键知识点,并提供必要的代码片段以帮助...
本项目“Java实现的聊天室”展示了如何使用Java的网络编程API来构建一个具备群聊和私聊功能的实时通讯平台。以下是对该项目核心知识点的详细阐述: 1. **Java Socket编程**: Java的`ServerSocket`类用于创建...
在Java中实现QQ功能,首先需要熟悉Java的基础语法、类和对象的概念、异常处理以及多线程。 2. **图形用户界面(GUI)**:Java中的Swing或JavaFX库用于构建QQ的用户界面,包括登录窗口、主面板、聊天窗口等。开发者...
在这个项目中,"javaWeb(四个范围)实现聊天室功能(群聊+私聊)"主要是利用了JavaWeb的四个作用域——Page、Request、Session和Application,来实现用户之间的即时通信。下面将详细解释这些知识点。 1. **Servlet...
这可能涉及到状态机的设计和实现。 总的来说,这个Java聊天室项目涵盖了从用户界面设计到网络通信的多个核心Java编程概念,是学习和实践Java全栈开发的一个很好的实例。通过这个项目,开发者不仅可以提升Java编程...
是不是试了很多次都没有达到自己想要的效果呢? 没关系,看到这你就已经有收获了 文章目录一、动图效果展示二、服务端代码(核心)三、bug吐槽四、分享交流 一、动图效果展示 ...import java.util.conc
JavaQQ 是一个基于Java编程语言实现的即时通讯软件,它具备了私聊、群聊、截图和文件传输等核心功能,旨在提供与QQ类似的用户体验。这个项目不仅展示了Java在开发复杂应用程序上的能力,还体现了面向对象设计原则和...