使用 socket 实现了服务端与多个客户端之间的双向通信

服务端

package exp;import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;public class ServerFrame extends Frame implements ActionListener{Panel pNorth, pSouth;Label portLabel, sayLabel;TextField portTf, sayTf;   Button startBtn, sayBtn;TextArea ta;Choice socketChoice = new Choice();static int clientNum = 0;ServerSocket serverSocket;HashMap<String, Socket> socketMap = new HashMap<String, Socket>();ServerListenThread serverListenThread = new ServerListenThread();ServerFrame(String name) {super(name);}void draw() {pNorth = new Panel();portLabel = new Label("Port:");           pNorth.add(portLabel);portTf = new TextField("8080", 60);        pNorth.add(portTf);startBtn = new Button("Start");           pNorth.add(startBtn);startBtn.addActionListener(this);this.add(pNorth, "North");ta = new TextArea(10, 80);this.add(ta, "Center");pSouth = new Panel();socketChoice.add("choose");                   pSouth.add(socketChoice);sayTf = new TextField("", 60);          pSouth.add(sayTf);sayBtn = new Button("Say");                pSouth.add(sayBtn);sayBtn.addActionListener(this);this.add(pSouth, "South");  this.setSize(650, 400);this.setVisible(true);}@Overridepublic void actionPerformed(ActionEvent e) {Object source = e.getSource();if (source == startBtn) {ServerListenThread t = new ServerListenThread();t.start();ta.append("Server is listening on port:" + portTf.getText() + "\n");startBtn.setEnabled(false);} else if (source == sayBtn){OutputStream output;try {String toClient = socketChoice.getSelectedItem();Socket socket = socketMap.get(toClient);OutputStream out = socket.getOutputStream();BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out, "GBK"));String msg = sayTf.getText();sayTf.setText("");ta.append("Server: " + msg + "\n");writer.write(msg);writer.newLine();writer.flush();               } catch (Exception e2) {e2.printStackTrace();}}}class ServerListenThread extends Thread {@Overridepublic void run() {try {int port = Integer.parseInt(portTf.getText());serverSocket = new ServerSocket(port);while(true) {Socket s =  serverSocket.accept();clientNum++;String clientName = "client-" + clientNum; ta.append(clientName + "connect\n");socketMap.put(clientName, s);socketChoice.add(clientName);ServerRecvThread t = new ServerRecvThread(s, clientNum);t.start();} } catch(Exception e) {e.printStackTrace();}}}class ServerRecvThread extends Thread {Socket s1;int num = 0;public ServerRecvThread(Socket s1, int num) {this.s1 = s1;this.num = num;}@Overridepublic void run (){InputStream in;try {in = s1.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(in, "GBK"));String msg = reader.readLine();ta.append("client-" + num + ": " + msg + "\n");} catch (IOException e) {e.printStackTrace();}}}public static void main(String[] args) {ServerFrame sf = new ServerFrame("服务端");sf.draw();}
}

客户端

package exp;import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;public class ClientFrame extends Frame implements ActionListener{Socket s;Panel pNorth, pSouth;TextField ipTf, portTf, sayTf;Label topLabel, ipLabel, portLabel, sayLabel;Button connectBtn, sayBtn;TextArea ta;Choice socketChoice;ClientFrame(String name) {super(name);}public static void main(String[] args) {ClientFrame cf = new ClientFrame("客户端");cf.draw();}void draw() {pNorth = new Panel();ipLabel = new Label("Server IP:");          pNorth.add(ipLabel);ipTf = new TextField("127.0.0.1", 20);       pNorth.add(ipTf);portLabel = new Label("Server Port: ");     pNorth.add(portLabel);portTf = new TextField("8080", 20);            pNorth.add(portTf);connectBtn = new Button("Connect");           pNorth.add(connectBtn);connectBtn.addActionListener(this);this.add(pNorth, "North");ta = new TextArea(10, 80);this.add(ta, "Center");pSouth = new Panel();sayLabel = new Label("Say:");                pSouth.add(sayLabel);sayTf = new TextField("", 64);              pSouth.add(sayTf);sayBtn = new Button("Say");                    pSouth.add(sayBtn);sayBtn.addActionListener(this);socketChoice = new Choice();             pSouth.add(socketChoice);this.add(pSouth, "South");this.pack();this.setSize(650, 400);this.setVisible(true);}@Overridepublic void actionPerformed(ActionEvent e) {Object source = e.getSource();if (source == connectBtn) {String ip = ipTf.getText();int port = Integer.parseInt(portTf.getText());try {s = new Socket(ip, port);ta.append("connect to the server..\n");ClientRecvThread t = new ClientRecvThread();t.start();} catch (Exception e2) {e2.printStackTrace();}connectBtn.setEnabled(false);} else if (source == sayBtn){try {OutputStream output = s.getOutputStream();BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output, "GBK"));String msg = sayTf.getText();sayTf.setText("");ta.append(msg + "\n");writer.write(msg);writer.newLine();writer.flush(); } catch (Exception e2) {e2.printStackTrace();}}}class ClientRecvThread extends Thread {@Override       public void run() {try {while(true) {InputStream input = s.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(input, "GBK"));String msg = br.readLine();ta.append("Server: " + msg + "\n");   }} catch (Exception e) {e.printStackTrace();}}  }
}

