介绍

这是我自己学习Socket时写的,用到了多线程,Socket的知识,还有Java的IO技术,并且做了一个Java的UI,废话不多说,先上效果图

SendThread

这个类是用来实现数据的发送的,当按键按下时,会调用sendMessage方法

public class SendThread {ChatWindow chatWindow;private String remoteIP = "";private int port = 0;private String message = "";public SendThread(int port,ChatWindow window) {chatWindow = window;}public void notRun() {InetSocketAddress isa = new InetSocketAddress(remoteIP, port);try {Socket socket = new Socket();socket.connect(isa);OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream());writer.write(message);writer.flush();writer.close();System.out.println("将数据写入到流中");} catch (IOException e) {e.printStackTrace();}finally{message = "";}}public void senMessage(String host,int port,String message){remoteIP = host;this.port = port;this.message = message;notRun();}}

ReceiveThread

这个类实现的功能是维护一个阻塞线程,来对端口进行监听,接受收到的信息,每当收到信息时,都会显示。

public class ReceiveThread extends Thread {private ServerSocket server;private ChatWindow window;public ReceiveThread(ChatWindow window) {this.window = window;try {server = new ServerSocket(0);window.setLocalPort(server.getLocalPort());start();} catch (IOException e) {// TODO Auto-generated catch blockwindow.printError("连接出错");}}@Overridepublic void run() {// TODO Auto-generated method stubwhile(true){Socket socket;try {socket = server.accept();InputStreamReader reader = new InputStreamReader(socket.getInputStream());int c;StringBuilder sb = new StringBuilder();while((c = reader.read()) != -1){sb.append((char)c);}window.setReceive(sb.toString());} catch (IOException e) {// TODO Auto-generated catch blockSystem.out.println("线程将接受到的数据写入对话框出错");}}}
}

ChatWindow

这个类是UI的实现,通过绑定各个按钮的操作来实现别的功能

public class ChatWindow extends JFrame {private JButton sendButton;private JButton cancelButton;private JButton receiveButton;private JTextArea receiveText;private JTextField sendText;private JLabel localPort;private JTextField remoteAddress;private JTextField remotePort;private SendThread sendThread;private ReceiveThread receiveThread;private void GUIini(){Container c = this.getContentPane();c.setLayout(new BorderLayout());setSize(400, 500);//第一个panelJPanel panel1 = new JPanel(new GridLayout(4, 2));
//      JPanel panel1 = new JPanel(new (4, 2));panel1.setSize(400, 75);panel1.add(new JLabel("当前机器的IP地址是:"));try {panel1.add(new JLabel(InetAddress.getLocalHost().getHostAddress()));} catch (UnknownHostException e) {// TODO Auto-generated catch blockpanel1.add(new JLabel("当前机器的IP地址是:" + "Unknown"));}panel1.add(new JLabel("当前对话的端口是:"));panel1.add(localPort = new JLabel(""+0));panel1.add(new JLabel("Remote Host IP Address:"));remoteAddress = new JTextField();remoteAddress.setColumns(0);panel1.add(remoteAddress);panel1.add(new JLabel("Remote Host Port:"));remotePort = new JTextField();remotePort.setColumns(0);panel1.add(remotePort);c.add(panel1,BorderLayout.NORTH);//第二个panelJPanel panel2 = new JPanel(new FlowLayout(FlowLayout.LEADING));panel2.setSize(400,200);panel2.add(new JLabel("收到的内容"));receiveText = new JTextArea(15,30);receiveText.setEditable(false);receiveText.setAutoscrolls(true);JScrollPane jsp = new JScrollPane(receiveText);panel2.add(jsp);//第三个panel
//      JPanel panel3 = new JPanel(new GridLayout(2, 1));panel2.add(new JLabel("请输入发送的内容"));sendText = new JTextField(30);sendText.setAutoscrolls(true);panel2.add(sendText);c.add(panel2,BorderLayout.CENTER);//c.add(panel3);//第四个panelJPanel panel4 = new JPanel(new GridLayout(1, 0));panel4.setSize(400,20);receiveButton = new JButton("开始接受数据");sendButton = new JButton("发送");cancelButton = new JButton("取消");panel4.add(receiveButton);panel4.add(cancelButton);panel4.add(sendButton);c.add(panel4,BorderLayout.SOUTH);//四个面板内容设置完毕setVisible(true);setResizable(false);setDefaultCloseOperation(EXIT_ON_CLOSE);}private void ActionIni() {//键盘动作this.addKeyListener(new KeyListener() {@Overridepublic void keyTyped(KeyEvent e) {}@Overridepublic void keyReleased(KeyEvent e) {// TODO Auto-generated method stubif(e.getKeyCode() == KeyEvent.VK_ENTER){//发送文本sendThread.senMessage(remoteAddress.getText(), Integer.parseInt(remotePort.getText()), sendText.getText());receiveText.setText(receiveText.getText() + "\n" + "发送:" + sendText.getText());}}@Overridepublic void keyPressed(KeyEvent e) {// TODO Auto-generated method stub}});//取消按钮的动作cancelButton.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stubsendText.setText("");}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}});sendButton.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {//发送文本sendThread.senMessage(remoteAddress.getText(), Integer.parseInt(remotePort.getText()), sendText.getText());receiveText.setText(receiveText.getText()  + "发送:" + sendText.getText()+ "\n");}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}});}private void ThreadIni() {// TODO Auto-generated method stubsendThread = new SendThread(0, this);receiveThread = new ReceiveThread(this);}//构造函数public ChatWindow() {GUIini();ActionIni();ThreadIni();}public void printError(String err){System.out.println("Error occur:" + err);}//回调函数,用于接受从线程中返回的数据public void setReceive(String receive){receiveText.setText(receiveText.getText() + "收到:" + receive+ "\n" );}//当接受数据的线程开始工作以后,就调用该回调函数,设置当前聊天窗口使用的端口是哪个public void setLocalPort(int localPortText){localPort.setText(""+localPortText);}//放远,这个是整个程序的起点public static void main(String[] args) {// TODO Auto-generated method stubnew ChatWindow();}}

如何使用

将工程导入到Eclipse中以后,运行两次,因为这个程序不属于单例模式,所以可以出现两个窗口,在远程端口,远程地址那个输入框中分别输入另一个窗口中显示的IP和端口号,接下来在输入框中输入要发送的文字就可以了

源码下载

Java实现的一个简单聊天软件相关推荐

