package cgh20130727分部实现多人通信; import java.io.IOException; import javax.swing.JTextArea; /** * 定义一个TestServer的类创建一个服务器 * @author Allen * */ public class TestServer extends Thread { private int port; private JTextArea jta; //构造方法进行参数的传递 public TestServer(int port,JTextArea jta){ this.port = port; this.jta = jta; } //空参数构造方法 public TestServer() { } //重写run方法 public void run(){ server(port); } //定义一个创建一个服务器的方法 public void server(int port){ try { //创建服务器 java.net.ServerSocket server = new java.net.ServerSocket(port); System.out.println("你的服务器创建成功了!!!\r\n"+"端口号: "+port); while(true){ //阻塞等待客户端的连接 java.net.Socket soclicent = server.accept(); //创建一个多线程对象 ServerThread sth = new ServerThread(soclicent,jta); sth.start();//线程开始运行 chatList.add(sth); } } catch (IOException e) { e.printStackTrace(); } } }
创建一个服务器代码就那么三行,比较固定看看书也就搞定了.但在程序运行的时候遇到了一个bug,就是在已有的界面上(服务器界面)显示的时候点击"端口"按钮创建服务器对象的时候一直处于运行状态,最后知道了原来是没有添加线程的原因.
package cgh20130727分部实现多人通信; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import javax.swing.JTextArea; import cgh20130728多人聊天客户端.customListe; /** * 定义一个客户端对象继承自多线程 * @author Allen * */ public class ServerThread extends Thread { private java.net.Socket soclicent;//定义一个客户端的属性 private java.io.InputStream ins; private java.io.OutputStream ous; private String ip; private int port; private JTextArea jta; //构造方法进行参数的传递 public ServerThread(java.net.Socket soclicent,JTextArea jta){ this.soclicent = soclicent; this.jta = jta; } public ServerThread(String ip,int port,JTextArea jta){ this.ip = ip; this.port = port; this.jta = jta; } //重写线程run的方法 public void run(){ work(this.soclicent); } //定义从客户端连接到服务器的方法 public void work(java.net.Socket soclicent){ try { //客户端接收输入输出流 ins = soclicent.getInputStream(); ous = soclicent.getOutputStream(); //验证是否连接成功 String str = "hello,welcome to Lanjie!!!"+"\r\n"; byte [] bytes = str.getBytes(); ous.write(bytes); ous.flush(); //将字符串读到服务器 String strRead = readString(ins); //判断当读到exit时停止 while(!strRead.equals("exit")){ System.out.println("服务器接收到的内容是++++\r\n"+strRead); String sing = "客户端保存的内容是----\r\n"+strRead; byte [] by = sing.getBytes(); // ous.write(by); // ous.flush();//强制刷新 chatList.sendMsg(by);//客户端接收到的消息 jta.setText(strRead);//将客户端接收到的消息显示在文本框中 strRead = readString(ins);//下一次得到的字符串 } }catch (IOException e) { e.printStackTrace(); } } //定义一个读入字符串的方法 public String readString(java.io.InputStream ins){ //创建一个字符串缓冲器对象 StringBuffer strb = new StringBuffer(); int reads = 0; //判断当读到回车是停止字符的存入 while(reads != 35){ try { reads = ins.read();//将字符读入到服务器 strb.append((char)reads);//将读到的字符放入字符串缓冲区 } catch (IOException e) { e.printStackTrace(); } } String sting = strb.toString().trim();//将缓冲区的字符整合成字符串 return sting; } //定义一个服务器发送消息的方法 public void writeMsg(byte [] by){ try { System.out.println("writeMsg执行了"); ous.write(by); ous.flush(); } catch (IOException e) { e.printStackTrace(); } } }
写该类的时候遇到的一个是:当在程序运行的时候,不管是服务器的界面文本框还是客户端的文本框一直没有显示,纠结了半天最后终于找到原来是没有写该条指令jta.setText(strRead);
package cgh20130727分部实现多人通信; import java.util.ArrayList; import java.util.List; /** * 定义一个chatList的队列类用来存储客户端对象 * @author Allen * */ public class chatList { //定义一个私有的构造方法 private chatList(){ } //调用系统提供的数组队列 public static List<ServerThread> list = new ArrayList<ServerThread>(); //定义一个数组队列的添加方法 public static void add(ServerThread sth){ list.add(sth); } //定义一个发送消息的方法 public static void sendMsg(byte [] by){ System.out.println("sendMsg执行了"); //循环遍历数组队列 for(int i=0;i<list.size();i++){ ServerThread st = list.get(i); st.writeMsg(by); } } }
该类主要是实现将ServerThread保存数组队列中,然后调用sendMsg(by);方法实现客户端与客户端之间,客户端与服务器之间互相发送消息.
package cgh20130727分部实现多人通信; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JTextArea; import javax.swing.JTextField; /** * 创建一个服务器界面类 * @author Allen * */ public class ServerUI extends JFrame{ private JTextArea jta; private TestServer tse; private int nport; /** * 定义一个程序的入口主函数 * @param args */ public static void main(String[] args) { //创建一个对象并调用窗体初始化的方法 ServerUI sui = new ServerUI(); sui.INtUI(); } //定义一个窗体初始化的方法 public void INtUI() { this.setTitle("服务器"); this.setSize(400,300); this.setLocationRelativeTo(null); this.setResizable(false); //设置窗体的流式布局 this.setLayout(new FlowLayout()); //创建按钮对象 JButton jbu = new JButton("端口"); JButton jbu1 = new JButton("发送"); //创建文本框对象 final JTextField jte = new JTextField(25); final JTextField jte1 = new JTextField(25); //创建一个纯文本多行区域 jta = new JTextArea(); jta.setPreferredSize(new Dimension(350,180)); //添加到窗体 this.add(jbu); this.add(jte); this.add(jbu1); this.add(jte1); this.add(jta); //创建监听器 ActionListener action = new ActionListener(){ //调用事件监听器的方法 public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("端口")){ nport = Integer.parseInt(jte.getText()); tse = new TestServer(nport,jta);//创建客户端对象 tse.start();//调用连接服务器的方法 System.out.println("------>"+nport); } if(e.getActionCommand().equals("发送")){ //从文本框得到消息 String info = jte1.getText(); //服务器将消息发送给每个客户端 chatList.sendMsg(info.getBytes()); //服务器的文本区域得到文本 jta.append("fuwuqi : \r\n"+info); //发送完毕后清空文本框 jte1.setText(""); System.out.println("服务器发送消息给客户端成功"+info); } } }; jbu.addActionListener(action); jbu1.addActionListener(action);//按钮添加监听器 //设置窗体可见性 this.setVisible(true); } }
该类主要是写一个服务器的界面并实现创建服务器,群发消息的方法
package cgh20130727分部实现多人通信1; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JTextArea; import javax.swing.JTextField; import cgh20130727分部实现多人通信.ServerThread; import cgh20130727分部实现多人通信.chatList; /** * 创建一个客户端的界面继承自JFrame * @author Allen * */ public class KehuduanUI extends JFrame { private JTextArea jta; private KehuWay khw; /** * 程序的入口主函数 * @param args */ public static void main(String[] args) { //实例化一个对象并调用窗体初始化的方法 KehuduanUI khd= new KehuduanUI(); khd.INtUI(); } //初始化一个界面的方法 public void INtUI() { this.setTitle("客户端"); this.setSize(400,300); this.setLocationRelativeTo(null); this.setResizable(false); //设置窗体的流式布局 this.setLayout(new FlowLayout()); //创建按钮对象 JButton jbu = new JButton("连接"); JButton jbu1 = new JButton("群聊"); //创建文本框对象 JTextField jte = new JTextField(25); final JTextField jte1 = new JTextField(25); //创建一个纯文本多行区域 jta = new JTextArea(); jta.setPreferredSize(new Dimension(350,180)); //添加到窗体 this.add(jbu); this.add(jte); this.add(jbu1); this.add(jte1); this.add(jta); //创建监听器 ActionListener action = new ActionListener(){ //调用监听器的方法 public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("连接")){ khw = new KehuWay("localhost",9007,jta);//创建一个客户端对象 //判断客户端是否创建成功 if(khw.connectServer()){ khw.start(); } } if(e.getActionCommand().equals("群聊")){ String stri = jte1.getText(); jta.append("kehuduan : \r\n"+stri+"\r\n"); khw.sendInfo(stri); jte1.setText("");//发完后清空文本框 } } }; //添加监听器 jbu.addActionListener(action); jbu1.addActionListener(action); //显示窗体的可见性 this.setVisible(true); } }
有了客户端界面就需要有一个服务器的界面.
package cgh20130727分部实现多人通信1; import java.io.BufferedReader; import java.io.IOException; import javax.swing.JTextArea; import cgh20130727分部实现多人通信.chatList; /** * 定义客户端方法的类继承自多线程 * @author Allen * */ public class KehuWay extends Thread { private String ip; private int port; private java.io.OutputStream ous; private java.io.InputStream ins; private BufferedReader bufr; private JTextArea jta; private String sting; private String string = null; //构造方法进行参数的传递 public KehuWay(String ip,int port,JTextArea jta){ this.ip = ip; this.port = port; this.jta = jta; } //判断客户端是否与服务器连接成功 public boolean connectServer(){ try { //创建连接服务器的对象 java.net.Socket client = new java.net.Socket(ip,port); System.out.println("客户端与服务器连接成功了!!!"); //获取输入输出流 ins = client.getInputStream(); ous = client.getOutputStream(); System.out.println("----++++"); return true; } catch (IOException e) { e.printStackTrace(); } return false; } //客户端发送消息 public void sendInfo(String info){ try { //info+="\r\n"; ous.write(info.getBytes()); ous.flush();//强制刷新 } catch (IOException e) { e.printStackTrace(); } } //客户端接收消息的方法 public void readInfo(){ System.out.println("readInfo执行了!"); while(true){ //创建一个字符串缓冲器对象 StringBuffer strb = new StringBuffer(); int reads = 0; //判断当读到回车是#字符的存入 while(reads != 35){ try { reads = ins.read();//将字符读入到服务器 strb.append((char)reads);//将读到的字符放入字符串缓冲区 } catch (IOException e) { e.printStackTrace(); } } // System.out.println("while(reads != 13)循环退出了"); sting = strb.toString().trim();//将缓冲区的字符整合成字符串 System.out.println("客户端接收到的消息是: "+sting); jta.setText(sting); if(sting == "exit"){ break; } } System.out.println("readInfo结束!"); } //重写run方法 public void run(){ System.out.println("客户端的run方法执行了"); readInfo(); System.out.println("客户端的run方法结束了"); } }
写该类遇到的一个问题就是,当执行readInfo();方法的时候,少些了while(true){}的一个死循环.当没有该循环的时候读入的方法只是执行一次当读到#的时候程序结束了readInfo(),同时也就结束了run();方法跳出了线程,这之后读不到了消息
相关推荐
【标题】: "基于socket的简易多人聊天室" 在计算机网络编程中,Socket是一种通信协议,它允许两台或多台计算机通过互联网进行双向通信。基于Socket的简易多人聊天室是利用这一技术实现的一个多用户交互的平台。在这...
在Java编程领域,实现多人聊天功能是一项常见的任务,尤其在构建网络应用程序时。在这个场景中,我们有两个核心的Java类,即`QQServer.java`和`QQClient.java`,分别代表服务器端和客户端。这两个类构成了一个简单的...
该课程设计项目主要关注的是在Linux环境下构建一个嵌入式系统的多人聊天室应用。这个项目不仅涉及到了软件开发,还涵盖了操作系统和网络通信的基础知识,是计算机科学与技术专业学生在学习过程中的一项重要实践。 ...
【标题】中的“大学生计算机网络课程期末作业java聊天系统(多人聊天室)原创”表明这是一个由大学生完成的项目,作为其计算机网络课程的期末作业。这个项目是一个基于Java编程语言实现的聊天系统,具备多人聊天的...
这个“简单的多人聊天室”项目包含两个主要组件:`chatClient`和`chatServer`,分别代表客户端和服务器端。 客户端(chatClient)是用户与聊天室交互的部分,通常包括一个用户界面,让用户输入消息并显示来自其他...
在多人聊天系统中,服务器端通常需要处理多个客户端的并发连接,这需要用到多线程技术。每个客户端连接可以视为一个独立的线程,服务器可以同时处理多个线程,实现并行处理,提高系统的响应效率。 5. **异步编程**...
在本项目中,我们讨论的是一个使用Java编程语言开发的简易多人聊天室。这个聊天室主要是为了解决作业中的问题,尽管它存在一些已知的缺陷,但它仍然是一个很好的起点来学习和理解Java多线程以及网络编程的基本概念。...
【描述】"简易聊天室 flash多人聊天 FMS实现"进一步强调了系统的特性,即简单易用和多人参与。这表明设计的目标是提供一个用户友好、能够支持多个用户同时在线交流的环境。通过Flash技术,用户可以在网页上直接进行...
为了实现多人聊天,服务器端需要同时处理多个客户端的连接,这就需要用到多线程。当服务器接收到一个新的客户端连接时,创建一个新的线程来处理该连接,确保不影响其他客户端的通信。 1. **线程处理**: - 定义一...
【Java Websocket 多人聊天室详解】 在IT领域,实时通信是许多应用程序的核心功能,尤其是在社交、协作和在线服务中。本项目采用Java技术,利用WebSocket协议来构建一个多人聊天室,实现了用户间的实时消息传递,...
【Java简单多人聊天室】是一个基于Java编程语言的多用户实时交流系统,它利用了Java的多线程特性,使得多个用户可以同时进行聊天。这个项目对于初学者来说是一个很好的学习资源,因为它可以帮助理解Java的基础知识,...
综上所述,这个Java多人聊天室项目涵盖了TCP网络编程、Java IO操作、多线程、文件操作、用户认证和简单的用户界面设计等多个知识点。通过实现这样一个项目,开发者可以深入理解网络通信的原理,并锻炼实际的编程技能...
在压缩包中的"简易多人聊天"可能包含了实现上述功能的源代码文件,例如服务器端的代码文件(server.c)、客户端的代码文件(client.c),以及可能的配置文件或测试脚本。通过对这些文件的学习和分析,开发者可以深入...
在多人聊天系统的实现中,服务器端通常会创建一个ServerSocket,监听特定的端口,等待客户端的连接请求。一旦有客户端连接,服务器就会创建一个新的Socket来处理这个连接,这样就可以保证服务器同时处理多个客户端的...
Python多人聊天服务器是一种基于Socket编程实现的网络通信应用,它允许多个用户通过互联网进行实时的文本交流。Socket是网络编程中的基本概念,是进程间通信的一种方式,它为应用程序提供了低级别的、原始的TCP/IP...
《基于Mina实现的多人聊天系统详解》 Mina(Java Multithreaded Network Application Framework)是一个开源的网络通信框架,由Apache软件基金会开发。它为开发者提供了构建高性能、高可用性的网络应用的强大工具,...
下面将详细讲解如何实现一个简单的WebSocket多人聊天应用: 1. **创建WebSocket服务器端** - 首先,我们需要创建一个实现了`javax.websocket.Endpoint`接口的类,这个类代表了WebSocket的服务器端点。在这个类中,...
本项目是一个基于Java实现的多人聊天系统,它包括客户端(ClientDemo.java)和服务器端两部分,旨在提供一个实时、互动的通信平台,允许多个用户通过网络进行对话交流。这个系统的核心在于利用Java的Socket编程来...
总结,这个“NodeJS+Express+socket_io 多人聊天简单Demo”展示了如何利用Node.js的灵活性和Express的便利性,结合socket.io的实时通信能力,构建一个基本的多人聊天应用。这个项目是学习实时Web应用程序开发的一个...