GUI和网络联机测试小程序
2017-10-09 19:56
344 查看
问题
最好
在本地创建GUI实现服务器和客户端的通信(本地服务器和客户端通信小程序)
GUI如何实现
问题:实现了一个GUI,但是没法用,点按钮什么反应都没有,输入了文字也不会有什么效果
通过事件监听机制实现自己想要的功能
问题:如果其中一个按钮中间代码实现需要使用循环来轮询以确定某个行为是否发生,那么就会无法再使用其他按钮
服务器端代码:
客户端代码:
最终实现界面
java.net函数库 缓冲区的使用 socket 多线程
最好
深入的理解TCP/IP等协议的原理
在本地创建GUI实现服务器和客户端的通信(本地服务器和客户端通信小程序)
GUI如何实现
客户端和服务器端一样的布局 先创建一个窗口 JFrame frame = new JFrame("服务器端"); 等于一个框架,可以往里面放东西,比如画板 再创建自己需要的面板(可能不止一个) JPanel panel01 = new JPanel(); JPanel panel02 = new JPanel(); JPanel panel03 = new JPanel(); 多个面板的布局可以用默认的布局管理器BorderLayout 添加组件 比如按钮,文本显示框,文本输入框 先初始化 将组件添加到面板上 最后使用布局管理器(可以自己再定义使用哪个)将面板放到一开始的框架上,设置大小,让窗口显示出来就行了
问题:实现了一个GUI,但是没法用,点按钮什么反应都没有,输入了文字也不会有什么效果
通过事件监听机制实现自己想要的功能
使用内部类,实现接口向组件注册,使组件可以实现相应的功能,而功能实现代码在内部类中实现
问题:如果其中一个按钮中间代码实现需要使用循环来轮询以确定某个行为是否发生,那么就会无法再使用其他按钮
使用多线程让不同的按钮实现不同的功能,在一个按钮工作时,依旧可以在文本框中输入文字并发送出去,也可以在文本框中显示文字 具体的线程的任务在使用Runnable接口的类中实现,具体在run()函数中
服务器端代码:
import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.io.Reader; import java.io.Writer; import java.net.ServerSocket; import java.net.Socket; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.ScrollPaneConstants; public class Stwifi { JButton wifiopen; JButton wificlose; JButton clientopen; JButton clientclose; JTextArea textArea01; JTextField textField01; ServerSocket serverSocket; PrintWriter writer; Socket socket; BufferedReader reader; InputStreamReader streamReader; public static void main(String[] args) { // TODO Auto-generated method stub Stwifi stwifi = new Stwifi(); stwifi.showGui(); } public void showGui() { JFrame frame = new JFrame("服务器端"); JPanel panel01 = new JPanel(); JPanel panel02 = new JPanel(); JPanel panel03 = new JPanel(); textField01 = new JTextField(); wificlose = new JButton("WifiClose"); wifiopen = new JButton("WifiOpen"); clientclose = new JButton("ClientClose"); clientopen = new JButton("ClientOpen"); textArea01 = new JTextArea(20, 20); textArea01.setLineWrap(true); //可以使用滚动条 //设置滚动条 JScrollPane scrollPane = new JScrollPane(textArea01); scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); //Font font =new Font("楷体", Font.BOLD + Font.ITALIC, 20); //textField01.setFont(font); textField01.setText("please input "); textField01.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { // TODO Auto-generated method stub //监听机制 //输入回车,发送数据 //System.out.println("already input"); writer.println(textField01.getText()); textArea01.append("Server_sent: "+textField01.getText()+"\n"); textField01.requestFocus(); writer.flush(); //String x = ; //writer.close(); } } ); wifiopen.addActionListener(new Myopen_wifi()); //如何只让按钮点击一次,直到关闭后才能再打开 clientopen.addActionListener(new Myopen_client()); clientclose.addActionListener(new Myclose_client()); panel01.setBackground(Color.PINK); panel01.setLayout(new BoxLayout(panel01, BoxLayout.Y_AXIS)); panel02.setBackground(Color.magenta); panel03.setBackground(Color.CYAN); panel01.add(wifiopen); panel01.add(wificlose); panel01.add(clientopen); panel01.add(clientclose); panel02.add(textField01); //panel03.add(textArea01); //加了滚动条就不用加这个了 panel03.add(scrollPane);//不能忘了加滚动条 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(BorderLayout.EAST, panel01); frame.getContentPane().add(BorderLayout.NORTH, panel02); frame.getContentPane().add(BorderLayout.CENTER, panel03); frame.setSize(600, 600); frame.setVisible(true); } class Myopen_wifi implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub textArea01.append("Wifi socket Open!\n"); } } class Clientget implements Runnable{ @Override public void run() { String message; // TODO Auto-generated method stub try { while((message =reader.readLine())!=null) { textArea01.append(message+"\n"); } } catch (Exception e2) { // TODO: handle exception System.out.println("发生异常.\n"); } } } class Myopen_client implements ActionListener{ //@SuppressWarnings("resource") @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub textArea01.append("server socket open ing!\n"); try { //@SuppressWarnings("resource") serverSocket = new ServerSocket(6699); Socket socket = serverSocket.accept(); streamReader = new InputStreamReader(socket.getInputStream()); reader = new BufferedReader(streamReader); writer = new PrintWriter(socket.getOutputStream()); Thread tserver = new Thread(new Clientget()); tserver.start(); textArea01.append("服务器已启动!\n"); } catch (Exception e2) { // TODO: handle exception System.out.println("发生异常.\n"); } } } 4000 class Myclose_client implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub try { serverSocket.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } } }
客户端代码:
import java.awt.BorderLayout; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.ScrollPaneConstants; public class Stclient { JButton opensocket; JButton closesocket; JTextArea textArea01; JTextField textField01; Socket socket; BufferedReader reader; InputStreamReader streamReader; PrintWriter writer; public static void main(String[] args) { // TODO Auto-generated method stub Stclient stclient = new Stclient(); stclient.showGui(); } public void showGui() { JFrame frame = new JFrame("客户端"); JPanel panel01 = new JPanel(); JPanel panel02 = new JPanel(); JPanel panel03 = new JPanel(); textField01 = new JTextField(); opensocket = new JButton("Open Socket"); closesocket = new JButton("Close Socket"); textArea01 = new JTextArea(20, 20); textArea01.setLineWrap(true); //可以使用滚动条 //设置滚动条 JScrollPane scrollPane = new JScrollPane(textArea01); scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); textField01.setText("sent to server "); textField01.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { // TODO Auto-generated method stub //监听机制 //输入回车,发送数据 //System.out.println("already input"); writer.println(textField01.getText()); textArea01.append("Client_sent: "+textField01.getText()+"\n"); textField01.requestFocus(); writer.flush(); } } ); opensocket.addActionListener(new Client_open()); closesocket.addActionListener(new Client_close()); panel01.add(opensocket); panel01.add(closesocket); panel02.add(textField01); panel01.setBackground(Color.PINK); panel01.setLayout(new BoxLayout(panel01, BoxLayout.Y_AXIS)); panel02.setBackground(Color.magenta); panel03.setBackground(Color.CYAN); //panel03.add(textArea01); //加了滚动条就不用加这个了 panel03.add(scrollPane);//不能忘了加滚动条 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(BorderLayout.EAST, panel01); frame.getContentPane().add(BorderLayout.NORTH, panel02); frame.getContentPane().add(BorderLayout.CENTER, panel03); frame.setSize(600, 600); frame.setVisible(true); } class GetFromServer implements Runnable{ @Override public void run() { String message; // TODO Auto-generated method stub try { while((message =reader.readLine())!=null) { textArea01.append("get from server : "+message+"\n"); } } catch (Exception e2) { // TODO: handle exception System.out.println("发生异常.\n"); } } } class Client_open implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub textArea01.append("Client Socket Open!\n"); try { socket = new Socket("127.0.0.1", 6699); streamReader = new InputStreamReader(socket.getInputStream()); reader = new BufferedReader(streamReader); writer = new PrintWriter(socket.getOutputStream()); Thread tclient = new Thread(new GetFromServer()); tclient.start(); } catch (Exception e2) { // TODO: handle exception textArea01.append("客户端socket创建失败!\n"); } } } class Client_close implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub try { socket.close(); textArea01.append("Client Socket Close Now!\n"); } catch (IOException e1) { // TODO Auto-generated catch block textArea01.append("关闭客户端socket失败!\n"); e1.printStackTrace(); } } } }
最终实现界面
相关文章推荐
- java编程_socket_套接字_网络编程_简易的GUI多线程聊天程序
- snmp++3.3.7在2013下编译成库,并测试例子程序(网络管理相关)
- android程序连接网络测试:连接失败的原因。
- NDK 下第一个boost asio 网络程序测试成功
- 网络121第2周实验——GUI图形用户界面的签到程序
- 首次测试android程序连接网络错误:java.net.unknownhostexception:unable to resolve host
- 基于UDP的单线程网络点对点数据包收发测试程序
- ios 为程序提供网络不好的环境测试(弱网)
- 利用批处理快速编译测试VC网络程序
- 虚拟机迁移过程中网络状况测试的测试程序
- UINIX 网络编程第一个获取服务器测试程序
- 基于UDP的多线程网络数据包收发测试程序
- Shell 脚本简记 -- 测试网络主机执行某段程序
- java SWING/GUI测试程序
- PB程序中如何测试网络连接是否中断?(实现Ping命令)
- 首次测试android程序连接网络错误:java.net.unknownhostexception:unable to resolve host
- javaEE程序.设置在网络快慢,或者不稳定的情况下,测试程序是否有bug的方法!
- 测试网络SNMP连接的几个方法(我平时调试SNMP程序时用到的几个解决方案)
- Eclipse中用两个控制台测试网络通信程序
- 模拟低速网络,测试iOS程序的表现