一个完整的聊天程序

以下程序在jdk1.4.1中调试通过;
OS : Windows XP 
本程序有一个空发消息的处理问题,希望大家多多指教!
mainto:yzmhacke.163.com

客户端的程序:

//Client.java
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*; 
 
 public   class   Client  extends  Frame implements 
  ActionListener,Runnable{
      
      private TextField tf1,tf2;
      private  Label la1,la2;
      private TextArea  ta1,ta2;
      private Socket s;
      private Button b,l;
      private BufferedReader br=null;
      private  PrintWriter pw=null;
         // static  String   port,ip;
      public static void   main(String arg[]) {
         new Client();
      //if(arg[0].length()!=0)  ip=arg[0];
        //if(arg[1].length()!=0)  port=arg[1];
          }
      
      //完成构造函数的说明
      public Client(){
          //完成ip地址与端口的建立
          setLayout(new GridLayout(6,1));
         Panel panel=new Panel();      
          tf1=new TextField(20);
          tf2=new TextField(10);
          la1=new Label("IP地址 ");
           
          la2=new Label("对应端口    ");
          Button l=new Button("连接");
          l.setBackground(Color.green);
          //l.addActionListener(this);
          panel.add(la1);
          panel.add(tf1);
          panel.add(la2);
          panel.add(tf2);
          panel.add(l);
          add(panel);
        
        //输入框与显示框
        
         ta1=new  TextArea(100,300);
        
         add(new Label("消息框"));
         
         add(ta1);
         add(new Label("用户输入框"));
         ta2=new  TextArea(30,300);          
           
           add(ta2);
          Panel p2=new Panel();
          b=new Button("发送"); 
          b.setBackground(Color.yellow);
          p2.add(b);
          add(p2);
          setTitle("客户端");
          setSize(300,450);
          setResizable(false);
          setVisible(true);
          //捕获各种的异常 
          l.addActionListener(this);   
      //    b.addActionListener(this);
          //增加了一个关闭的事件
          addWindowListener(new WindowAdapter(){
               
          public void windowClosing(WindowEvent exit){ System.exit(0);}});
         Thread   ThreadReader=new Thread(this);
           
          ThreadReader.start();
          
        b.addActionListener(this);             
        
          
 } 
           
 public void run(){
                   while(true){
               try{
                   ta1.append("/n #_____________________________#/n"+br.readLine());
             }catch(Exception exo){} 
             }    
      }
      
        //客户向服务端发送消息啊!
    
 
 
 public void actionPerformed(ActionEvent  e)
   {   String command=e.getActionCommand();
        
        if("发送".equals(command)) 
         {  
           if(ta2.getText().trim()!=null)
              {   
                ta1.append("/n  客户端的消息:/n"+ta2.getText());
                pw.println(ta2.getText()+"/n");//" /n   客户短信: /n "
                }   
            else 
                    if(ta2.getText().trim()==null)
            { ta1.append("请输入完整的IP地址与端口以及、/n"+"不能空发消息");}   
                     
         
                   ta2.setText(" "); //结束的时候清空文本框
          }
     else 
       if("连接".equals(command)){
                
       try
           {
             
           //借助连接的按钮完成远程pc的连接的工作。建立输入与输出流两个工具
         s=new Socket(tf1.getText().toString(),Integer.parseInt((tf2.getText()).trim()));
         //Integer.parseInt((tf2.getText()).trim())
         br=new BufferedReader(new InputStreamReader(s.getInputStream()));
         pw=new PrintWriter(s.getOutputStream(),true);
         //ta1.append("/n 服务端来消息:/n"+br.readLine());
         }
         catch(Exception ex){
             //ta1.append("产生了输入输出异常无法完成交互!");
             }
            
          }           
                 
       }   
                             
    
  }   


/*******************服务端的程序*************************/
//Server.java
package server;
import java.io.*;
import java.awt.*;
import java.net.*;
import java.awt.event.*;

