java基于C/S模式实现聊天程序(客户端)
程序员文章站
2024-03-02 12:12:58
经过这几天对java的学习,用java做了这个计算机网络的课程设计,基于c/s模式的简单聊天程序,此篇文章介绍一些客户端的一些东西。
先讲一讲此聊天程序的基本原理,客...
经过这几天对java的学习,用java做了这个计算机网络的课程设计,基于c/s模式的简单聊天程序,此篇文章介绍一些客户端的一些东西。
先讲一讲此聊天程序的基本原理,客户端发送消息至服务器,服务器收到消息之后将其转发给连接服务器的所有客户端,来自客户端的消息中包含发件人的名字。
客户端的主要功能是发送消息和接收消息,客户端设置好了端口和服务器地址,并创立客户端自己的套接字,用作和服务器通信的一个标识。布局就不多说了,主要说说监视器和两个重要的线程:发送和接收。
监视器中,登录按钮触发的功能是设置用户名,并且建立和服务器的连接,同时还要创建接收线程,并使其开始运行。
下面说一说,发送和接收的线程:发送线程是建立数据输出流,将想要文本输入区中的消息以utf字符串的形式写入到数据流中,并且在发送成功后清空输入框。并且该线程由“发送”按钮触发。
接收线程是在登录之后就建立的,线程中建立输入流,并且读出流中的utf字符串,将其显示到文本展示区,就完成了信息的接收。
客户端大致的功能和组成就是这些了,下一篇我将讲一下有关服务器的东西。
界面展示:
package client; import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; import java.util.*; import javax.swing.*; public class client extends jframe { socket clientsocket = null; datainputstream in = null; dataoutputstream out = null; jtextarea inputtext; string seraddress = "192.168.1.100"; int sendport = 8888; jtextfield nickname; jtextarea textshow; jbutton button, setbutton; public client() { // 构造函数,创建一个布局并初始化 init(); setvisible(true); setdefaultcloseoperation(jframe.do_nothing_on_close); setbounds(480, 160, 340, 460); settitle("好好学习天天向上聊天室"); setresizable(false); } void init() { // 初始化函数,设置布局并且设置监视器 inputtext = new jtextarea(4, 29); button = new jbutton(" 发送 "); jlabel label = new jlabel("昵称"); setbutton = new jbutton(" 登录 "); textshow = new jtextarea(15, 29); textshow.seteditable(false); nickname = new jtextfield(10); inputtext.setbackground(new color(45, 210, 209)); setlayout(new flowlayout()); getcontentpane().setbackground(new color(20, 85, 237)); add(new jscrollpane(textshow)); textshow.setbackground(new color(45, 210, 209)); setbutton.setbackground(new color(236, 134, 21)); button.setbackground(new color(236, 134, 21)); nickname.setbackground(new color(45, 210, 209)); label.setforeground(new color(243, 243, 14)); add(label); add(nickname); add(setbutton); add(new jscrollpane(inputtext)); add(button); setbutton.addactionlistener(new actionlistener() { //添加监视器 public void actionperformed(actionevent e) { thread readdata; read read = null; try { clientsocket = new socket(); read = new read(); readdata = new thread(read); if (clientsocket.isconnected()) { } else { inetaddress address = inetaddress.getbyname(seraddress); inetsocketaddress socketaddress = new inetsocketaddress( address, sendport); clientsocket.connect(socketaddress); textshow.append(new java.text.simpledateformat( "yy-mm-dd hh:mm:ss").format(new date()) + "\n与服务器连接成功\n已登录聊天室\n"); in = new datainputstream(clientsocket.getinputstream()); out = new dataoutputstream(clientsocket .getoutputstream()); read.setdatainputstream(in); readdata.start(); } } catch (exception e1) { textshow.append(new java.text.simpledateformat( "yy-mm-dd hh:mm:ss").format(new date()) + "\n服务器连接失败\n"); } } }); button.addactionlistener(new actionlistener() { public void actionperformed(actionevent e) { send send = new send(); thread senddata = new thread(send); send.setdataoutputstream(out); senddata.start(); } }); addwindowlistener(new windowadapter() { //响应关闭按钮的功能 public void windowclosing(windowevent e) { int option = joptionpane .showconfirmdialog(null, "亲爱的你真的要离开聊天室么?", " 好好学习,天天向上", joptionpane.yes_no_option, joptionpane.question_message); if (option == joptionpane.yes_option) system.exit(0); } }); } // init结束 class read implements runnable { //读取输入流的线程 datainputstream in; public void setdatainputstream(datainputstream in) { this.in = in; } public void run() { string result; while (true) { try { result = in.readutf(); textshow.append(new java.text.simpledateformat( "yy-mm-dd hh:mm:ss").format(new date()) + "\n" + result); } catch (ioexception e) { textshow.append(new java.text.simpledateformat( "yy-mm-dd hh:mm:ss").format(new date()) + "\n与服务器断开连接\n"); break; } } } } class send implements runnable { // 发送消息的输出流线程 dataoutputstream out; public void setdataoutputstream(dataoutputstream out) { this.out = out; } public void run() { string message = null; message = nickname.gettext() + ":" + inputtext.gettext() + "\n"; try { out.writeutf(message); inputtext.settext(""); } catch (exception e2) { textshow.append("发送失败:未连接到服务器\n"); } } } public static void main(string args[]) { client client = new client(); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。