java c 客户端_java基于C/S模式实现聊天程序(客户端)

经过这几天对java的学习,用java做了这个计算机网络的课程设计,基于C/S模式的简单聊天程序,此篇文章介绍一些客户端的一些东西。

先讲一讲此聊天程序的基本原理,客户端发送消息至服务器,服务器收到消息之后将其转发给连接服务器的所有客户端,来自客户端的消息中包含发件人的名字。

客户端的主要功能是发送消息和接收消息,客户端设置好了端口和服务器地址,并创立客户端自己的套接字,用作和服务器通信的一个标识。布局就不多说了,主要说说监视器和两个重要的线程:发送和接收。

监视器中,登录按钮触发的功能是设置用户名,并且建立和服务器的连接,同时还要创建接收线程,并使其开始运行。

下面说一说,发送和接收的线程:发送线程是建立数据输出流,将想要文本输入区中的消息以UTF字符串的形式写入到数据流中,并且在发送成功后清空输入框。并且该线程由“发送”按钮触发。

接收线程是在登录之后就建立的,线程中建立输入流,并且读出流中的UTF字符串,将其显示到文本展示区,就完成了信息的接收。

客户端大致的功能和组成就是这些了,下一篇我将讲一下有关服务器的东西。

界面展示:

ab7878c2233e8edfeb1e8721c2c20d70.png

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();

}

}

上面即是这篇文章的内容,希望对各位的学习有所启发,也希望大家多多支持学猫在线(shtml.net)。

本文来源:https://blog.csdn.net/h843653844/article/details/50412368

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/503924.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4接口引脚定义_浅谈USB Type-C接口

笔者前段时间做了一款STM32下载器,为了与新时代接轨,在设计电路板的时候首次使用了USBType-C接口,后来发现其确实很好用。就在今天又设计制作了一款USB-hub,在硬件上我又使用了Type-C接口,所以来了兴致,写一…

rocket mq 监听端口_浅谈业务流程中的mq使用方式

假设有个场景:下单成功需要给用户发送消息通知,发送消息通知通过mq实现事务提交前发送mq消息step1:start transactionstep2:生成订单step3:投递消息到mqstep4:commit transaction问题:step3发生…

jsp工程防止外部注入_XPATH注入详解|OWASP Top 10安全风险实践(五)

本文为一些列连载文章之一,不定期更新,计划目录如下:OWASP介绍SQL注入命令注入XML外部实体注入XPATH注入反射式、DOM及存储XSS失效的身份认证和会话管理不安全的直接对象引用安全配置错误敏感信息泄露功能级访问控制缺失跨站请求伪造服务端请…

小程序反编译 g is not defined_培生幼儿启蒙英语 Level B | 小牧羊女在哪?

本栏目为羽佳讲绘本独家专稿,文中图片及音频已获得海豚传媒授权,未经允许请勿转载。大家好!我是毛毛。培生幼儿启蒙英语 Level B(升级版)的分享又来了!想了解这套绘本及购买信息的小伙伴们,可以点击喜大普奔&#xff0…

snmp 获得硬件信息_信息系统项目管理师(三)

常规信息系统集成技术系统集成:将计算机软件、硬件、网络通信等技术产品即成为能够满足用户特定需求的信息系统。(一)网络标准与网络协议1、网络协议网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。网络协议三要素&…

android 充电动画_iPhone 12充电测试:18/20W并无明显区别

原标题:iPhone 12充电测试:18/20W并无明显区别日前,充电头网使用苹果原装5W、12W、18W、20W以及65W充电器测试了iPhone 12的充电速度。从结果来看,苹果的五福一安的充电数据依旧“稳定”,半小时充入了18%的电量&#x…

跳出所有循环的语句_从零开始的Java之旅2.0 流程控制语句

前言昨天我们对Java的数据类型和运算符进行了充分讲解,今日我们学习流程控制语句. 今日内容:if else 判断语句switch 选择语句for 循环语句while 循环语句do while 循环语句break,continue 跳出语句概述:在一个程序执行的过程中,各条语句的执行顺序对…

el-table 树形表格 自定义展开图标_[shell脚本]表格数据在终端可视化输出

最终效果1. 自定义表格样式2. 自定义主题颜色支持三系普通颜色支持16色彩虹色支持单颜色回顾一下shell语法1. shell传递参数我们可以在执行shell脚本时实时传递参数从而指定某些具体的参数(在本例中包括表格的样式、颜色等),脚本中获取参数的…

kubectl apply -f_广州车展捷豹路虎参展阵容 全新F-PACE 路虎卫士90

