前两天在赶潮流玩socket,打通了android到pc通信的任督二脉,弄了个很丑的东东----手机控制电脑关机开机获取截图的东东。虽然很丑,但是正如人们说的,自己的东西,就跟崽一样,再丑也喜欢的,所以继续玩。
在想如果服务端是个图形界面那是不是要好些,能看到一些日志信息和控制连接等功能的一个图形界面,于是今天捣腾一下。闲言少叙,上代码才是正经。
还是先上图片吧:
其实很简单,上次的server就是一个超简单的class,现在把这个class放到线程中去,先启动图形界面,然后通过输入port然后再按同能键去开启线程。
先看入口:
MyFrameMain.java:
package com.xluo.SViews;
import java.awt.EventQueue;
import java.util.Queue;
import javax.swing.JFrame;
public class MyFrameMain {
public static void main(String[] args){
EventQueue.invokeLater(new Runnable(){
public void run(){
MyFrame mf = new MyFrame(); //实例化JFrame图形框架
mf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭方式,这个没有好像也行,不过大家都这麽做,我也这麽做了
mf.setVisible(true); //这个是什么功能就不说了
mf.setBounds(400, 400, 500, 500);//图形窗口的位置,前两个参数分别是图形离显示器屏幕左上角的x和y坐标,后两个参数是图形的大小宽和高
}
});
}
}
入口就这些,接着来看继承JFrame的MyFrame.java文件
MyFrame.java:
package com.xluo.SViews;
import java.awt.*;
import java.awt.event.*;
import java.net.InetAddress;
import java.net.UnknownHostException;
import javax.swing.*;
class MyFrame extends JFrame
{
/**
*
*/
private static final long serialVersionUID = 1L;
private StartServer SServer;
private String myaddr = null;
private static boolean isServerStart = false; //服务器状态判断
private final JTextArea textArea = new JTextArea(8,50);
public MyFrame(){
setTitle("PhoneServer");
final JTextField textField = new JTextField();
JPanel MyPanel = new JPanel();
MyPanel.setLayout(new GridLayout());
MyPanel.add(new JLabel(" 端口号设置:",SwingConstants.LEFT));
MyPanel.add(textField);
add(MyPanel,BorderLayout.NORTH);
JScrollPane scrollPane = new JScrollPane(textArea);
add(scrollPane,BorderLayout.CENTER);
JPanel southPanel = new JPanel();
final JButton insertButton = new JButton("启动服务");
final JButton stopButton = new JButton("停止服务");
southPanel.add(insertButton);
southPanel.add(stopButton);
try {
myaddr = getWinLocalIp(); //获取机器ip
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
DisplayIpAddressInfo();//把ip显示在日志栏
insertButton.addActionListener(new ActionListener() //开启服务器的按钮监听器
{
public void actionPerformed(ActionEvent event)
{
String textPort = textField.getText();
boolean result=textPort.matches("[0-9]+"); //端口号是否为数字
if(textPort.length() <= 0){
textArea.append("服务器端口不能为空!");
}else if(!result){
textArea.append("端口号必须为数字");
}else{
SServer = new StartServer(textArea,Integer.parseInt(textPort)); //准备开启服务,把日志板传给StartServer,跟踪服务开启过程
if(!isServerStart){
textArea.append("端口号为:"+textPort+"\n服务器启动中...\n");
insertButton.setEnabled(false);
SServer.start();
isServerStart = true;
}else{
textArea.append("\n服务器已开启\n");
}
}
}
});
stopButton.addActionListener(new ActionListener() //停止服务器的按钮监听器
{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(isServerStart){
if(SServer != null)
SServer.ServerClose(); //调用关闭ServerSocket函数
SServer.stop();//结束线程
isServerStart = false;
}
textArea.append("\n服务器已停止\n");
insertButton.setEnabled(true);
}
});
add(southPanel,BorderLayout.SOUTH);//把停止按钮贴到图形上
}
public JTextArea getTextArea(){
return this.textArea;
}
private static String getWinLocalIp() throws UnknownHostException{ //获取ip函数
InetAddress inet = InetAddress.getLocalHost();
String Address = inet.getHostAddress();
System.out.println("本机的ip=" + Address);
return Address;
}
private void DisplayIpAddressInfo(){ //显示ip函数
if(myaddr.length() <= 0){
textArea.append("获取本地IP失败!\n");
}else{
textArea.append("本机ip为:"+myaddr+"\n");
}
}
}
图形化的Server就算出来了,那个StartServer就不贴了,上次已经贴过了,只是改成了一个线程类。很糙,也先记着吧,古人说:不积跬步,无以至千里,不积小流,无以成江海。记着总是好的,实在没用,以后也能留个念想。