Java实现 简单聊天软件
简单的聊天软件
//客户端 package yjd9;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*; public class MyClient extends JFrame implements ActionListener, Runnable { Socket clientSocket;
JTextArea jTextReceive = new JTextArea();
JTextField jTextSend = new JTextField();
JButton jbc = new JButton("发送");
JScrollPane jsp = new JScrollPane(jTextReceive);
boolean flag = true; //标记是否结束
Thread connenThread; //用于向服务器端发送信息
DataInputStream cin1;
DataOutputStream cout;
static boolean flagclient = false; public static void main(String[] args) {
new MyClient().clientStart();
} public synchronized void changeFlag(boolean t) {
flagclient = t;
} public void clientStart() {
try { //连接服务器端,这里使用本机
this.setTitle("客户端,端口号:8080");
this.setLayout(null);
this.setBounds(20, 00, 300, 300);
jsp.setBounds(20, 20, 220, 100);
jTextSend.setBounds(20, 120, 220, 50);
jbc.setBounds(20, 170, 220, 30);
this.add(jsp);
this.add(jTextSend);
this.add(jbc);
this.setVisible(true);
jbc.addActionListener(this);
clientSocket = new Socket("localhost", 8080);
jTextReceive.setText("连接已经建立完毕!\n");
while (flag) {
try (InputStream is = clientSocket.getInputStream()) {
cin1 = new DataInputStream(clientSocket.getInputStream());
try (OutputStream os = clientSocket.getOutputStream()) {
cout = new DataOutputStream(os);
connenThread = new Thread(this);
connenThread.start(); //启动线程,向服务器端发送信息
String aLine;
while (true) {
aLine = cin1.readUTF();
jTextReceive.append("服务器发来信息:" + aLine + "\n");
if (aLine.equals("bye")) {
flag = false;
connenThread.interrupt();
break;
}
}
cout.close();
}
cin1.close();
}
clientSocket.close(); //关闭Socket连接
System.exit(0);
}
} catch (Exception e) {
System.out.println(e);
}
} @Override
public void run() { while (true) {
try {
Thread.sleep(10);
} catch (InterruptedException ex) {
Logger.getLogger(MyClient.class.getName()).log(Level.SEVERE, null, ex);
}
try {
if (flagclient == true) { String str = jTextSend.getText().trim();
if(str==null||str.length()<=0){}
else{
jTextReceive.append("发送消息:" + str + "\n");
cout.writeUTF(str);
cout.flush();}
jTextSend.setText(null);
changeFlag(false);
} } catch (Exception e) {
System.out.println(e);
}
}
} @Override
public void actionPerformed(ActionEvent e) {
JButton jbt = (JButton) e.getSource();
if (jbt == jbc) //若单击确认对话框中的“发送”按钮
{
changeFlag(true);
}
}
} //服务器端 package yjd9; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*; public class Myserver extends JFrame implements ActionListener, Runnable {
JTextArea jTextReceive = new JTextArea();
JTextField jTextSend = new JTextField();
JButton jbs = new JButton("发送");
ServerSocket server = null;
JScrollPane jsp = new JScrollPane(jTextReceive);
Socket clientSocket; //负责当前线程中C/S通信中的Socket对象
boolean flag = true; //标记是否结束
Thread connenThread; //向客户端发送信息的线程
BufferedReader sin; //输入流对象
DataInputStream sin1;
DataOutputStream sout; //输出流对象
boolean flags = false; public static void main(String[] args) {
Myserver MS = new Myserver();
MS.serverStart();
}
public synchronized void changeFlag(boolean t){
flags=t;
} public void serverStart() {
try {
server = new ServerSocket(8080); //建立监听服务
this.setTitle("服务器端,端口号:" + server.getLocalPort());
this.setLayout(null);
this.setBounds(20, 00, 300, 300);
jsp.setBounds(20, 20, 220, 100);
jTextSend.setBounds(20, 120, 220, 50);
jbs.setBounds(20, 170, 220, 30);
this.add(jsp);
this.add(jTextSend);
this.add(jbs);
this.setVisible(true);
jbs.addActionListener(this);
while (flag) {
clientSocket = server.accept();
jTextReceive.setText("连接已经建立完毕!\n");
try (InputStream is = clientSocket.getInputStream()) {
sin = new BufferedReader(new InputStreamReader(is));
try (OutputStream os = clientSocket.getOutputStream()) {
sin1 = new DataInputStream(clientSocket.getInputStream());
sout = new DataOutputStream(os);
connenThread = new Thread(this);
connenThread.start(); //启动线程,向客户端发送信息
String aLine;
while(true){
aLine=sin1.readUTF();
jTextReceive.append("客户端发来信息:" +aLine+"\n");
if (aLine.equals("bye")) {
flag = false;
connenThread.interrupt();
break;
}
}
sout.close();
}
sin.close();
}
clientSocket.close(); //关闭Socket连接
System.exit(0); //程序运行结束
}
} catch (Exception e) {
System.out.println(e);
}
} @Override
public void run() {
while (true) {
try {
Thread.sleep(10);
} catch (InterruptedException ex) {
Logger.getLogger(Myserver.class.getName()).log(Level.SEVERE, null, ex);
}
try {
if (flags == true) {
changeFlag(false);
String str = jTextSend.getText().trim();
if(str==null||str.length()<=0){}
else{
sout.writeUTF(str);
sout.flush();
jTextReceive.append("服务器发送消息:"+str+"\n"); }
jTextSend.setText("");
} } catch (Exception e) {
System.out.println(e);
}
}
} @Override
public void finalize() //析构方法
{
try {
server.close();
} //停止ServerSocket服务
catch (IOException e) {
System.out.println(e);
}
} @Override
public void actionPerformed(ActionEvent e) {
JButton jbt = (JButton) e.getSource();
if (jbt == jbs) //若单击确认对话框中的“发送”按钮
{
changeFlag(true);
}
}
}
Java实现 简单聊天软件的更多相关文章
- WPF使用socket实现简单聊天软件
公司网络限制不能传文件,先贴部分代码 控件添加到界面就行,界面随意布局 项目结构: 1.解决方案 1.1. Client 1.2. Server Client: <Window x:Class= ...
- python练习四—简单的聊天软件
python最强大的是什么?库支持!!有了强大的库支持,一个简单的聊天软件实现就更简单了,本项目思路如下 # 项目思路 1. 服务器的工作 * 初始化服务器 * 新建一个聊天房间 * 维护一个已链接用 ...
- Java语言实现简单FTP软件------>FTP软件主界面的实现(四)
首先看一下该软件的整体代码框架 1.首先介绍程序的主入口FTPMain.java,采用了一个漂亮的外观风格 package com.oyp.ftp; im ...
- Java语言实现简单FTP软件------>源码放送(十三)
Java语言实现简单FTP软件------>FTP协议分析(一) Java语言实现简单FTP软件------>FTP软件效果图预览之下载功能(二) Java语言实现简单FTP软件----- ...
- Java语言实现简单FTP软件------>上传下载管理模块的实现(十一)
1.上传本地文件或文件夹到远程FTP服务器端的功能. 当用户在本地文件列表中选择想要上传的文件后,点击上传按钮,将本机上指定的文件上传到FTP服务器当前展现的目录,下图为上传子模块流程图 选择好要上传 ...
- Java continue break 制作简单聊天室程序,屏蔽不文明语言,显示每句话聊天时间 for(;;) SimpleDateFormat("yyyy-MM-dd hh:mm:ss") equalsIgnoreCase
package com.swift; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanne ...
- java web利用mvc结构实现简单聊天室功能
简单聊天室采用各种内部对象不适用数据库实现. 一个聊天室要实现的基本功能是: 1.用户登录进入聊天室, 2.用户发言 3.用户可以看见别人发言 刚才算是简单的需求分析了,现在就应该是进 ...
- 局域网聊天软件(winsocket)
LANChat工作整理 2013/8/22 程序实现功能: 局域网聊天软件,启动即可找到在线设备,并能够进行简单的文字聊天. 其实下面这个框图已经说明了程序的绝大部分功能原理. 核心类的程序框图 我觉 ...
- 高仿QQ即时聊天软件开发系列之三登录窗口用户选择下拉框
上一篇高仿QQ即时聊天软件开发系列之二登录窗口界面写了一个大概的布局和原理 这一篇详细说下拉框的实现原理 先上最终效果图 一开始其实只是想给下拉框加一个placeholder效果,让下拉框在未选择未输 ...
随机推荐
- HDUOJ---大菲波数
大菲波数 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- PyCharm 默认运行 unittest
若文件里面有某个函数名称或模块名称以test为前缀,Pycharm的话,就会自动认为是单元测试: 报错信息:test_file() missing 1 required positional argu ...
- Python练习笔记——利用递归求年龄,第五个比第四个大2岁...
现在有五个人, 第五个人比第四个人大两岁,18 第四个人比第三个人大两岁,16 第三个人比第二个人大两岁,14 第二个人比第一个人大两岁,12 第一个人现10岁, 10 ...
- pandas 筛选指定行或者列的数据
pandas主要的两个数据结构是:series(相当于一行或一列数据结构和DataFrame(相当于多行多列的一个表格数据机构). 原文:https://www.cnblogs.com/gangand ...
- 零基础学python》(第二版)
---恢复内容开始--- 零基础学python>(第二版) python学习手册 可以离线下载, .chn格式, 插入小幽默笑话,在学习累的时候看看笑话 放松一下 欢迎下载转载,请注明出处,谢 ...
- FAQ系列 | 如何保证主从复制数据一致性(转)
导读 MySQL主从复制环境中,如何才能保证主从数据的一致性呢? 关于主从复制 现在常用的MySQL高可用方案,十有八九是基于 MySQL的主从复制(replication)来设计的,包括常规的一主一 ...
- TreeMap升序|降序排列和按照value进行排序
TreeMap 升序|降序排列 import java.util.Comparator; import java.util.TreeMap; public class Main { public st ...
- 《Effective Java》读书笔记五(枚举和注解)
No30 用enum代替int常量 一:综述 int枚举模式,示范: // The int enum pattern - severely deficient! public static final ...
- 在 ASP.NET Web API 中,使用 命名空间(namespace) 来作为路由的参数
这个问题来源于我想在 Web API 中使用相同的控制器名称(Controller)在不同的命名空间下,但是 Web API 的默认 路由(Route) 机制是会忽略命名空间的不同的,如果这样做,会看 ...
- 网站的PV UV IP---网站常见软件性能
IP,衡量不同时间段的上网人数.00:00-24:00内相同的地址被计算一次.例:日300W IP,至少300W人访问PV,衡量页面受欢迎程度.每刷新一次,被记录一次(刷pv),网站被访问的页面的数量 ...