  1. 做简单的android 软件推荐,Android_适用于Android开发的简单聊天软件,适用于android 开发。是一个简 - phpStudy...

    适用于Android开发的简单聊天软件 适用于android 开发.是一个简单的聊天软件,包括知识点,各个控件的运用(ExpandableListView,ViewPager,Spinner,Line ...

  2. 『牛角书』HarmonyOS鸿蒙实战 开发一个简单聊天助手APP

    前言 我是通过b站上面老师的讲解,跟着老师编写了一个简单聊天助手app,简答实用,对于刚开始接触鸿蒙的我们来说很有帮助. 创建项目 所用软件为DevEco Studio,点击Create Harmon ...

  3. JAVA同时输入用户名和密码_用java模拟设计一个简单的“用户注册”程序。当用户输入用户名和密码时,单击“注...

    用java模拟设计一个简单的"用户注册"程序.当用户输入用户名和密码时,单击"注 2020 - 9 - 26 TAG : 所有功能均已实现,如有不满意的地方我再修改imp ...

  4. node.js入门 - 2.创建一个简单聊天室

    这篇文章将通过开发一个简单聊天室的方式,介绍node.js的net模块. 一.第一版,只向客户端发送信息   我们先实现一个简单的版本,代码如下: var net=require('net'); va ...

  5. JAVA编写的一个简单的Socket实现的HTTP响应服务器

    JAVA编写的一个简单的Socket实现的HTTP响应服务器,看后就很容易理解Web服务器的原理了. package test.io;import java.net.*; import java.io ...

  6. 用java设计实现一个简单的动作冒险类游戏

    用java设计实现一个简单的动作冒险类游戏 1.背景 这是java老师布置的本周作业,具体题目截图如下 2.分析 在UML图已经给出的前提下,此作业很容易.自己在此基础上,加了个简单的界面设计和玩家设 ...

  7. java设计游戏_用java设计实现一个简单的动作冒险类游戏

    用java设计实现一个简单的动作冒险类游戏 1.背景 这是java老师布置的本周作业,具体题目截图如下 2.分析 在UML图已经给出的前提下,此作业很容易.自己在此基础上,加了个简单的界面设计和玩家设 ...

  8. java Swing 做一个简单的输入文本框

    java Swing做一个简单的文本输入框, 新建一个SwingDemo类: // //java swing做一个简单的文本框 //Created by lee_1310 on 2019.03.29 ...

  9. 【亡羊补牢】计算机网络灵魂之问 第9期 如果让你做一个视频聊天软件,你用tcp还是udp?为什么?

    这是博主面向腾讯学习的面试题大整理系列,可以在如下github仓库Issues中通过 Labels 标签分类查看相关内容,同时欢迎大家指正可能的错误并且提出自己的解答,希望大家学的鱼块,春秋招顺利! ...

最新文章

  1. vlan和如何建立vlan和vconifg
  2. VA01创建SO的增强点MV45AFZZ的几点实际应用总结
  3. python apscheduler执行_python apscheduler 每两小时执行一次
  4. 人脸识别撞脸名画_艺术与时尚结合的极致——当服装设计遇到名画
  5. C++11 委托构造函数
  6. 学习资料收集:计算机系统基础
  7. 通用 PE 工具箱1.9.6(XP内核)by Uepon(李培聪)
  8. linux中fish脚本,FISH:Linux 下的一个智能易用的 Shell
  9. [渝粤教育] 西南科技大学 管理学原理 在线考试复习资料(6)
  10. 程序员写简历的注意事项
  11. 《星际穿越》科学解析
  12. T2-小度养小猫(贪心)
  13. 埃尼阿克计算机怎么运行的
  14. linux cat和vim区别,cat命令和vim存在着什么区别
  15. gre阅读passage71-105
  16. 数组算法之“前缀和”
  17. 十个Mac端设计软件
  18. java基础语法if语句、循环
  19. c++ 高精度 加减乘除 四则运算 代码实现
  20. 【人工智能】2028:AI创造了哪些工作?未来10年21个核心工作岗位 。

热门文章

  1. 20221122非累加的m3u8的ts切片列表的补全步骤
  2. 如何使用 javascript 获取语音数据并播放
  3. 西门子PLC(S7-1200、1500)通讯程序报16#80C8错误的解决方法
  4. 非参数估计-高斯核平滑Gaussian kernel smoothing-非参数密度估计
  5. 智能汽车创新发展战略--思维导图版
  6. java 地址_java地址收藏(持续更新中...)
  7. 推荐系统热门研究方向
  8. ISO14001环境管理体系认证所需材料
  9. java计算机毕业设计旅游信息分享网站MyBatis+系统+LW文档+源码+调试部署
  10. 银联支付api相关文档