您的位置:首页 > 理论基础 > 计算机网络

GUI和网络联机测试小程序

2017-10-09 19:56 344 查看
问题

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();
}
}

}
}


最终实现界面



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  socket 网络 gui