JAVA聊天室程序初版-总结

已成功
这里写图片描述
包括UDP发送和接收,多线程,Swing
1 概览:从全文来看,主要包含构造函数,run()方法,主函数以及类中的一些属性。
其中主函数是为了创建对象,设置JFrame大小,以及引出构造函数进行初始化;
构造函数包含以下部分内容,一是设置JFrame内容的初始化,二是线程的创建以及线程的开启,三是监听器的创建,其中包含了监听text文本框,以及具体的UDP发送程序;
run()方法中,主要包含了UDP的接收程序,并在JFrame中进行显示;
类的一些属性,也主要针对三大块,第一块是JFrame相关,包括String存储数据,JTextArea用于显示,JTextField用于输入,Container容器,用于获得并表示整个JFrame的句柄,第二块是多线程相关,创建Thread对象,第三块是UDP相关,分别针对发送和接收,创建DatagramSocket对象,设置发送目的地的端口,以及接收的监听端口,创建与IP地址相关的InetAddress类;(这里看到一点比较好的习惯,即在编写的开始,将相关要用到的对象先创建好,即使不确定具体生成的对象,也可以先把他们准备好,象征整个框架的构建)2 倾向于首先UDP,然后Thread,然后JFrame
UDP分为发送和监听接收这两块
1)发送:使用DatagramSocket()创建一个数据包套接字;然后创建要发送的数据包,然后使用send()方法发送数据包;
//类的成员变量
DatagramSocket socketSend;
InetAddress iaddress = null;
int portSend = 9898;
//构造函数中的监听text文本
writer = tf.getText();//将文本框中的信息写入流,首先获得数据包的基本内容,
在try-catch语句中,生成要传送目的地的IP地址,套接字,以及数据包,然后使用send()发送数据;
try {
iaddress = InetAddress.getByName(“127.0.0.1”);
socketSend = new DatagramSocket();
DatagramPacket packet = null;
byte data[] = writer.getBytes();
//将数据打包
packet = new DatagramPacket(data,data.length,iaddress,portSend);
System.out.println(new String(data));
socketSend.send(packet);
}catch(Exception e1){
e1.printStackTrace();
}
2)接收:创建数据包套接字,创建字节数组来接收数据包,receive()方法接收UDP包
//类的成员变量
DatagramSocket socketRec;
int portRec = 9898;
//在run()方法中,创建套接字,然后创建数据包,监听,并进行相应的信息显示;
try {
socketRec = new DatagramSocket(portReceive);
} catch (SocketException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
byte data[] = new byte[1024];
while(true){
data = new byte[1024];
DatagramPacket packet = null;
packet = new DatagramPacket(data,data.length);
try{
socketRec.receive(packet);
String message = new String(packet.getData(),0,packet.getLength());
ta.append(“B说” + message + ‘\n’);
ta.setSelectionEnd(ta.getText().length());
}catch(Exception e){
e.printStackTrace();
}
}
3 Thread多线程
包含四个部分,第一是继承Runnable接口,第二是在类属性中创建Thread对象,第三是thread对象的实例化,并启动多线程,第四是在类中重写run()方法;
4 JFrame:是容器的概念,首先继承了JFrame类的本身就是一个大的容器,通过super()方法,父类构造方法就可将其初始化;
public class K19030101 extends JFrame implements Runnable
Container cc;
private JTextArea ta = new JTextArea();
private JTextField tf = new JTextField();
public K19030101(String title) {
super(title);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
然后创建Container对象,利用getContentPane()获取句柄;
cc = this.getContentPane();//首先获得句柄,实例化对象
创建单个子组件的容器类,设置边框类型之后,添加文本面板;
final JScrollPane scrollPane = new JScrollPane();//实现单个子组件的自动水平和(或)
//垂直滚动的容器类
scrollPane.setBorder(new BevelBorder(BevelBorder.RAISED));//设置边框类型
scrollPane.setViewportView(ta);//设置文本面板
然后利用add()方法将其添加到总的容器对象中,包含两个实数,一个是子对象名称,另一个是布局;接下来添加输入文本框到总容器中;
cc.add(scrollPane,BorderLayout.CENTER);//将容器对象加到总的容器对象中
cc.add(tf, “South”);//将文本框放在窗体的下部
针对输入文本框添加监听信息,在其方法中包含一系列动作
tf.addActionListener(new ActionListener(){//原来可以对文本框的输入进行监听
public void actionPerformed(ActionEvent e) {
获得文本框中的内容,并清空
private String writer;
writer = tf.getText();//将文本框中的信息写入流
tf.setText(“”);//将文本框清空
在显示文本框中,添加上述信息
ta.append(“我说:” + tf.getText() + ‘\n’);//将文本框中的信息显示在文本域中
ta.setSelectionEnd(ta.getText().length());

总结补(02042018):
1)框架层次:建立一个类,在类的成员属性中,完整地创建各个子对象,以构建整个类功能框架。如P357(From start to profession),接收广播程序中,分别导入了三块内容,第一是UDP的接收(端口port,InetAddress对象,套接字对象),第二是JFrame框架(两个按钮JButton,显示接收广播的文本域JTextArea),第三是多线程Thread和判断线程是否结束的布尔值boolean
2)构造函数:起到一个很大的作用。这里主要包含了第一,父类方法的初始化,第二,多线程对象的实例化,第三,JFrame的生成(按钮增加监听功能,用于包含两个按钮的JPanel子面板的生成,用于包含两个显示文本域的JPanel子面板的生成),第四,广播接收的实例化(包括端口号的确定,接收地址的确定,套接字的确定)

代码:

package chapter19;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.PrintWriter;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;

/*
 * 客户端程序,实现将用户在文本框中输入的信息发送至服务器,
 * 并将文本框中输入的信息显示在客户端的文本域中
 */
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.BevelBorder;
public class K190301 extends JFrame{
    private String writer;
    DatagramSocket socket;
    private JTextArea ta = new JTextArea();
    private JTextField tf = new JTextField();
    Container cc;
    //UDP相关
    int portSend = 9898;
    InetAddress iaddress = null;

    public K190301(String title) {
        super(title);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        cc = this.getContentPane();//首先获得句柄,实例化对象
        final JScrollPane scrollPane = new JScrollPane();//实现单个子组件的自动水平和(或)
        //垂直滚动的容器类
        scrollPane.setBorder(new BevelBorder(BevelBorder.RAISED));//设置边框类型
        scrollPane.setViewportView(ta);//设置文本面板
        cc.add(scrollPane,BorderLayout.CENTER);//将容器对象加到总的容器对象中

        cc.add(tf, "South");//将文本框放在窗体的下部       
        ta.append("尝试连接\n");
        tf.addActionListener(new ActionListener(){//原来可以对文本框的输入进行监听
            public void actionPerformed(ActionEvent e) {
                writer = tf.getText();//将文本框中的信息写入流
                ta.append(tf.getText() + '\n');//将文本框中的信息显示在文本域中
                ta.setSelectionEnd(ta.getText().length());//这句话的意思不太清楚,理解为
                tf.setText("");//将文本框清空
                System.out.println("输出内容为:" + writer);
                try {
                    socket = new DatagramSocket();
                    DatagramPacket packet = null;
                    byte data[] = writer.getBytes();
                    //将数据打包
                    packet = new DatagramPacket(data,data.length,InetAddress.getByName("127.0.0.1"),portSend);
                    System.out.println(new String(data));
                    socket.send(packet);
                }catch(Exception e1){
                    e1.printStackTrace();
                }

            }
        });
        ta.append("完成连接\n");
    }

    public static void main(String[] args) throws Exception{
        K190301 client = new K190301("向服务器送数据");
        client.setSize(200,200);
        client.setVisible(true);

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值