这几天做了一个基于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相关推荐

  1. java socket 阻塞模式_Java中Socket Read阻塞问题

    本人来说并不熟悉JAVA语言,只是近期在分析某个简单的java agent程序时,根据对应的代码写了一个对接的程序,两者之间是典型的C/S socket编程.客户端在向服务端发送相应的指令后,服务端( ...

  2. java socket调用接口_Java中socket接口调用

    最近一个项目中接口通讯这一块主要是调用银联系统的socket接口,我方是客户端,即发送请求接收返回报文的一方.在贴代码之前,还是要了解一下关于socket的基础知识. Socket的基本概念 1.建立 ...

  3. Linux Socket 两个客户端通信,服务端作为中转

    Socket 两个客户端通信,服务端作为中转 Socket两个客户端通信,服务端作为中转,通过sockket的通信原理,简单的做了一个以c语言写的服务端,与自己制作的Android app 与树莓派为 ...

  4. TCP:利用Socket编程技术实现客户端向服务端上传一个图片。

    问题: 利用Socket编程技术实现客户端向服务端上传一个图片的程序. 客户端: import java.io.*; import java.net.Socket;public class clien ...

  5. Python基于socket实现的多任务版TCP服务端

    ''' 基于socket实现的多任务版TCP服务端 ''' import socket import threadingdef client_task(client_socket,ip_port):p ...

  6. QT中使用C++ socket通信(了解socket通信、socket的三次握手和四次挥手、socket函数说明、客户端与服务端的代码实例)

    一.TCP/IP协议四个抽象层: 二.socket位置 socket就在应用程序的传输层和应用层之间,传输层的底一层的服务提供给socket抽象层,socket抽象层再提供给应用层. 三.socket ...

  7. android 仿微信demo————登录功能实现(服务端)

    android 仿微信demo----微信启动界面实现 android 仿微信demo----注册功能实现(移动端) android 仿微信demo----注册功能实现(服务端) android 仿微 ...

  8. java socket重连_Java客户端Socket在服务端重启后的异常情况处理

    碰到场景如下:Java服务器端A(使用NIO的异步IO方式),Java客户端B(使用普通IO的同步方式),在服务端A重启后,B->A的Socket毫无疑问的断了,然后就会出现一些异常情况,分析一 ...

  9. java Socket Tcp示例三则(服务端处理数据、上传文件)

    示例一: package cn.itcast.net.p5.tcptest; import java.io.BufferedReader; import java.io.IOException; im ...

最新文章

  1. javascript-数据类型,json与数组,获取非行间样式
  2. 注册修复动态链接库DLL文件
  3. mysql存储引擎innodb_MySQL常用存储引擎之Innodb
  4. 企业中的微服务:敌是友?
  5. [html] iframe在更改了src之后,不出现后退或者前进按钮怎么解决?
  6. PHP和MySQL Web开发pdf
  7. oracle的知识,oracle的基本知识
  8. 架构专家梁勇:哈啰在分布式消息治理和微服务治理中的实践
  9. 五子棋项目结束总结_五子棋编程思想小结
  10. python之绘制图形库turtle
  11. Android集成阿里云一键登录步骤
  12. IOS APP开发:苹果app从开发到上架教程详解
  13. python的DDT模块
  14. canvas 制作验证码
  15. IT企业做ISO20000 服务管理体系的好处
  16. modbus网关都有哪些特点,modbus网关的功能及作用
  17. 全自动绕线机系统绕线单元的设计
  18. Duplicate Alias Error When Deploying Planning Application From Epma 11.1.2 (Doc ID 1319989.1)
  19. Java 三种模型,四种策略
  20. WEB 漏洞-XXEXML 之利用检测绕过

热门文章

  1. 可能是世界上最简单的用 Go 来写 WebAssembly 的教程
  2. centos7 升级curl版本
  3. ElasticSearch学习,请先看这一篇(win_Elasticsearch)
  4. 大剑无锋----SpringMVC原理详细解析
  5. JVM详解之:类的加载链接和初始化
  6. Leet Code OJ 112. Path Sum [Difficulty: Easy]
  7. ES更新嵌套数组(使用Java API)
  8. Hadoop 底层原理介绍
  9. 洛谷——P1328 生活大爆炸版石头剪刀布
  10. 原生JS封装自己的AJAX