java socket gui登录_java的socket服务端的GUI
这几天做了一个基于socket的宠物商店程序,其中服务端的图形化界面问题困扰了很久。今天终于解决,因此也对多线程有了更好的理解。
想很多新手一样,我其实犯了一个错误。
由于soket服务端端口监听用的是 while(true)循环导致,GUI点击开启服务后,主线程被阻塞在while(true)上,是GUI界面失效。
找到了问题所在,那么就用多线程解决。把监听端口放到线程里,这样就不会阻塞主线程画GUI界面。
由于没搞清楚 start()和run(),的区别,结果又出事了。在启动按钮事件里 直接调用了线程的run(),结果点击启动按钮后,GUI界面依然失效。
这就说明主线程依然被阻塞到while(true)里面了,为什么呢?
仔细研究发现run()方法并没有真正的触发线程,run只是调用的 线程中的实现,实际上,程序本身依然是单线程的。所以按钮调用run()依然会阻塞主线程。
将run()改为start()问题就解决了,start()是触发线程,真正的实现了多线程。这样接听端口的while()在副线程里,并不会阻塞主线程。这样GUI不会再
失效了。
这是修改后的代码:
package server;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class Server_GUI {
Server server = new Server();
JFrame jf = new JFrame("宠物店服务器V1.0");
private JTabbedPane tabs = new JTabbedPane();
private JTextField txt = new JTextField();
private JButton StartServer = new JButton("启动服务器");
private JButton StopServer = new JButton("关闭服务器");
private ButtonPanel managerPanel = new ButtonPanel("服务的开启与关闭",
new String[] {});
private ButtonPanel informationPanel = new ButtonPanel("服务的版本信息",
new String[] {});
private JPanel manager = new JPanel();// 管理面板
private JPanel information = new JPanel();// 版本面板
public void init() {
StartServer.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
JOptionPane.showMessageDialog(null, "服务已开启!", "服务启动",
JOptionPane.DEFAULT_OPTION);
server.start();
}
});
StopServer.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
JOptionPane.showMessageDialog(null, "服务已关闭!", "服务关闭",
JOptionPane.DEFAULT_OPTION);
System.exit(0);
}
});
// 管理界面
JPanel panel_1 = new JPanel();
panel_1.add(StartServer);
JPanel panel_2 = new JPanel();
panel_2.add(StopServer);
Box managertop = Box.createVerticalBox();
managertop.add(panel_1);
managertop.add(panel_2);
managerPanel.add(managertop);
manager.add(managerPanel);
tabs.add("管理界面", manager);
// 版本信息
JPanel panel4_1 = new JPanel();
JPanel panel4_2 = new JPanel();
JPanel panel4_3 = new JPanel();
JPanel panel4_4 = new JPanel();
JPanel panel4_5 = new JPanel();
JPanel panel4_7 = new JPanel();
JPanel panel4_9 = new JPanel();
Box topInformation = Box.createVerticalBox();
topInformation.add(panel4_1.add(new JLabel("宠物网络服务器端V1.0")));
topInformation.add(panel4_2.add(new JLabel("主要功能:")));
topInformation.add(panel4_3.add(new JLabel("宠物信息的增、删、改、查!")));
topInformation.add(panel4_5.add(new JLabel("宠物信息动态存储,服务器同步!")));
topInformation.add(panel4_4.add(new JLabel("2010届—网络15班")));
topInformation.add(panel4_7.add(new JLabel("姓名:仲强-学号:53101512")));
topInformation.add(panel4_9.add(new JLabel("2012年4月25日 QQ:6475005")));
informationPanel.add(topInformation);
information.add(informationPanel);
tabs.add("版本信息", information);
// tabs 页签选择监听器
tabs.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
if (tabs.getSelectedIndex() == 0) {
txt.setText("管理界面");
} else {
txt.setText("版本信息");
}
}
});
Container contentPane = jf.getContentPane();
contentPane.add(BorderLayout.SOUTH, txt);
contentPane.add(tabs);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.pack();
jf.setVisible(true);
}
@SuppressWarnings("serial")
class ButtonPanel extends JPanel {
private ButtonGroup group;
public ButtonPanel(String title, String[] options) {
setBorder(BorderFactory.createTitledBorder(
BorderFactory.createEtchedBorder(), title));
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
group = new ButtonGroup();
for (int i = 0; options != null && i < options.length; i++) {
JRadioButton b = new JRadioButton(options[i]);
b.setActionCommand(options[i]);
add(b);
group.add(b);
b.setSelected(i == 0);
}
}
// 定义一个方法,用于返回用户选择的选项
public String getSelection() {
return group.getSelection().getActionCommand();
}
}
public static void main(String[] args) {
File f = new File("users_pet");
if (!f.exists()) {
f.mkdirs();
}
new Server_GUI().init();
}
public class Server extends Thread {
@Override public void run() { ServerMain server = new ServerMain(); server.StartServer(); } } }
java socket gui登录_java的socket服务端的GUI相关推荐
- java socket 阻塞模式_Java中Socket Read阻塞问题
本人来说并不熟悉JAVA语言,只是近期在分析某个简单的java agent程序时,根据对应的代码写了一个对接的程序,两者之间是典型的C/S socket编程.客户端在向服务端发送相应的指令后,服务端( ...
- java socket调用接口_Java中socket接口调用
最近一个项目中接口通讯这一块主要是调用银联系统的socket接口,我方是客户端,即发送请求接收返回报文的一方.在贴代码之前,还是要了解一下关于socket的基础知识. Socket的基本概念 1.建立 ...
- Linux Socket 两个客户端通信,服务端作为中转
Socket 两个客户端通信,服务端作为中转 Socket两个客户端通信,服务端作为中转,通过sockket的通信原理,简单的做了一个以c语言写的服务端,与自己制作的Android app 与树莓派为 ...
- TCP:利用Socket编程技术实现客户端向服务端上传一个图片。
问题: 利用Socket编程技术实现客户端向服务端上传一个图片的程序. 客户端: import java.io.*; import java.net.Socket;public class clien ...
- Python基于socket实现的多任务版TCP服务端
''' 基于socket实现的多任务版TCP服务端 ''' import socket import threadingdef client_task(client_socket,ip_port):p ...
- QT中使用C++ socket通信(了解socket通信、socket的三次握手和四次挥手、socket函数说明、客户端与服务端的代码实例)
一.TCP/IP协议四个抽象层: 二.socket位置 socket就在应用程序的传输层和应用层之间,传输层的底一层的服务提供给socket抽象层,socket抽象层再提供给应用层. 三.socket ...
- android 仿微信demo————登录功能实现(服务端)
android 仿微信demo----微信启动界面实现 android 仿微信demo----注册功能实现(移动端) android 仿微信demo----注册功能实现(服务端) android 仿微 ...
- java socket重连_Java客户端Socket在服务端重启后的异常情况处理
碰到场景如下:Java服务器端A(使用NIO的异步IO方式),Java客户端B(使用普通IO的同步方式),在服务端A重启后,B->A的Socket毫无疑问的断了,然后就会出现一些异常情况,分析一 ...
- java Socket Tcp示例三则(服务端处理数据、上传文件)
示例一: package cn.itcast.net.p5.tcptest; import java.io.BufferedReader; import java.io.IOException; im ...
最新文章
- javascript-数据类型,json与数组,获取非行间样式
- 注册修复动态链接库DLL文件
- mysql存储引擎innodb_MySQL常用存储引擎之Innodb
- 企业中的微服务:敌是友?
- [html] iframe在更改了src之后,不出现后退或者前进按钮怎么解决?
- PHP和MySQL Web开发pdf
- oracle的知识,oracle的基本知识
- 架构专家梁勇:哈啰在分布式消息治理和微服务治理中的实践
- 五子棋项目结束总结_五子棋编程思想小结
- python之绘制图形库turtle
- Android集成阿里云一键登录步骤
- IOS APP开发:苹果app从开发到上架教程详解
- python的DDT模块
- canvas 制作验证码
- IT企业做ISO20000 服务管理体系的好处
- modbus网关都有哪些特点,modbus网关的功能及作用
- 全自动绕线机系统绕线单元的设计
- Duplicate Alias Error When Deploying Planning Application From Epma 11.1.2 (Doc ID 1319989.1)
- Java 三种模型,四种策略
- WEB 漏洞-XXEXML 之利用检测绕过