1.设计一个基于GUI的客户-服务器的通信应用程序,如图1,图2所示。

图1 Socket通信服务器端界面

图2 Socket通信客户端界面

2.图1为Socket通信服务器端界面,点击该界面中的【Start】按钮,启动服务器监听服务(在图1界面中间的多行文本区域显示“Server starting…”字样)。图2为Socket通信客户端界面,点击该界面中的【Connect】按钮与服务器建立链接,并在图2所示界面中间的多行文本区域显示“Connect to server…”字样,当服务器端监听到客户端的连接后,在图1界面中间的多行文本区域追加一行“Client connected…”字样,并与客户端建立Socket连接。

3.当图1所示的服务器端和图2所示的客户机端建立Socket连接后,编程实现服务端、客户端之间的“单向通信”:在客户端的输入界面发送消息,在服务端接收该消息,并将接收到对方的数据追加显示在多行文本框中。
上述实验内容的基础上,尝试实现“双向通信”功能,即服务端、客户端之间可以相互发送、接收消息。
首先应该
掌握Java的网络通信编程,ServerSocket,Socket类的使用(赶紧学习一波https://www.jianshu.com/p/cde27461c226)。
掌握Java中多线程的编程,Thread类,Runnable接口的使用(可看我写的Thread的介绍)。

主要思路


重点和难点在于服务端开启的监听和接收线程.
1.服务端的接口函数

1.1若点击start
开启监听线程(这里把一些花里胡哨的输出给删除了,先看懂原理然后自己想怎么加都行)
监听到的话便开启线程接受客户端的消息

1.2若点击sent
那么就给指定的客户端发送消息

客户端因为不需要监听多个,所以只需要开启接收和发送线程就行,保证在接收的能进行发送就行。原理跟客户端的大同小异。


好了到了上代码环节

客户端

public class Serverfarme implements ActionListener{ServerSocket server;Socket socket1;HashMap<String,Socket> myhashmap_keyst =new HashMap<String,Socket>();//有用给指定的客户端发消息HashMap<Socket,String>myhashmap_keysk =new HashMap<Socket,String>();//根据客户端的来确定它的名字static int socket_num=0;Frame myframe = new Frame("sever");Label lable1=new Label("port: ");Label label2=new Label("say: ");TextField tfport = new TextField(60);TextField tfsay=new TextField(60);Button btstart=new Button(" start ");Button btsay=new Button(" send ");Choice choice=new Choice();TextArea ta = new TextArea(8,60);Panel p1=new Panel();Panel p2=new Panel();void setmap() {//建立界面p1.add(lable1); p1.add(tfport); p1.add(btstart);choice.add("所有人");p2.add(choice); p2.add(label2); p2.add(tfsay); p2.add(btsay);myframe.add(p1,"North");myframe.add(p2,"South");myframe.add(ta,"Center");myframe.pack();myframe.setVisible(true);btstart.addActionListener(this);btsay.addActionListener(this);}
public static void main(String[] args){Serverfarme my=new Serverfarme();my.setmap();
}
@Overridepublic void actionPerformed(ActionEvent e) {//实现Button的接口Object source = e.getSource();if(source == btstart) {//如果点击start按钮则启动接受客户端并收听的线程listenreaderfirst st=new listenreaderfirst();st.start();}else{//点击发送按钮则启动发送线程socket1=myhashmap_keyst.get(choice.getSelectedItem());//确定发消息给哪个客户端listenwriter ww=new listenwriter(socket1);ww.start();}
}
class listenreaderfirst extends Thread{ @Overridepublic void run() {boolean flag =true;int post=Integer.parseInt(tfport.getText());try {server = new ServerSocket(post);ta.append("Server starting..."+'\n');while(flag) {//通过一直循环来等待客户端的连接socket1 = server.accept();socket_num++;ta.append("Client connected from :"+socket_num+'\n');String socketname="socket-"+socket_num;choice.add(socketname);//在下拉框中添加选项myhashmap_keyst.put(socketname, socket1);myhashmap_keysk.put(socket1, socketname);listenreader worker2=new listenreader(socket1);//读取客户端的信息worker2.start();}  } catch (IOException e) {e.printStackTrace();}}}
class listenreader extends Thread{//读取客户端的信息Socket s;
public listenreader(Socket s) {super();this.s = s;}@Overridepublic void run() {InputStream ir;try {ir = this.s.getInputStream();BufferedReader reader=new BufferedReader(new InputStreamReader(ir));String tem=reader.readLine();while(tem!=null) {String sname=myhashmap_keysk.get(s);ta.append(sname+": "+tem+'\n');tem=reader.readLine();}reader.close();} catch (IOException e) {e.printStackTrace();}
}
}
class listenwriter extends Thread{//向客户端发送信息
Socket s;
public listenwriter(Socket s) {super();this.s = s;}@Overridepublic void run() {OutputStream ioo;try {ioo = s.getOutputStream();BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(ioo));String ss=tfsay.getText();writer.write(ss);writer.newLine();writer.flush(); }catch (IOException e) {e.printStackTrace();}}}
}
客户端
public class Client implements ActionListener{Socket sr;Frame myframe = new Frame("Client");Label label1=new Label("port: ");Label label2=new Label("say: ");Label label3=new Label("IP: ");TextField tfport = new TextField(30);TextField tfsay=new TextField(60);TextField tfip = new TextField(30);Button btstart=new Button(" Connect ");Button btsay=new Button(" Send ");TextArea ta = new TextArea(8,60);Panel p1=new Panel();Panel p2=new Panel();void setmap() {p1.add(label3); p1.add(tfip); p1.add(label1); p1.add(tfport); p1.add(btstart);p2.add(label2); p2.add(tfsay); p2.add(btsay);myframe.add(p1,"North");myframe.add(p2,"South");myframe.add(ta,"Center");myframe.pack();myframe.setVisible(true);btstart.addActionListener(this);;btsay.addActionListener(this);}
public static void main(String[] args) {Client my=new Client();my.setmap();}@Overridepublic void actionPerformed(ActionEvent e) {Object source = e.getSource();String tem_IP ;int tem_Port ;if (source == btstart) {tem_IP = tfip.getText();tem_Port = Integer.parseInt(tfport.getText());try {sr = new Socket(tem_IP.trim(), tem_Port);ta.append("Connect to server…" + '\n');clientreader rr=new clientreader(sr);rr.start();}catch (IOException ioException) {ioException.printStackTrace();}} else {clientwriter wr=new clientwriter(sr);wr.start();}}class clientreader extends Thread{Socket s;public clientreader(Socket s) {super();this.s = s;}@Overridepublic void run() {InputStream in;try {in = s.getInputStream();BufferedReader reader=new BufferedReader(new InputStreamReader(in));String ss = null;ss=reader.readLine();while(ss!=null) {ta.append("Sever say: "+ss+'\n');ss=reader.readLine();ta.append(ss+'\n');}} catch (IOException e) {e.printStackTrace();}}}class clientwriter extends Thread{Socket s;public clientwriter(Socket s) {super();this.s = s;}@Overridepublic void run() {OutputStream op;try {op = s.getOutputStream();BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(op));String ss=tfsay.getText();writer.write(ss);writer.newLine();writer.flush();} catch (IOException e) {e.printStackTrace();}}}}



有没有很神奇???

Java基于GUI的网络通信程序设计【电竞杜小帅】相关推荐

  1. java货物进销管理系统【电竞杜小帅】

    1.程序首先打开并读取Inventory.txt中记录的所有库存记录,然后读取Transactions.txt,处理这个文件中包含的事务,记录发货记录到Shipping.txt,并记录错误信息到Err ...

  2. java Thread的介绍【电竞杜小帅】

    java中的线程 java中的线程操作封装在Thread,Runnable中. 通过Thread中的相应方法可以启动线程.停止线程 每个线程都必须有run()方法(即线程体) Thread通过调用st ...

  3. Vue的项目搭配以及实现页面跳转【电竞杜小帅】

    Vue的项目搭建 1.安装Node.js 下载Node.js,Node.js安装包及源码下载地址:https://nodejs.org/en/download,其他默认就行. 安装好了以后调出命令行输 ...

  4. Vue最low的路由嵌套【电竞杜小帅】

    1.首先创建一个vue的项目 如果不知道vue项目环境搭配可以看我上一篇博客链接: link 2.打开创建的vue项目 2.1在components包(也可以在其他地方创建vue文件等会会提到)下面创 ...

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

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

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

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

  7. 基于GUI的网络通信程序设计(Java)

    使用 socket 实现了服务端与多个客户端之间的双向通信 服务端 package exp;import java.awt.*; import java.awt.event.ActionEvent; ...

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

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

  9. Java基于GUI完成的猜数字小游戏

    猜数字小游戏 不废话想看看效果吧! 当我们答对后就会出现: 如果你实在急着想知道答案: 简要说明: 所猜测的数字为1~1000: 只能通过按确定输出答案,未设置Enter键直接输入的监控. 退出请直接 ...

最新文章

  1. php读取usb设备信息,急,请问如何获取USB设备的路径,非HID类型
  2. 【青铜打铁篇】Activiti 工作流从入门到入土?
  3. mysql5.7 部署文档-rpm
  4. 离线环境安装Django2.2(亲测)
  5. 使用SAP云平台portal service的site manager创建portal实例
  6. java int相除向上取整_Java基础篇——Java运算符
  7. ios Photos框架
  8. shell判断false_Linuxshell编程,这个命令if;then...。什么时候if条件判断为true和false呢?...
  9. 线程上下文类加载器(Thread Context ClassLoader)
  10. 程序员深度学习!mysql客户端工具免费绿色版
  11. 无人机倾斜摄影三维建模过程及方案
  12. 用devc++表白_表白墙第42期|别人深夜买醉,我只想买你的心
  13. 给定一个设备编号区间[start, end],包含4或18的编号都不能使用,如:418、148、718不能使用,108可用
  14. HBase学习(四) HBase API操作
  15. 小数的二进制与十进制转换
  16. 诈骗又出新套路,微信借钱语音确认仍被骗
  17. 中国电子学会2022年06月份青少年软件编程Python等级考试试卷二级真题(含答案)
  18. 步进电机与两线直流电机驱动
  19. Flink学习笔记(八):flink热词统计
  20. Python:实现decision tree决策树算法(附完整源码)

热门文章

  1. 6.2 阈值处理-- 自适应阈值处理和 阈值Otsu处理
  2. vue 一键复制粘贴文字功能
  3. 2021-07-11
  4. centos篇---安装mysql详细步骤
  5. 《查漏补缺》基础知识篇
  6. linux tc流量控制(一):classless qdisc
  7. 第2章 关系数据库(数据库系统概论)
  8. 数据库——第二章关系运算题整理
  9. win系统在虚拟机中启动黑屏的处理办法
  10. 数据结构——栈的基本操作