Java 简易版 TCP(一对一)聊天

客户端

import java.io.*;
import java.net.Socket;
import java.util.Date;
import javax.swing.*;public class MyClient {private JFrame jf;private JButton jBsend;private JTextArea jTAcontent;private JTextField jText;private JLabel JLcontent;private Date data;private JPanel jPanel;JScrollPane scroll;MyClient(){jf=new JFrame("客户端");jBsend =new JButton("发送");jTAcontent =new JTextArea(13,40);jText =new JTextField(12);scroll=new JScrollPane(jTAcontent,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); //文本区添加竖直滑动条JLcontent=new JLabel("聊天记录");jPanel=new JPanel();}public void Win(){Box boxVBox=Box.createVerticalBox();boxVBox.add(JLcontent);boxVBox.add(Box.createVerticalStrut(5));boxVBox.add(scroll);boxVBox.add(Box.createVerticalStrut(10));boxVBox.add(jText);boxVBox.add(Box.createVerticalStrut(10));boxVBox.add(jBsend);boxVBox.add(Box.createVerticalStrut(10));jPanel.add(boxVBox);jf.add(jPanel);jf.setSize(600, 400);jf.setResizable(false);jf.setLocationRelativeTo(null);jf.setVisible(true);jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public void Connect() throws Exception{Socket sk= new Socket("127.0.0.1",1200);jBsend.addActionListener(e->{ //Lambda表达式实现点击按钮发送信息   String str=jText.getText(); //获取文本框内容if (str.matches("\\s+") || str.equals("")) {JOptionPane.showMessageDialog(jf, "不可发送空白内容");return;}try {jTAcontent.append("我:"+str+"\n"); //文本区添加文本框内容BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(sk.getOutputStream())); //字符流发送信息bw.write(str); //发送文本框的信息给对方bw.newLine(); //发送后换行bw.flush(); //立即发送//不用bw.close(),为了可以一直发送信息jText.setText("");} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}new Thread(()->{ //Lambda表达式创建线程while(true){ //死循环随时接受信息try {BufferedReader br=new BufferedReader(new InputStreamReader(sk.getInputStream())); //以字符流接受信息String read = br.readLine(); //一行一行接受信息jTAcontent.append("客服:"+read+"\n");} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}}).start(); //开启线程});}public static void main(String[] args) throws Exception {MyClient client=new MyClient();client.Win();client.Connect();}
}

服务端

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import javax.swing.*;public class MyServer {//以下是聊天窗口的实现,上一篇文章有说过,不必多说private JFrame jf;private JButton jBsend;private JTextArea jTAcontent;private JTextField jText;private JLabel JLcontent;private Date data;private JPanel jPanel;private JScrollPane scroll;MyServer() { jf = new JFrame("服务端");jBsend = new JButton("发送");jTAcontent = new JTextArea(13, 40);jText = new JTextField(12);scroll = new JScrollPane(jTAcontent, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); //文本区添加竖直滑动条JLcontent = new JLabel("聊天记录");jPanel = new JPanel();}public void Win() {Box boxVBox = Box.createVerticalBox(); //这里应用了垂直盒式布局模式排列组件boxVBox.add(JLcontent);boxVBox.add(Box.createVerticalStrut(5));boxVBox.add(scroll);boxVBox.add(Box.createVerticalStrut(10));boxVBox.add(jText);boxVBox.add(Box.createVerticalStrut(10));boxVBox.add(jBsend);boxVBox.add(Box.createVerticalStrut(10));jPanel.add(boxVBox);jf.add(jPanel);jf.setSize(600, 400);jf.setResizable(false);jf.setLocationRelativeTo(null);jf.setVisible(true);jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public void Connect() throws Exception {ServerSocket ss = new ServerSocket(1200);while (true) {Socket sk = ss.accept();jBsend.addActionListener(e -> { //按钮响应事件,实现点击按钮发送信息String str = jText.getText(); //获取文本框的内容try {jTAcontent.append("我:" + str + "\n");BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sk.getOutputStream())); //以字符流发送信息bw.write(str); //将文本框内容发送给对方bw.newLine(); //发送后换行bw.flush(); //立即发送//不用bw.close(),为了可以一直发送信息} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}jText.setText("");});new Thread(() -> { //开启线程,这里是为了服务端可同时接收到多个客户端信息while (true) { //设置死循环,用于随时接受信息try {BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream())); //字符流方式接受信息String read = br.readLine(); //以字符串方式一行一行接受到信息jTAcontent.append("客户:" + read + "\n"); //将接收的信息写入文本区} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}}).start(); //用start开启线程}}public static void main(String[] args) throws Exception {MyServer server = new MyServer();server.Win();server.Connect();}
}

运行结果

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

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

相关文章

智能优化算法应用:基于跳蛛算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于跳蛛算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于跳蛛算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.跳蛛算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

springboot + thymeleaf + layui 初尝试

一、背景 公司运营的同事有个任务,提供一个数据文件给我,然后从数据库中找出对应的加密串再导出来给他。这个活不算是很难,但时不时就会有需求。 同事给我的文件有时是给excel表格,每一行有4列,逗号隔开,…

type property can‘t be changed 报错问题解决

问题 在使用 jQuery的 attr 方法对 input 输入框的 type 类型进行修改的时候报 type property can’t be changed 这个错误。 $psd.attr(type,text)原因 jQuery 的版本问题,当前使用的 jQuery 版本不允许修改 input 的 type属性所以报错。 解决方法 换原生 js …

2023_Spark_实验二十五:SparkStreaming读取Kafka数据源:使用Direct方式

SparkStreaming读取Kafka数据源:使用Direct方式 一、前提工作 安装了zookeeper 安装了Kafka 实验环境:kafka zookeeper spark 实验流程 二、实验内容 实验要求:实现的从kafka读取实现wordcount程序 启动zookeeper zk.sh start# zk.sh…

【面试经典150 | 二叉树】对称二叉树

文章目录 写在前面Tag题目来源解题思路方法一:递归方法二:迭代 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对于本题涉及到的…

云计算在数字营销中的作用是什么?

营销策略和云计算是一个为企业提供多种优势的系统。它使他们能够取得更大的成功,同时提高产量。这样做的原因是,可以从任何位置远程使用云集成工具和应用程序。基本上,该系统增强了存储设备和传播。同时,它减轻了公司 IT 网络的压…

上网行为审计软件丨紧盯小毛病,堵住大漏洞,守好钱袋子

上网行为审计软件是一种专门用于监控和分析员工或学生在计算机网络上的行为的软件。它可以帮助企业和家庭了解员工或学生的网络使用情况,发现和防止潜在的安全风险,提高工作效率和保护企业信息安全。 域之盾软件---上网行为审计系统的作用: …

排序-插入排序与希尔排序

文章目录 一、插入排序二、希尔排序 一、插入排序 思路: 当插入第i(i>1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将…

导入自定义模块出现红色波浪线,但是能正常执行

问题描述: 导入自己定义的模块时,出现红色波浪线,可以继续执行 解决: 在存放当前执行文件的文件夹右键,然后将其设置为sources root即可 结果:

什么是Active Directory 中的复制

AD 复制使更新的AD信息在所有 DC 中可用,从最简单的意义上讲,复制是在一个 DC 上修改 AD 对象的概念,然后将其复制并在 AD 林的所有其他 DC 上可见。 AD 环境有许多实时发生的不断变化,这些更改必须在 AD 数据库中更新&#xff0…

十一、了解分布式计算

1、什么是(数据)计算? 2、分布式(数据)计算 (1)概念 顾名思义,分布式计算,即以分布式的形式完成数据的统计,得到需要的结果。 分布式数据计算,顾名思义,就是…