问个图形化echo程序的问题,搞不懂啊

回炉重造,学习编程中。。。 回炉重造,学习编程中。。。 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
做《java开发实战经典》后面的练习题:将Echo程序进行扩充,通过图形界面编写服务器和客户端,实现通过按钮控制服务器的启动与关闭,并使用界面发送和接收服务器的返回信息。

我现在做到的界面是这样的:

但是程序里面开启服务器端的语句只要加上,那个图形界面就不会出现,把它注释掉就可以出现了,搞不明白是哪里的问题了,eclipse里面也没任何错误提示什么的,麻烦各位给看看,初学,程序很烂,见笑见笑。


package xiti19;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import java.net.*;
import java.io.*;
class EchoServer{
private static ServerSocket svrSkt=null;
private Socket cltSkt=null;
private BufferedReader input=null; //输入流,来自客户端
private PrintStream output=null; //输出流,指向客户端
private JTextArea text = null;
public EchoServer(JTextArea serverText,int port){
text = serverText;
text.append("服务器代理正在监听,端口:"+port+"\n");
try{
svrSkt=new ServerSocket(port); //开始监听
}catch(IOException e){
text.append("监听端口"+port+"失败\n");}
try{
cltSkt=svrSkt.accept(); //接收连接请求
}catch(IOException e){
text.append("连接失败\n");}
try{
input=new BufferedReader(new InputStreamReader(cltSkt.getInputStream())); //获得输入流
output=new PrintStream(cltSkt.getOutputStream()); //获得输出流
}catch(IOException e){}
text.append("欢迎......\n");
}

public String getRequest(){
String frmClt=null;
try{
frmClt=input.readLine();
}catch(Exception e){
System.out.println("无法读取端口.....");
System.exit(0);
}
return frmClt;
}
public void sendResponse(String response){
try{
output.println("ECHO:"+response);
}catch(Exception e){
System.out.println("写端口失败......");
System.exit(0);
}
}
public static void CloseServer() throws Exception{
svrSkt.close();
}
}
class EchoClient{
private PrintStream ops; //输出流(指向服务器)
private BufferedReader ips;//输入流(来自服务器)
private JTextArea text = null;

public EchoClient(JTextArea clientText,String serverName,int port){
text = clientText;
try{
Socket clientSocket=new Socket(serverName,port); //根据服务器名和端口号建立Socket
ops=new PrintStream(clientSocket.getOutputStream());//获得Socket的输出流
ips=new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));//获得Socket的输入流
}catch(Exception e){
text.append("无法连接服务器!\n");
}
}
public void sendRequest(String request){
ops.println(request); //向Socket的输出流写入字符串
}
public String getResponse(){
String str=new String();
try{
str=ips.readLine(); //从Socket的输入流读入字符串
}catch(IOException e){} //必须捕获错误
return str;
}
}
public class XiTi19_1 {
public static void main(String args[]){
JFrame frame = new JFrame("ECHO图形界面");
final JButton startBut = new JButton("启动服务器");
final JButton stopBut = new JButton("停止服务器");
final JTextArea serverText = new JTextArea("服务器显示界面\n");
final JTextArea clientText = new JTextArea("客户端显示界面\n");
final JTextField inputField = new JTextField("这里输入信息",20);
final JButton sendBut = new JButton("发送");
//final EchoServer sa = new EchoServer(serverText,8888);
final EchoClient ca = new EchoClient(clientText,"localhost",8888);
JScrollPane scrServer = new JScrollPane(serverText,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
JScrollPane scrClient = new JScrollPane(clientText,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
GridBagLayout gr = new GridBagLayout();
GridBagConstraints gc = new GridBagConstraints(); //创建一个名为gc的约束对象
frame.setLayout(gr); //将容器的布局设为GridBagLayout
gc.weighty =4;
gc.fill = GridBagConstraints.BOTH;
gc.gridwidth = GridBagConstraints.REMAINDER;//设置gridwidth参数的值为REMAINDER这样在后面使用该约束的组件将是该行的最后一个组件。
gr.setConstraints(scrServer, gc);
GridBagConstraints gc3 = new GridBagConstraints();
gc3.weighty =1;
gc3.weightx =3;
gr.setConstraints(startBut, gc3);
gc3.gridwidth = GridBagConstraints.REMAINDER;
gr.setConstraints(stopBut, gc3);
GridBagConstraints gc1 = new GridBagConstraints();
gc1.weightx = 8;
gc1.weighty = 1;
gr.setConstraints(inputField, gc1);
gc1.gridwidth = GridBagConstraints.REMAINDER;
gc1.weightx = 2;
gr.setConstraints(sendBut, gc1);
GridBagConstraints gc2 = new GridBagConstraints();
gc2.weighty = 4;
gc2.fill = GridBagConstraints.BOTH;
gc2.gridwidth = GridBagConstraints.REMAINDER;
gr.setConstraints(scrClient, gc2);

startBut.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0){
if(arg0.getSource()==startBut){
try {
while(true){
sa.sendResponse(sa.getRequest());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
stopBut.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0){
if(arg0.getSource()==stopBut){
try {
EchoServer.CloseServer();
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
sendBut.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0){
if(arg0.getSource()==sendBut){
try {
ca.sendRequest(inputField.getText()); //发送文本框中的文本
clientText.append("\n"+ca.getResponse()); //接收服务器回应并写入文本域
} catch (Exception e) {
e.printStackTrace();
}
}
}
});

frame.add(scrServer);
frame.add(startBut);
frame.add(stopBut);
frame.add(inputField);
frame.add(sendBut);
frame.add(scrClient);
frame.setSize(400,400);
frame.setLocation(300,200);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}
}


//final EchoServer sa = new EchoServer(serverText,8888);就这一句,如果不注释就不会出现图形界面,注释了可以出现,但服务器相当于没有启动,没法往下测试了,看了半天也不知道那有问题了,请大家帮忙,谢谢!
...全文

相关推荐

利用图形化界面软件来备份Linux系统的方法

本文将详细介绍一种利用图形化界面软件备份Linux系统的方法,特别推荐使用Acronis True Image Echo Enterprise Server这款强大的备份工具。

qq420100523

用Jpcap和Java实现图形化的Ping程序.pdf

使用Jpcap和Java实现图形化的Ping程序要实现一个图形化的Ping程序,可以按照以下步骤进行:1. **环境搭建**:首先确保已经安装了Java环境和Jpcap库。2.

zrllzy1205

Solaris 10安装VNC图形化桌面

usr/X11/bin:/usr/openwin/bin然后,使用 source 命令使环境变量生效:bash-3.00# source /etc/profile确认变量是否生效:bash-3.00# echo

小胡子_2017

利用图形化界面软件来备份Linux系统的方法资料.doc

图形化界面软件备份Linux系统的方法Linux操作系统以其高可靠性著称,但在当今复杂的互联网环境下,安全问题不容忽视。系统备份成为了系统管理员的首要任务。

GeniusID

基于C++的图形化Ping网络诊断工具设计与实现

在决定动手前,我们得先回答一个问题:C++里做GUI,到底选哪个框架最合适?市面上常见的选择不少:wxWidgets:号称“原生外观”,调用系统控件,视觉上最贴近操作系统风格。但它对现代UI的支持有限,动画和样式定制远不如Qt灵活。GTK+:Linux桌面的宠儿,Gnome系应用基本都用它。但在Windows上显得格格不入,而且C++绑定不够自然。FLTK:轻量级之王,编译出来的二进制文件小得惊人。适合嵌入式或资源极度受限的环境,但功能太简陋,做复杂交互几乎不可能。

又可乐
评论 8
收藏 已收藏
分享
返回顶部