经过这几天对java的学习,用java做了这个计算机网络的课程设计,基于C/S模式的简单聊天程序,此篇文章介绍一些客户端的一些东西。
先讲一讲此聊天程序的基本原理,客户端发送消息至服务器,服务器收到消息之后将其转发给连接服务器的所有客户端,来自客户端的消息中包含发件人的名字。
客户端的主要功能是发送消息和接收消息,客户端设置好了端口和服务器地址,并创立客户端自己的套接字,用作和服务器通信的一个标识。布局就不多说了,主要说说监视器和两个重要的线程:发送和接收。
监视器中,登录按钮触发的功能是设置用户名,并且建立和服务器的连接,同时还要创建接收线程,并使其开始运行。
下面说一说,发送和接收的线程:发送线程是建立数据输出流,将想要文本输入区中的消息以UTF字符串的形式写入到数据流中,并且在发送成功后清空输入框。并且该线程由“发送“按钮触发。
接收线程是在登录之后就建立的,线程中建立输入流,并且读出流中的UTF字符串,将其显示到文本展示区,就完成了信息的接收。
客户端大致的功能和组成就是这些了,下一篇我将讲一下有关服务器的东西。
界面展示:
包的客户; 进口java.awt。*; 进口java.awt.event。*; 进口. io . *; 进口java.net。*; 进口java.util。*; 进口javax.swing。*; 公共类客户端扩展JFrame { 套接字clientsocket=零; DataInputStream=零; DataOutputStream=零; JTextArea inputText; 字符串SerAddress=?92.168.1.100”; int SendPort=8888; JTextField昵称; JTextArea textShow; setbutton JButton按钮; 公共端(){//构造函数,创建一个布局并初始化 init (); setVisible(真正的); setDefaultCloseOperation (JFrame.DO_NOTHING_ON_CLOSE); setBounds (480, 160, 340, 460); setTitle(“好好学习天天向上聊天室”); setResizable(假); } 无效的init(){//初始化函数,设置布局并且设置监视器 inputText=new JTextArea (29); 按钮=new JButton(“发送”); JLabel标签=new JLabel(“昵称”); setbutton=new JButton(“登录”); textShow=new JTextArea (29); textShow.setEditable(假); 昵称=new JTextField (10); inputText。setBackground(新颜色(45、210、209)); setLayout(新FlowLayout ()); getContentPane ()。setBackground(新颜色(20、85、237)); 添加(新JScrollPane (textShow)); textShow。setBackground(新颜色(45、210、209)); setbutton。setBackground(新颜色(236、134、21)); 按钮。setBackground(新颜色(236、134、21)); 昵称。setBackground(新颜色(45、210、209)); 标签。setForeground(新颜色(243、243、14)); 添加(标签); 添加(昵称); 添加(setbutton); 添加(新JScrollPane (inputText)); 添加(按钮); setbutton。addActionListener(新ActionListener(){//添加监视器 公共空间actionPerformed (ActionEvent e) { 线程readData; 读阅读=零; 尝试{ clientsocket=新的套接字(); 读=new读(); readData=https://www.yisu.com/zixun/new线程(阅读); 如果(clientsocket.isConnected ()) { 其他}{ InetAddress地址=InetAddress.getByName (SerAddress); InetSocketAddress socketAddress=新的InetSocketAddress(都 地址,SendPort); clientsocket.connect (socketAddress)都; textShow。附加(新text。SimpleDateFormat (“yy-MM-dd HH: mm: ss”)。新日期格式(()) + " \ n与服务器连接成功\ n已登录聊天室\ n”); 在新DataInputStream=(clientsocket.getInputStream ());=new DataOutputStream (clientsocket .getOutputStream ()); read.setDataInputStream(的); readData.start (); } }捕捉(异常e1) { textShow。追加(新java.text.SimpleDateFormat ( “yy-MM-dd HH: mm: ss”)。新日期格式(()) + " \ n服务器连接失败\ n”); } } }); 按钮。addActionListener(新ActionListener () { 公共空间actionPerformed (ActionEvent e) { 发送发送=new发送(); 线程sendData=https://www.yisu.com/zixun/new线程(发送); send.setDataOutputStream(出); sendData.start (); } }); addWindowListener(新WindowAdapter(){//响应关闭按钮的功能 公共空间windowClosing (WindowEvent e) { int选项=JOptionPane .showConfirmDialog(零,“亲爱的你真的要离开聊天室么?”, “好好学习,天天向上”,JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); 如果(选项==JOptionPane.YES_OPTION) system . exit (0); } }); }//init结束 类阅读实现Runnable{//读取输入流的线程 DataInputStream; 公共空间setDataInputStream (DataInputStream) { 这一点。在=; } 公共空间run () { 字符串的结果; 而(真){ 尝试{ 结果=in.readUTF (); textShow。追加(新java.text.SimpleDateFormat ( “yy-MM-dd HH: mm: ss”)。新日期格式(()) +“\ n” +结果); }捕捉(IOException e) { textShow。追加(新java.text.SimpleDateFormat ( “yy-MM-dd HH: mm: ss”)。新日期格式(()) + " \ n与服务器断开连接\ n”); 打破; } } } } 类将实现Runnable{//发送消息的输出流线程 DataOutputStream; 公共空间setDataOutputStream (DataOutputStream) { 这一点。出=; } 公共空间run () { 字符串消息=零; 消息=NickName.getText () +“:”+ inputText.getText () +“\ n”; 尝试{ out.writeUTF(消息); inputText.setText (" "); }捕获异常(e2) { textShow.append(“发送失败:未连接到服务器\ n”); } } } 公共静态void main (String参数[]){ 客户端=新客户(); } }java基于C/S模式实现聊天程序(客户端)