在马士兵的聊天项目中,有很多细节我们需要了解清楚,编程最重要的是思想,在学习过程中一定要知道步骤:
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(); } } }}