聊天项目

  在马士兵的聊天项目中,有很多细节我们需要了解清楚,编程最重要的是思想,在学习过程中一定要知道步骤:

1,建立一个窗口。用Frame类里的方法建立。程序如下:

import java.awt.*;

public class ChatClient extends Frame {
    

    public static void main(String[] args) {
        
            new ChatClient().launchFrame();

    
    }
    public void launchFrame(){
        setLocation(400,300);
        this.setSize(300, 300);
        setVisible(true);
    }

}
    

2,、建立窗口体,使用

TextField tfTxt=new TextField();
TextArea ta=new TextArea();

建立对象。再添加对象位置。程序如下:

import java.awt.*;

public class ChatClient extends Frame {
    
    TextField tfTxt=new TextField();
    TextArea ta=new TextArea();

    public static void main(String[] args) {
        
            new ChatClient().launchFrame();

        
    }
    public void launchFrame(){
        setLocation(400,300);
        this.setSize(300, 300);
        add(tfTxt,BorderLayout.SOUTH);
        add(ta,BorderLayout.NORTH);
        pack();
        setVisible(true);
    }

}
    

 3,添加事件处理,使用事件处理来使窗口可以退出,对于其中的方法要了解并且会使用,会用每一个方法是最关键的。程序如下:

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.*;

public class ChatClient extends Frame {
    
    TextField tfTxt=new TextField();
    TextArea ta=new TextArea();

    public static void main(String[] args) {
        
    new ChatClient().launchFrame();

        
    }
    public void launchFrame(){
        setLocation(400,300);
        this.setSize(300, 300);
        add(tfTxt,BorderLayout.SOUTH);
        add(ta,BorderLayout.NORTH);
        pack();
        this.addWindowListener(new WindowAdapter() {//addWindowListener添加指定的窗口焦点侦听器,以从此窗口接收窗口事件
            @Override
            public void windowClosing(WindowEvent arg0) {//windowClosing窗口正处在关闭过程中时调用,
                
            
                System.exit(0);
            }

            
        });
        setVisible(true);
    }

}

4,实现聊天打字按回车能够消失输入框里的内容,用这个getText()和setTest()方法实现。程序如下:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.*;

public class ChatClient extends Frame {
    
    TextField tfTxt=new TextField();
    TextArea ta=new TextArea();

    public static void main(String[] args) {
        
    new ChatClient().launchFrame();

        
    }
    public void launchFrame(){
        setLocation(400,300);
        this.setSize(300, 300);
        add(tfTxt,BorderLayout.SOUTH);
        add(ta,BorderLayout.NORTH);
        pack();
        this.addWindowListener(new WindowAdapter() {//addWindowListener添加指定的窗口焦点侦听器,以从此窗口接收窗口事件
            @Override
            public void windowClosing(WindowEvent arg0) {//windowClosing窗口正处在关闭过程中时调用,
                
            
                System.exit(0);
            }

            
        });
        tfTxt.addActionListener(new TFListtener());
        //public void addActionListener(ActionListener l)
        //添加指定的操作侦听器,以从此文本字段接收操作事件。如果 l 为 null,则不抛出任何异常,也不执行任何操作。 
        setVisible(true);
    }
    
    private class TFListtener implements ActionListener{
        
        

        @Override
        public void actionPerformed(ActionEvent e) {
            
            String s=tfTxt.getText().trim();//getText()返回此文本组件表示的文本。默认情况下,此文本是一个空字符串。
            ta.setText(s);//将此文本组件显示的文本设置为指定文本
            tfTxt.setText("");
            
        }
        
    }

}

5.实现客户端的连接,首先建立客户端,引入java.net.*;包。具体程序如下:

import java.io.IOException;
import java.net.*;

public class ChatServer {

    public static void main(String[] args) {
        
        try {
            ServerSocket ss=new ServerSocket(8888);//创建绑定到特定端口的服务器套接字
            while(true){
                Socket s=ss.accept();//侦听并接受到此套接字的连接。
                System.out.println("a client connercted ");
            }
        } catch (IOException e) {
            
            e.printStackTrace();
        }

    }

}