public class  Server{
    public static void main(String arg[]){
         ServerService MyServer=new ServerService(8000,10);    
         
   }
  }
 //交互端的服务窗口    
  class ServiceThread extends Frame 
  implements  ActionListener,Runnable{
         ServerService FatherListener;
         Socket ConnectedClient;
       Thread   ConnectedThread;
       Panel   ListenePanel;
       TextArea   ServerMeg; 
       TextArea  ServerWrite;
       Label  la;  
       Button bt; 
       BufferedReader in;
       PrintWriter out;    
      public ServiceThread(ServerService  sv,Socket s){
                    //容器与格子组建的结合
                    
                     FatherListener=sv;
                     ConnectedClient=s;
                     ConnectedThread =new Thread(this);
                     //采用线程的目的是利用他的并发机制,实现多个任务
                     
                     //在当前的类中(this)通过Runnabel()接口实现Thread()的Run()方案
                     
                     
                     setTitle("Answer Client");
                     setLayout(new GridLayout(4,1));
                     //采用格子组建的形式完成组建的安排 
                     
                     ServerMeg=new TextArea(null,5,45,TextArea.SCROLLBARS_VERTICAL_ONLY);
                     //添加各种组建到容器当中
                     ListenePanel=new Panel();
                     ListenePanel.add(ServerMeg);
                     add(ListenePanel);
                     addWindowListener(new WindowAdapter(){
                          public void windowClosing(WindowEvent e){
                           //((Frame)e.getWindow()).dispose();//保留的语句
                              System.exit(0);
                              }});
                     //第二个Panel() 
                     
                    la=new Label("服务端消息输入框...............");
                    add(la);
                    ServerWrite=new TextArea(10,50);
                    add(ServerWrite);
                     //add(p2);
                     setSize(355,360);
                     
                     Panel p3=new Panel();
                     
                     bt=new Button("传送"); 
                     bt.addActionListener(this);
                     p3.add(bt);
                     add(p3);
                   
                     setResizable(false);
                     
                     show();
                     InetAddress ClientAddress=ConnectedClient.getInetAddress();
                     ServerMeg.append("Client Conneted from /n "+ClientAddress.getHostAddress()+"!");
                     
                     }
                  //完成事件的部
             //面临的一个问题是空发消息
             
              public void  actionPerformed(ActionEvent ex){
                  
                      if(ex.getSource()==bt){
                             if((int)((ServerWrite.getText().toString()).length())!=0)
                               ServerMeg.append("服务端消息:"+ServerWrite.getText()+"/n");
                               out.println("/n"+ServerWrite.getText());  
                             ServerWrite.setText("");
                       }
                      else {
                          
                               ServerMeg.append("系统提示: 不能空法消息!/n");
                          
                          }                          
                  
                  }    
                  
                      
                                     
         //  覆盖线程的run()方法
         
          public void run(){
              
            try{
                    in=
                  new  BufferedReader(new InputStreamReader(ConnectedClient.getInputStream())); 
                   out=new PrintWriter(ConnectedClient.getOutputStream(),true);
                
                out.println("Hello!    Wellocme  connect  our server !"); 
                
                out.flush();
                String s=in.readLine();
                if(s.equals("bye"))
                    out.println("已经断开与服务器的连接.............. /n   欢 迎 下 次 观 顾!");
                while(!s.equals("bye")){
                     ServerMeg.append("/n#_________________________________________#/n"+s);
                    s=in.readLine();
                    }
                 
              
                     
                ConnectedClient.close(); 
                   
              }catch(Exception e){}
               FatherListener.addMeg("Client"+"Cloesd."+"/n");    
           
          }//run(),finished;
      
      }    
        
  //服务窗口
  class ServerService extends Frame{
        ServerSocket Listener;
        TextArea ListenerMeg;
        public ServerService(int port,int Count){
              try{
                  
                   Listener=new ServerSocket(port,Count);//开启监听的端口
                   
                   setTitle("服务监听");
                   this.addWindowListener(new WindowAdapter(){
                        public void windowClosing(WindowEvent e){
                            ((Frame)e.getWindow()).dispose();//释放组建与内存
                           System.exit(0);           
                            
                            }});
                            setLayout(new BorderLayout());
                            ListenerMeg=new TextArea("监听服务已经启动 /n",10,50);
                            add("Center",ListenerMeg);
                            setResizable(false);//设计固定的状态
                            pack();//重新的打包
                            
                            show();
                            while(true){
                                Socket connected=Listener.accept();//等待外部的连接,直到连接成功才返回一个套接字
                                
                                InetAddress ClientAddress=connected.getInetAddress();
                                ListenerMeg.append("/n Client connected from :/n"+ ClientAddress.toString());
                                ServiceThread MyST=new ServiceThread(this,connected);//初使化服务线程
                                //this指向当前对象的指针
                                
                                MyST.ConnectedThread.start();//启动线程
                             }    //获取套接子,激活线程,采用循环的语句解决方式
                             
                             
                           }catch(Exception ep){}
                           
                       }
                  public void addMeg(String s){
                      ListenerMeg.append(s);
                      
                      }     
                 }        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 好的,以下是一个用 HTML 写的简单聊天程序: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>聊天程序</title> <style> #chat-box { width: 400px; height: 300px; border: 1px solid #ccc; overflow: scroll; padding: 10px; } #message-input { width: 400px; height: 30px; margin-top: 10px; padding: 5px; } #send-button { margin-top: 10px; padding: 5px; } </style> </head> <body> <div id="chat-box"></div> <input type="text" id="message-input"> <button id="send-button" onclick="sendMessage()">发送</button> <script> function sendMessage() { var messageInput = document.getElementById('message-input'); var chatBox = document.getElementById('chat-box'); var message = messageInput.value; chatBox.innerHTML += '<p>我说:' + message + '</p>'; messageInput.value = ''; } </script> </body> </html> ``` 这个聊天程序一个文本框和一个按钮组成,用户在文本框中输入信息,然后点击按钮发送信息。聊天记录会显示在聊天框中。 这个聊天程序非常简单,只有一个发送信息的功能。如果想要实现更复杂的聊天程序,需要使用 JavaScript、CSS、服务器端脚本等技术。 ### 回答2: HTML是一种用于构建网页的标记语言,它主要负责页面的结构和排版。如果要实现一个完整聊天程序,HTML单独不能完成,还需要使用其他编程语言如JavaScript或者后端语言进行数据的处理和交互。 在HTML中,我们可以使用一些标签和属性来创建聊天界面的基本结构。例如,可以使用`<div>`标签来定义聊天框的整个区域,使用`<ul>`标签定义聊天内容的列表,使用`<input>`标签定义输入框等。 为了实现实时聊天,我们可以借助JavaScript和WebSocket技术。WebSocket是一种在网络上进行全双工通信的协议,可以在浏览器和服务器之间建立持久的连接,实现实时通信。 在JavaScript中,可以使用WebSocket API来与服务器建立连接,并监听消息的到达。当有新消息到达时,可以通过JavaScript动态地将消息添加到聊天内容的列表中,并自动滚动到最新消息的位置。 除了消息的接收,我们还需要通过JavaScript将用户输入的消息发送给服务器。可以在输入框中监听回车键的按下事件,在事件回调中获取输入框的文本内容,然后通过WebSocket将消息发送给服务器。 另外,要让聊天程序具有更好的用户体验,还可以使用CSS来美化界面,添加一些特效、动画或者自定义样式。 总之,通过HTML、JavaScript和WebSocket技术的结合,我们可以实现一个基本的聊天程序。当然,具体的实现方式还需要考虑服务器端的支持和功能需求,这超出了HTML本身的范畴。 ### 回答3: HTML是一种标记语言,主要用于创建网页内容的结构和布局。虽然HTML本身并不具备处理交互性功能的能力,但我们可以借助JavaScript等技术来实现这样的功能。 要用HTML编写一个简单的聊天程序,我们需要结合JavaScript和一些CSS样式来实现。下面是实现的基本步骤: 1. HTML结构:我们可以使用`<div>`元素来创建一个整体的聊天窗口容器,内部包括头部、聊天内容展示区、输入框和发送按钮等元素。 2. CSS样式:通过CSS样式设置聊天窗口的样式,如颜色、大小、边框等。 3. JavaScript交互:使用JavaScript来实现消息的发送与接收。可以使用`<input>`元素作为输入框,并为发送按钮添加一个点击事件监听器。当发送按钮被点击时,获取输入框中的文本,并将其展示在聊天内容区域。 4. 消息接收:通过JavaScript模拟接收消息的过程。可以使用`setTimeout`函数来延迟一段时间,然后自动向聊天内容区域添加一条模拟的接收消息。 5. 样式调整:根据需求调整聊天窗口的展示效果,如设置不同的消息样式、消息对齐方式等。 需要注意的是,这个聊天程序只是一个简单的示例,无法实现真正的实时聊天功能和数据存储。要实现更复杂的聊天系统,还需要后端技术的支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值