socket学习之服务端图形界面

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对您的问题,我可以给您提供以下思路: 1. 在服务端和客户端分别使用 Python 的 GUI 框架进行界面设计,比如 tkinter、PyQt、wxPython 等等。您可以选择其中一个您熟悉的框架进行使用。 2. 在服务端和客户端分别创建一个 socket 对象,并将其绑定到对应的 IP 地址和端口上。可以使用 Python 自带的 socket 模块来实现。 3. 服务端和客户端通过 socket 进行通信。在服务端接收到客户端发送的消息之后,将其显示在服务端界面上;在客户端接收到服务端发送的消息之后,将其显示在客户端的界面上。 具体实现的步骤如下: 1. 首先,在服务端的 GUI 界面上添加一个文本框,用于显示客户端发送的消息。在客户端的 GUI 界面上也添加一个文本框,用于显示服务端发送的消息。 2. 在服务端和客户端分别创建一个 socket 对象,并将其绑定到对应的 IP 地址和端口上。可以使用 Python 自带的 socket 模块来实现。比如在服务端可以这样实现: ```python import socket server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(('127.0.0.1', 8888)) server_socket.listen(5) ``` 在客户端可以这样实现: ```python import socket client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_socket.connect(('127.0.0.1', 8888)) ``` 3. 在服务端和客户端分别启动一个线程用于接收消息。比如在服务端可以这样实现: ```python import threading def recv_message(): while True: conn, addr = server_socket.accept() data = conn.recv(1024) text_box.insert(END, data.decode('utf-8')) ``` 在客户端可以这样实现: ```python def recv_message(): while True: data = client_socket.recv(1024) text_box.insert(END, data.decode('utf-8')) ``` 4. 在服务端和客户端分别添加一个文本框和一个按钮,用于输入消息和发送消息。比如在服务端可以这样实现: ```python text_box = Text(window) text_box.pack() input_box = Entry(window) input_box.pack() def send_message(): message = input_box.get() text_box.insert(END, message + '\n') conn.send(message.encode('utf-8')) send_button = Button(window, text='发送', command=send_message) send_button.pack() ``` 在客户端可以这样实现: ```python text_box = Text(window) text_box.pack() input_box = Entry(window) input_box.pack() def send_message(): message = input_box.get() text_box.insert(END, message + '\n') client_socket.send(message.encode('utf-8')) send_button = Button(window, text='发送', command=send_message) send_button.pack() ``` 这样,客户端和服务端就可以进行通信,并将消息显示在各自的 GUI 界面上了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值