现在的位置: 首页 > 综合 > 正文

socket学习之服务端图形界面

2012年10月10日 ⁄ 综合 ⁄ 共 3562字 ⁄ 字号 评论关闭

前两天在赶潮流玩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就不贴了,上次已经贴过了,只是改成了一个线程类。很糙,也先记着吧,古人说:不积跬步,无以至千里,不积小流,无以成江海。记着总是好的,实在没用,以后也能留个念想。

 

抱歉!评论已关闭.