6,建立服务器端与客户端的连接,具体程序如下:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.util.*;
import java.net.*;

public class ChatClient extends Frame {
    
    TextField tfTxt=new TextField();
    TextArea ta=new TextArea();

    public static void main(String[] args) {
        
    new ChatClient().launchFrame();
    
    }
    public void launchFrame(){
        setLocation(400,300);
        this.setSize(300, 300);
        add(tfTxt,BorderLayout.SOUTH);
        add(ta,BorderLayout.NORTH);
        pack();
        this.addWindowListener(new WindowAdapter() {//addWindowListener添加指定的窗口焦点侦听器,以从此窗口接收窗口事件
            @Override
            public void windowClosing(WindowEvent arg0) {//windowClosing窗口正处在关闭过程中时调用,
                
            
                System.exit(0);
            }

            
        });
        tfTxt.addActionListener(new TFListtener());
        //public void addActionListener(ActionListener l)
        //添加指定的操作侦听器,以从此文本字段接收操作事件。如果 l 为 null,则不抛出任何异常,也不执行任何操作。 
        setVisible(true);
        connect();
    }
    
    public void connect(){
        try {
            //public Socket(InetAddress address,
            //int port)
            //throws IOException创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
            Socket s=new Socket("127.0.0.1",8888);
            System.out.println("connected");
        } catch (UnknownHostException e) {
            
            e.printStackTrace();
        } catch (IOException e) {
            
            e.printStackTrace();
        }
    }
    
    private class TFListtener implements ActionListener{
        
        

        @Override
        public void actionPerformed(ActionEvent e) {
            
            String s=tfTxt.getText().trim();//getText()返回此文本组件表示的文本。默认情况下,此文本是一个空字符串。
            ta.setText(s);//将此文本组件显示的文本设置为指定文本
            tfTxt.setText("");
            
        }
        
    }

}

7.在客户端输入,在服务器端也能接收到信息。具体程序如下:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.*;
import java.net.*;


public class ChatClient extends Frame {
    
    Socket s=null;
    
    TextField tfTxt=new TextField();
    TextArea ta=new TextArea();

    public static void main(String[] args) {
        
    new ChatClient().launchFrame();
    
    }
    public void launchFrame(){
        setLocation(400,300);
        this.setSize(300, 300);
        add(tfTxt,BorderLayout.SOUTH);
        add(ta,BorderLayout.NORTH);
        pack();
        this.addWindowListener(new WindowAdapter() {
            //addWindowListener添加指定的窗口焦点侦听器,以从此窗口接收窗口事件
            @Override
            public void windowClosing(WindowEvent arg0) {//windowClosing窗口正处在关闭过程中时调用,
                
            
                System.exit(0);
            }

            
        });
        tfTxt.addActionListener(new TFListtener());
        //public void addActionListener(ActionListener l)
        //添加指定的操作侦听器,以从此文本字段接收操作事件。如果 l 为 null,则不抛出任何异常,也不执行任何操作。 
        setVisible(true);
        connect();
    }
    
    public void connect(){
        try {
            //public Socket(InetAddress address,
            //int port)
            //throws IOException创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
            s=new Socket("127.0.0.1",8888);
            System.out.println("connected");
        } catch (UnknownHostException e) {
            
            e.printStackTrace();
        } catch (IOException e) {
            
            e.printStackTrace();
        }
    }
    
    private class TFListtener implements ActionListener{
        
        

        @Override
        public void actionPerformed(ActionEvent e) {
            
            String str=tfTxt.getText().trim();//getText()返回此文本组件表示的文本。默认情况下,此文本是一个空字符串。
            ta.setText(str);//将此文本组件显示的文本设置为指定文本
            tfTxt.setText("");
            try {
                System.out.println(s);
                DataOutputStream   dos=new DataOutputStream(s.getOutputStream());
                dos.writeUTF(str);
                dos.flush();
                dos.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            
        }
        
    }

}
import java.io.DataInputStream;
import java.io.IOException;
import java.io.ObjectInputStream.GetField;
import java.net.*;

@SuppressWarnings("unused")
public class ChatServer {