近日,我们从相关渠道获得了捷豹路虎广州车展的阵容。将有两款新车亮相,新款捷豹F-PACE和路虎卫士90。新款捷豹F-PACE采用了最新的家族式设计风格,具有更时尚的造型设计,而路虎卫士90则拥有更短的轴距。外观方面:新款捷…

github gis 路径规划_Apollo问答丨车辆定位和轨迹规划用的是语义,还是3D Position?...

自Apollo开发者社区小程序上线以来,我们每一天都会在「社区问答」板块收到许多开发者的技术提问。每周,可爱的Apollo小姐姐都会精选出被采纳的社区问答进行整理汇总,并统一对大家进行答复。开发者在使用Apollo平台过程中,如果遇到…

astar插件下载 就行_暗黑破坏神2地图插件常用的设置,做自己的私人订制游戏!...

暗黑2是一款很老的游戏,虽然很经典,但游戏里有很多地方在今天看来有很多不方便的地方,比如无法查看怪物的一些属性,小地图上没有怪物显示,装备系统很复杂但一些数值不能直接查看比如物品等级。所以如今很多朋友玩这个游…

asp.net 将bmp格式图片怎么转换为jpg_Heic图片转换精灵-Heic图片高清转换JPG/PNG/BMP方法...

想打开heic文件,首先要做的是把图片格式转换成电脑可以查看的,电脑可以查看的形式也并非很单一,比如jpg/bmp/png,这些都是比较常用的格式,首先heic图片是苹果手机独有的图片格式,电脑上或者其他设备是无法打…

beaninfo详解源码解析 java_Java后端精选技术:源码解析Spring Cloud Zuul

Zuul 架构图在zuul中, 整个请求的过程是这样的,首先将请求给zuulservlet处理,zuulservlet中有一个zuulRunner对象,该对象中初始化了RequestContext:作为存储整个请求的一些数据,并被所有的zuulfilter共享。…

一加到1亿。C语言_可能是今年最难选的2部手机:小米10详细对比一加8T

原标题:可能是今年最难选的2部手机:小米10详细对比一加8T在智能手机行业里流传着这样一句话:旗舰处理器只能决定一款机型的下限,而不能决定它的上限;决定一款机型上限的是旗舰处理器之外的屏幕、拍照、UI等等。这句话放…

html5 webrtc fir 请求关键帧_中信建投官网强调认可我们的投资理念的股民朋友请求 CTRL D 收藏、锁定本直播地址...

本文摘要:有关中信建投官网强调认可我们的投资理念的股民朋友请求 CTRL D 收藏、锁定本直播地址的内容分享,跟踪了解如何看股票k线图,分享热点专题。欢迎来到 橘子股票直播间,本直播每日为大家更新最快、最精准、最全面的股市内容…

打印完全二叉树java_java 完全二叉树的构建与四种遍历方法示例

本来就是基础知识,不能丢的太干净,今天竟然花了那么长的时间才写出来,记一下。有如下的一颗完全二叉树:先序遍历结果应该为:1 2 4 5 3 6 7中序遍历结果应该为:4 2 5 1 6 3 7后序遍历结果应该为…

模拟 http connecttimeout_燃烧室数学模型模拟软件NPSS

燃烧室的各个结构都可以被建立数学模型用矩阵进行模拟计算,每个模型都由输入、定义各部件的参数以及输出组成。流体在系统中某个点的状态可以由速率、压力、温度和构成(例如铝粉和氢气的质量比例)等参数描述。由于各个参数之间存在反馈环路,导致输入和输…

两个时间点距离 time_t c_天津二建公路考试时间

天津二建公路考试时间 Vadg42d天津二建公路考试时间 预警体系通过预警分析和预控对策实现事故的预警和控制,预警分析完成监测、识别、诊断与评价功能,而预控对策完成对事故征兆的不良趋势进行纠错和治错的功能。技术方案现金流量表主要有投资现金流量表&…

java 168转换成861_java实验-java语言面向对象编程基础

java实验-java语言面向对象编程基础 (12页)本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!8.90 积分广州大学学生实验报告广州大学学生实验报告开课学院及实验室:开课学院及实验室&#xf…

c#养老院老人信息管理系统源码 论文_辽宁吃的好的社区养老院位置,爱心养老院_抚顺市望花区社会养老中心...

首页 > 新闻中心发布时间:2020-11-09 02:11:16 导读:抚顺市望花区社会养老中心为您提供辽宁吃的好的社区养老院位置,爱心养老院的相关知识与详情: 老人早晨气场后手指经常发硬,无法自己握拳。 老人关节活动不方便,活…