评论

收藏

[Java] java基于C/S模式实现聊天程序(客户端)

编程语言 编程语言 发布于:2021-10-05 23:13 | 阅读数:400 | 评论:0

这篇文章主要为大家详细介绍了java基于C/S模式实现聊天程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
经过这几天对java的学习,用java做了这个计算机网络的课程设计,基于c/s模式的简单聊天程序,此篇文章介绍一些客户端的一些东西。
先讲一讲此聊天程序的基本原理,客户端发送消息至服务器,服务器收到消息之后将其转发给连接服务器的所有客户端,来自客户端的消息中包含发件人的名字。
客户端的主要功能是发送消息和接收消息,客户端设置好了端口和服务器地址,并创立客户端自己的套接字,用作和服务器通信的一个标识。布局就不多说了,主要说说监视器和两个重要的线程:发送和接收。
监视器中,登录按钮触发的功能是设置用户名,并且建立和服务器的连接,同时还要创建接收线程,并使其开始运行。
下面说一说,发送和接收的线程:发送线程是建立数据输出流,将想要文本输入区中的消息以utf字符串的形式写入到数据流中,并且在发送成功后清空输入框。并且该线程由“发送”按钮触发。
接收线程是在登录之后就建立的,线程中建立输入流,并且读出流中的utf字符串,将其显示到文本展示区,就完成了信息的接收。
客户端大致的功能和组成就是这些了,下一篇我将讲一下有关服务器的东西。
界面展示:
DSC0000.jpg
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();
 }
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持CodeAE代码之家
原文链接:https://blog.csdn.net/h843653844/article/details/50412368

关注下面的标签,发现更多相似文章