    public static void main(String[] args) {
        
        try {
            ServerSocket ss=new ServerSocket(8888);//创建绑定到特定端口的服务器套接字
            while(true){
                Socket s=ss.accept();//侦听并接受到此套接字的连接。
                System.out.println("a client connercted ");
                DataInputStream dis=new DataInputStream(s.getInputStream());
                String str=dis.readUTF();
                System.out.println(str);
                dis.close();
            }
        } catch (IOException e) {
            
            e.printStackTrace();
        }

    }

}

8,、建立服务器端与客服端的连接,并且可以连续输入内容和接收内容,程序如下:

import java.io.DataInputStream;
import java.io.IOException;
import java.io.ObjectInputStream.GetField;
import java.net.*;

@SuppressWarnings("unused")
public class ChatServer {
    

    public static void main(String[] args) {
        boolean started =false;
        try {
            ServerSocket ss=new ServerSocket(8888);//创建绑定到特定端口的服务器套接字
            started=true;
            while(started){
                boolean bConnected=false;
                Socket s=ss.accept();//侦听并接受到此套接字的连接。
                System.out.println("a client connercted ");
                bConnected=true;
                DataInputStream dis=new DataInputStream(s.getInputStream());
                while(bConnected){
                    String str=dis.readUTF();
                    System.out.println(str);
                }
                 dis.close();
            }
        } catch (IOException e) {
            
            e.printStackTrace(); 
        }

    }

}
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.*;
import java.net.*;


public class ChatClient extends Frame {
    
    Socket s=null;
    DataOutputStream dos=null;
    
    TextField tfTxt=new TextField();
    TextArea ta=new TextArea();

    public static void main(String[] args) {
        
    new ChatClient().launchFrame();
    
    }
    public void launchFrame(){
        setLocation(400,300);
        this.setSize(300, 300);
        add(tfTxt,BorderLayout.SOUTH);
        add(ta,BorderLayout.NORTH);
        pack();
        this.addWindowListener(new WindowAdapter() {
            //addWindowListener添加指定的窗口焦点侦听器,以从此窗口接收窗口事件
            @Override
            public void windowClosing(WindowEvent arg0) {//windowClosing窗口正处在关闭过程中时调用,
                
                disconnect();   
                System.exit(0);
            }

            
        });
        tfTxt.addActionListener(new TFListtener());
        //public void addActionListener(ActionListener l)
        //添加指定的操作侦听器,以从此文本字段接收操作事件。如果 l 为 null,则不抛出任何异常,也不执行任何操作。 
        setVisible(true);
        connect();
    }
    
    public void connect(){
        try {
            //public Socket(InetAddress address,
            //int port)
            //throws IOException创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
            s=new Socket("127.0.0.1",8888);
            dos=new DataOutputStream(s.getOutputStream());
            System.out.println("connected");
        } catch (UnknownHostException e) {
            
            e.printStackTrace();
        } catch (IOException e) {
            
            e.printStackTrace();
        }
    } 
    
    public void disconnect(){
        try {
            dos.close();
            s.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
         
    }
    
    private class TFListtener implements ActionListener{
        
        

        @Override
        public void actionPerformed(ActionEvent e) {
            
            String str=tfTxt.getText().trim();//getText()返回此文本组件表示的文本。默认情况下,此文本是一个空字符串。
            ta.setText(str);//将此文本组件显示的文本设置为指定文本
            tfTxt.setText("");
            try {
                System.out.println(s);
                //DataOutputStream   dos=new DataOutputStream(s.getOutputStream());
                dos.writeUTF(str);
                dos.flush();
                //dos.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            
        }
        
    }

}
原文地址:https://www.cnblogs.com/tangdeqiang/p/7605469.html