基于GUI的网络通信程序设计(Java)相关推荐

  1. 合肥工业大学宣城校区Java技术实验二 基于GUI的网络通信程序设计

    一.实验目的 1.掌握Java中GUI程序的编写,包括事件监听机制. 2.掌握Java的网络通信编程,ServerSocket,Socket类的使用. 3.掌握Java中多线程的编程,Thread类, ...

  2. Java基于GUI的网络通信程序设计【电竞杜小帅】

    1.设计一个基于GUI的客户-服务器的通信应用程序,如图1,图2所示. 图1 Socket通信服务器端界面 图2 Socket通信客户端界面 2.图1为Socket通信服务器端界面,点击该界面中的[S ...

  3. 【Java】基于GUI的网络通信程序设计

    目录 一. 程序内容 二. 要求分析 三. 程序编写 0. 程序结构 1. 服务端程序的GUI设计 2. 服务端业务逻辑的编写 3. 为GUI界面绑定按钮事件 4. 将服务端的源码复制后,进行重构,并 ...

  4. 基于GUI的网络通信设计

    一.实验目的 ​ 1.掌握Java中GUI程序的编写,包括事件监听机制. ​ 2.掌握Java的网络通信编程,ServerSocket,Socket类的使用. ​ 3.掌握Java中多线程的编程,Th ...

  5. 实验三 基于GUI的文件管理器——Java实现

    一.实验目的 运用面向对象程序设计思想,基于Java文件管理和I/O框架,实现基于图形界面的GUI文件管理器. 二.实验项目内容 1.实现文件夹创建.删除.进入. 2.实现当前文件夹下的内容罗列. 3 ...

  6. 【JAVA小游戏+水果售卖系统】基于GUI界面编程的水果“人生”模拟系统

    [JAVA]基于GUI界面编程的水果"人生"模拟系统 一.系统主要功能及简介 二.系统体系结构 三.系统设计技术 四.编码说明 五.效果展示 一.系统主要功能及简介 该系统以JAV ...

  7. 【Java】《面向对象程序设计——Java语言》Castle代码修改整理

    前言 最近闲来无事刷刷MOOC,找到以前看的浙大翁凯老师的<面向对象程序设计--Java语言>课程,重新过一遍仍觉受益颇深. 其中有一个Castle的例子,思路很Nice但代码很烂,翁凯老 ...

  8. 基于安卓的高校程序设计类课程考核平台的设计与实现

    1.课题研究立项依据 随着现代网络技术发展不断的提高,我们要对基于安卓的高校程序设计类课程考核平台的要求也不断提高,在快速提高的发展道路上,我们将要对从中产生的问题进行整理,实施对应需求的发展和系统开 ...

  9. 基于GUI的学生成绩管理系统

    基于GUI的学生成绩管理系统 一.项目背景 二.项目要求 三.前期准备 1.软硬件平台 2. MySQL驱动 四.核心类介绍 1.Student类 2.UserInterface类 2.1.变量定义 ...

最新文章

  1. 区块链核心技术:委任权益证明算法DPoS
  2. 处理unsigned相减错误(BIGINT UNSIGNED value is out of range)
  3. 编程技巧:使用异或操作符(XOR)交换两数值
  4. 非常精简的Linux线程池实现(一)——使用互斥锁和条件变量
  5. c 连接mysql示例 源码_MySQL 连接
  6. java 封装(Encapsulation)
  7. c++ mat赋值_Mat 的几种初始化和赋值方法
  8. 学术研究 | 仅仅因为方法 Too Simple 就被拒稿,合理吗?
  9. java base server 状态_SQL Server:数据库陷入“恢复”状态 - SQL Server: Database stuck in “Restoring” state...
  10. 软件著作权算法软件设计说明书_软件著作权设计说明书模板.docx
  11. PSP看电视软件测试,实战测试:PSP上运行Windows 95
  12. 电子统计台账:中文标记月度流水账格式数据的转换,以及过滤模板的普遍适配性
  13. The following method did not exist:com.google.gson.GsonBuilder.setLenient()
  14. PythonC++相互混合调用编程全面实战-24QT按钮事件的Open槽函数中调用python函数
  15. uva 10158 - War(并查集)
  16. 生物在计算机应用,生物技术在计算机领域中的应用有哪些
  17. 自动化测试环境搭建之RFS自动化测试框架全攻略
  18. php雅思老师,雅思口语话题:最喜欢的老师
  19. root用户无法打开xclock_SecureCRT使用图形程序故障(root用户su登录oracle用户)
  20. MongoDB教程(一):MongoDB云服务免费开通

热门文章

  1. 十步学习 Redis 分布式锁
  2. 服务器怎么远程连接控制
  3. 申请美国访问学者不可忽略的问题
  4. 转转二手手机,闲置物品的高效流转
  5. UML中聚集(Aggregation)与组合(Composition)的区别
  6. 鸿蒙和ios流畅对比,华为鸿蒙OS与苹果iOS测试,谁更流畅,真实对比大家看一下...
  7. cv图像翻转_OpenCV 图像反转
  8. 为了生活佘家抛妻子一路向西
  9. 初创公司参与美军AI项目遇黑客 前员工爆料军事技术或遭泄漏
  10. 传播智客学习笔记--L25 添加多个Activity