这是服务端代码,没有问题,能把数据发过去,但是到了客户端数据却取不出来,什么原因。package reconserver;import java.io.*;
import java.net.*;
import java.util.*;
import javax.swing.*;
import java.awt.*;public class Ser {
ServerSocket socket=null;
Vector mthreads=new Vector();
Ser(){
try{
socket=new ServerSocket(8080);
}catch(Exception e){
JOptionPane.showMessageDialog(new Frame(),"Build socket failed!",
"Failed",JOptionPane.ERROR_MESSAGE);
System.exit(1);
}
try{
while(true){
Socket s=socket.accept();
ServerThread st=new ServerThread(s,mthreads);
st.setID(0);
mthreads.addElement(st);
new Thread(st).start();
}
}catch(Exception e){}
}
public static void main(String[] args) {
Ser ser = new Ser();
}
}
class ServerThread implements Runnable{
Socket soc=null;
Vector mthreads;
DataInputStream min=null;
DataOutputStream mout=null;
int mid;
public ServerThread(Socket s,Vector threads){
soc=s;
mthreads=threads;
try{
min=new DataInputStream(soc.getInputStream());
mout=new DataOutputStream(soc.getOutputStream());
}catch(Exception e){}
}
public void run(){
try{
while(true){
String s=min.readUTF();
if(!s.equals(null)){
String send = handmessage(s); //判断客户发来什么命令,然后执行相应功能
if(s.equals("list")||s=="list")
send = send.substring(0, send.length() - 2); //再返回结果。
String[] str = send.split("\".");
System.out.println("2."+send);
ServerThread st = (ServerThread) mthreads.elementAt(0);
st.write(send);
}
}
}catch(Exception e){}
}
String handmessage(String s){ //为方便阅读这里没贴出来
}
public void write(String msg){
synchronized(mout){
try{
mout.writeUTF(msg);
mout.flush();
}catch(Exception e){}
}
}
public void setID(int id){
mid=id;
}
}
客户端代码 getConnection.javaimport java.net.*;
import java.io.*;
public class getConnection implements Runnable{
Socket soc=null;
DataInputStream min;
DataOutputStream mout;
String message="";
String send;
public getConnection(InetAddress IP,String send){
try{
this.send=send;
soc=new Socket(IP,8080);
min=new DataInputStream(soc.getInputStream());
mout=new DataOutputStream(soc.getOutputStream());
//new Thread(this).start();
}catch(Exception e){
e.toString();
}
}
public void run(){
boolean ff=true;
try{
mout.writeUTF(send);
while(ff){
String s=min.readUTF();
if(!s.equals("")||s!=""||s!=null)
message=s;
System.out.println("s."+message);
}
}catch(Exception e){}
}
}启动客户端 也就是连接服务器把服务器的所有进程发过将在SystemFr中显示出来,这里也没有问题 try {
getConnection get = new getConnection(IPA, "list");
new Thread(get).start();
Thread.sleep(1000);
//new Thread(get).interrupt();
JDialog jd = new SystemFr(new JFrame(), IPA.toString(), true,
get.message);
jd.setVisible(true);
} catch (Exception e1) {
e1.toString();
}SystemFr.java 这里就收不到服务器发来的信息了 由于发贴字数限制,此类的具体内容在一楼帖出。package recon;import java.awt.BorderLayout;
import java.awt.Frame;
import java.net.*;
import javax.swing.*;
import java.awt.Rectangle;
import javax.swing.table.DefaultTableModel;
import java.awt.Dimension;
import java.awt.Color;
import javax.swing.event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JOptionPane;
import javax.swing.table.AbstractTableModel;
public class SystemFr extends JDialog{
DefaultTableModel defaultModel = null;
JMenuBar jMenuBar1 = new JMenuBar();
JMenu jMenuFile = new JMenu();
JMenuItem jMenuFileExit = new JMenuItem();
JMenuItem jMenuItem1 = new JMenuItem();
JMenu jMenu1 = new JMenu();
JMenuItem jMenuItem2 = new JMenuItem();
JPanel jPanel1 = new JPanel();
JTabbedPane jTabbedPane1 = new JTabbedPane();
JScrollPane jScrollPane1 = new JScrollPane();
JTable jTable1 = new JTable();
JButton jButton1 = new JButton();
JMenuItem jMenuItem3 = new JMenuItem();
JMenuItem jMenuItem4=new JMenuItem();
String text;
String title;
JLabel jLabel1 = new JLabel();
public SystemFr(Frame owner, String title, boolean modal,String text) {
super(owner, title, modal);
this.text=text;
this.title=title;
try {
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
jbInit();
} catch (Exception exception) {
exception.printStackTrace();
}
}
public SystemFr() {
this(new Frame(), "System", true,"");
}
import java.net.*;
import java.util.*;
import javax.swing.*;
import java.awt.*;public class Ser {
ServerSocket socket=null;
Vector mthreads=new Vector();
Ser(){
try{
socket=new ServerSocket(8080);
}catch(Exception e){
JOptionPane.showMessageDialog(new Frame(),"Build socket failed!",
"Failed",JOptionPane.ERROR_MESSAGE);
System.exit(1);
}
try{
while(true){
Socket s=socket.accept();
ServerThread st=new ServerThread(s,mthreads);
st.setID(0);
mthreads.addElement(st);
new Thread(st).start();
}
}catch(Exception e){}
}
public static void main(String[] args) {
Ser ser = new Ser();
}
}
class ServerThread implements Runnable{
Socket soc=null;
Vector mthreads;
DataInputStream min=null;
DataOutputStream mout=null;
int mid;
public ServerThread(Socket s,Vector threads){
soc=s;
mthreads=threads;
try{
min=new DataInputStream(soc.getInputStream());
mout=new DataOutputStream(soc.getOutputStream());
}catch(Exception e){}
}
public void run(){
try{
while(true){
String s=min.readUTF();
if(!s.equals(null)){
String send = handmessage(s); //判断客户发来什么命令,然后执行相应功能
if(s.equals("list")||s=="list")
send = send.substring(0, send.length() - 2); //再返回结果。
String[] str = send.split("\".");
System.out.println("2."+send);
ServerThread st = (ServerThread) mthreads.elementAt(0);
st.write(send);
}
}
}catch(Exception e){}
}
String handmessage(String s){ //为方便阅读这里没贴出来
}
public void write(String msg){
synchronized(mout){
try{
mout.writeUTF(msg);
mout.flush();
}catch(Exception e){}
}
}
public void setID(int id){
mid=id;
}
}
客户端代码 getConnection.javaimport java.net.*;
import java.io.*;
public class getConnection implements Runnable{
Socket soc=null;
DataInputStream min;
DataOutputStream mout;
String message="";
String send;
public getConnection(InetAddress IP,String send){
try{
this.send=send;
soc=new Socket(IP,8080);
min=new DataInputStream(soc.getInputStream());
mout=new DataOutputStream(soc.getOutputStream());
//new Thread(this).start();
}catch(Exception e){
e.toString();
}
}
public void run(){
boolean ff=true;
try{
mout.writeUTF(send);
while(ff){
String s=min.readUTF();
if(!s.equals("")||s!=""||s!=null)
message=s;
System.out.println("s."+message);
}
}catch(Exception e){}
}
}启动客户端 也就是连接服务器把服务器的所有进程发过将在SystemFr中显示出来,这里也没有问题 try {
getConnection get = new getConnection(IPA, "list");
new Thread(get).start();
Thread.sleep(1000);
//new Thread(get).interrupt();
JDialog jd = new SystemFr(new JFrame(), IPA.toString(), true,
get.message);
jd.setVisible(true);
} catch (Exception e1) {
e1.toString();
}SystemFr.java 这里就收不到服务器发来的信息了 由于发贴字数限制,此类的具体内容在一楼帖出。package recon;import java.awt.BorderLayout;
import java.awt.Frame;
import java.net.*;
import javax.swing.*;
import java.awt.Rectangle;
import javax.swing.table.DefaultTableModel;
import java.awt.Dimension;
import java.awt.Color;
import javax.swing.event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JOptionPane;
import javax.swing.table.AbstractTableModel;
public class SystemFr extends JDialog{
DefaultTableModel defaultModel = null;
JMenuBar jMenuBar1 = new JMenuBar();
JMenu jMenuFile = new JMenu();
JMenuItem jMenuFileExit = new JMenuItem();
JMenuItem jMenuItem1 = new JMenuItem();
JMenu jMenu1 = new JMenu();
JMenuItem jMenuItem2 = new JMenuItem();
JPanel jPanel1 = new JPanel();
JTabbedPane jTabbedPane1 = new JTabbedPane();
JScrollPane jScrollPane1 = new JScrollPane();
JTable jTable1 = new JTable();
JButton jButton1 = new JButton();
JMenuItem jMenuItem3 = new JMenuItem();
JMenuItem jMenuItem4=new JMenuItem();
String text;
String title;
JLabel jLabel1 = new JLabel();
public SystemFr(Frame owner, String title, boolean modal,String text) {
super(owner, title, modal);
this.text=text;
this.title=title;
try {
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
jbInit();
} catch (Exception exception) {
exception.printStackTrace();
}
}
public SystemFr() {
this(new Frame(), "System", true,"");
}
private void jbInit() throws Exception {
setSize(new Dimension(400, 470));
setResizable(false);
this.getContentPane().setLayout(null);
String[] name = {"映像名称", "PID", "CPU", "内存使用", "用户名"};
defaultModel = new DefaultTableModel(buildtable(), name);
jTable1 = new JTable(defaultModel);
jMenu1.setText("关机(U)");
jMenuItem2.setText("待机(B)");
jMenuFile.setText("File");
jMenuFileExit.setText("Exit");
jMenuItem3.setText("关闭(U)");
jMenuItem4.setText("重启(R)");
jPanel1.setBounds(new Rectangle( -1, 0, 402, 413));
jPanel1.setLayout(null);
jTabbedPane1.setBounds(new Rectangle(4, 0, 388, 383));
jButton1.setBounds(new Rectangle(282, 385, 111, 23));
jButton1.setText("结束进程(E)");
jButton1.setEnabled(false);
jScrollPane1.setBorder(null);
jMenuItem1.setText("新建任务(N)");
jMenuItem1.addActionListener(new ActionSet(title,jTable1,jButton1,defaultModel,jLabel1));
jMenuItem2.addActionListener(new ActionSet(title,jTable1,jButton1,defaultModel,jLabel1));
jMenuItem3.addActionListener(new ActionSet(title,jTable1,jButton1,defaultModel,jLabel1));
jMenuItem4.addActionListener(new ActionSet(title,jTable1,jButton1,defaultModel,jLabel1));
jButton1.addActionListener(new ActionSet(title,jTable1,jButton1,defaultModel,jLabel1));
jLabel1.setBounds(new Rectangle(9, 389, 82, 15));
jMenuBar1.add(jMenuFile);
jMenuBar1.add(jMenu1);
jMenuFile.add(jMenuItem1);
jMenuFile.add(jMenuFileExit);
jMenu1.add(jMenuItem2);
jMenu1.add(jMenuItem3);
jMenu1.add(jMenuItem4);
jPanel1.add(jButton1);
jPanel1.add(jTabbedPane1);
jPanel1.add(jLabel1);
jTabbedPane1.add(jScrollPane1, "进程");
jScrollPane1.getViewport().add(jTable1);
this.getContentPane().add(jPanel1);
setJMenuBar(jMenuBar1);
}
void jMenuFileExit_actionPerformed(ActionEvent actionEvent) {
System.exit(0);
}
String[][] buildtable(){
String [] str=text.split("\".");
String[] strs1 = str[0].split("/");
String data[][]=new String[str.length][strs1.length];
for(int i=0;i<str.length;i++){
String[] strs = str[i].split("/");
for (int j = 0; j < strs.length; j++) {
data[i][j] = strs[j];
}
}
jLabel1.setText("进程数:"+String.valueOf(str.length));
return data;
}
}
class ActionSet implements ActionListener,ListSelectionListener{
String add;
JTable table;
JButton jb;
ListSelectionModel selectionMode=null;
String selected;
int row;
int sel;
DefaultTableModel df;
JLabel jl; ActionSet(String address,JTable table,JButton jb,DefaultTableModel df,JLabel jl){
this.add=address.substring(address.indexOf("/")+1,address.length());
this.table=table;
this.jb=jb;
this.df=df;
this.jl=jl;
selectionMode=table.getSelectionModel();
selectionMode.addListSelectionListener(this);
selectionMode.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
}
public void actionPerformed(ActionEvent e){
String send=null;
String command=e.getActionCommand();
getConnection get;
String getmsg=null;
if(command.equals("新建任务(N)")){
}
if(command.equals("结束进程(E)")){
send = "over" + "/" + sel;
try {
get = new getConnection(InetAddress.getByName(add), send);
new Thread(get).start();
Thread.sleep(1000);
getmsg = get.message; //就是到这里,这个get.message就取不出来了。
System.out.println("1.. "+getmsg); //但是在getConnection中的那个输出
} catch (Exception ee) { //语句又有输出
get = new getConnection(add, send);
getmsg = get.message;
System.out.println("2..."+get.message);
}
if (getmsg.equals("true")) {
try {
df.removeRow(row);
df.setRowCount(row);
} catch (Exception f) {}
table.revalidate();
jb.setEnabled(false);
jl.setText("进程数:" + String.valueOf(df.getRowCount()));
}
else
JOptionPane.showMessageDialog(new Frame(),"Failed",
"Failed",JOptionPane.INFORMATION_MESSAGE);
}
if(command.equals("重启(R)")){
}
if(command.equals("关闭(U)")){
}
if(command.equals("待机(B)")){
}
}
public void valueChanged(ListSelectionEvent e1){
jb.setEnabled(true);
int row=table.getSelectedRow();
this.row=row;
selected=(String)table.getValueAt(row,0);
sel=Integer.valueOf((String)table.getValueAt(row,1));
}
}
boolean ff=true;
try{
mout.writeUTF(send);
while(ff){
String s=min.readUTF();
if(!s.equals("")||s!=""||s!=null)
message=s;
System.out.println("s."+message);
}
}catch(Exception e){}
}1、你那个if语句啥意思?
把红色的部分改成 if(s!=null&&!s.equals("")) 。
你写的那个if,如果s为空则会抛空指针异常;还有,以后再也别写str=="" 或者 str!=""的布尔表达式了,会害死你自己的,改成str.equals(""); 你的代码里面还有好几处要修改if语句的条件。
2、你的log呢?
没有一句log,我把你程序调通后,一跑,啥是啥都不知道,因为我没看到半句log。
如果你有log的话,估计你就不会在这发帖了。
3、你的catch子句的处理代码呢??
不是我说你,如果没有catch子句,建议你别捕获,你这样处理会让你自己都不知道程序怎么跑的,出了异常也看不到任何信息。在你工作开发过程中,这些是最危险的bug。
4、我对于界面的东东不熟悉,我记得刚开始练java网络编程的时候和你写的一样,估计你过个两个月后去再去看你的界面程序的源码,你自己都得看半天(估计能否看懂都怀疑,能看懂很不错了)。
建议:代码按功能块分出来,最好多加点注释。你的代码不全,没看到你说的现象;我估计90%以上是空指针异常。
给你几个建议:1、必须把代码中类似于 if(!s.equals("")||s!=""||s!=null)的句子改了, 如果s为null,会抛空指针异常的;还有,关系应该是与非不是或非; 以后永远也别写s==""这样的语句了,否则会留一些很奇怪的bug给你的程序的,不信你测试一下这几句代码:
String a = "";
String b = new String(a);
System.out.println(b=="");
2、我调试你的程序好吃力,半句log都没有,如果你加了log,估计你就能自己找到问题所在了。
3、catch子句为空?如果不写catch子句,还不如直接抛出来,这样还知道程序怎么跑的,如果不写,你很可能就不知道程序是不是正常运行了。这个地方不写点log或其他东东是开发的大忌,是出bug最多的地方,而且很难找到。
4、我以前也写过界面的代码,现在去看已经看不懂了。 AWT 、Swing的东东记得一定要添加注释。
private void jbInit() throws Exception {
setSize(new Dimension(400, 470));
setResizable(false);
this.getContentPane().setLayout(null);
String[] name = {"映像名称", "PID", "CPU", "内存使用", "用户名"};
defaultModel = new DefaultTableModel(buildtable(), name);
jTable1 = new JTable(defaultModel); //服务器发来的所有进程信息
jMenu1.setText("关机(U)"); //在这个表里显示
jMenuItem2.setText("待机(B)");
jMenuFile.setText("File"); //jMenu1 菜单栏,包括jMenuItem2,3,4
jMenuFileExit.setText("Exit"); //jMenuFile 菜单栏,包括jMenuFileExit,jMenuItem1
jMenuItem3.setText("关闭(U)");
jMenuItem4.setText("重启(R)");
jPanel1.setBounds(new Rectangle( -1, 0, 402, 413));
jPanel1.setLayout(null);
jTabbedPane1.setBounds(new Rectangle(4, 0, 388, 383));
jButton1.setBounds(new Rectangle(282, 385, 111, 23));
jButton1.setText("结束进程(E)");
jButton1.setEnabled(false);
jScrollPane1.setBorder(null);
jMenuItem1.setText("新建任务(N)"); //class ActionSet处理所有class SystemFr
jMenuItem1.addActionListener(new ActionSet //响应所有菜单不包括“退出(title,jTable1,jButton1,defaultModel,jLabel1));
jMenuItem2.addActionListener(new ActionSet //jLabel1,显示进程总数。(title,jTable1,jButton1,defaultModel,jLabel1));
jMenuItem3.addActionListener(new ActionSet(title,jTable1,jButton1,defaultModel,jLabel1));
jMenuItem4.addActionListener(new ActionSet(title,jTable1,jButton1,defaultModel,jLabel1));
jButton1.addActionListener(new ActionSet(title,jTable1,jButton1,defaultModel,jLabel1));
jLabel1.setBounds(new Rectangle(9, 389, 82, 15));
jMenuBar1.add(jMenuFile); //将所有组件添加到SystemFr中
jMenuBar1.add(jMenu1);
jMenuFile.add(jMenuItem1);
jMenuFile.add(jMenuFileExit);
jMenu1.add(jMenuItem2);
jMenu1.add(jMenuItem3);
jMenu1.add(jMenuItem4);
jPanel1.add(jButton1);
jPanel1.add(jTabbedPane1);
jPanel1.add(jLabel1);
jTabbedPane1.add(jScrollPane1, "进程");
jScrollPane1.getViewport().add(jTable1);
this.getContentPane().add(jPanel1);
setJMenuBar(jMenuBar1);
}
void jMenuFileExit_actionPerformed(ActionEvent actionEvent) {
System.exit(0);
}
String[][] buildtable(){ //text 从服务器取得所有进程信息
String [] str=text.split("\"."); //进程与进程之间用“\".”隔开
String[] strs1 = str[0].split("/"); //每个进程中包括五个信息,由"/"隔开
String data[][]=new String[str.length][strs1.length];
for(int i=0;i<str.length;i++){
String[] strs = str[i].split("/");
for (int j = 0; j < strs.length; j++) {
data[i][j] = strs[j];
}
}
jLabel1.setText("进程数:"+String.valueOf(str.length));
return data;
}
}
class ActionSet implements ActionListener,ListSelectionListener{
String add;
JTable table;
JButton jb;
ListSelectionModel selectionMode=null;
String selected;
int row;
int sel;
DefaultTableModel df;
JLabel jl; ActionSet(String address,JTable table,JButton jb,DefaultTableModel df,JLabel jl){
this.add=address.substring(address.indexOf("/")+1,address.length());
this.table=table;
this.jb=jb;
this.df=df;
this.jl=jl;
selectionMode=table.getSelectionModel();
selectionMode.addListSelectionListener(this);
selectionMode.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
}
public void actionPerformed(ActionEvent e){
String send=null;
String command=e.getActionCommand();
getConnection get;
String getmsg=null;
if(command.equals("新建任务(N)")){
}
if(command.equals("结束进程(E)")){
send = "over" + "/" + sel;
try {
get = new getConnection(InetAddress.getByName(add), send);
new Thread(get).start();
Thread.sleep(1000);
getmsg = get.message; //就是到这里,这个get.message就取不出来了。
System.out.println("1.. "+getmsg); //但是在getConnection中的那个输出
} catch (Exception ee) { //语句又有输出
get = new getConnection(add, send);
getmsg = get.message;
System.out.println("2..."+get.message);
}
if (getmsg.equals("true")) {
try {
df.removeRow(row);
df.setRowCount(row);
} catch (Exception f) {}
table.revalidate();
jb.setEnabled(false);
jl.setText("进程数:" + String.valueOf(df.getRowCount()));
}
else
JOptionPane.showMessageDialog(new Frame(),"Failed",
"Failed",JOptionPane.INFORMATION_MESSAGE);
}
if(command.equals("重启(R)")){
}
if(command.equals("关闭(U)")){
}
if(command.equals("待机(B)")){
}
}
public void valueChanged(ListSelectionEvent e1){ //鼠标在表上的选择事件,当要删除进程时用
jb.setEnabled(true); //到
int row=table.getSelectedRow(); //选择哪行
this.row=row;
selected=(String)table.getValueAt(row,0); //返回选择行的进程名
sel=Integer.valueOf((String)table.getValueAt(row,1)); //返回选择行的PID
}
}