Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java客户机服务器应用程序错误_Java_Sockets_Input_Client - Fatal编程技术网

java客户机服务器应用程序错误

java客户机服务器应用程序错误,java,sockets,input,client,Java,Sockets,Input,Client,我正在用java编写一个带有套接字的客户机-服务器应用程序。 客户端和服务器都位于我的计算机上。 目标是将消息从客户端发送到服务器。 我想我的插座还可以,但我获取信息的方式有问题。 此外,由于某些原因,当我单击时,服务器和客户端有时会“卡住” 连接或启动服务器 以下是客户端代码: import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import j

我正在用java编写一个带有套接字的客户机-服务器应用程序。 客户端和服务器都位于我的计算机上。 目标是将消息从客户端发送到服务器。 我想我的插座还可以,但我获取信息的方式有问题。 此外,由于某些原因,当我单击时,服务器和客户端有时会“卡住” 连接或启动服务器

以下是客户端代码:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.sql.Time;

import javax.swing.*;

public class Client extends JFrame{
private int connected = 0;
private JTextArea txt;
private JTextField mText;
private JButton sendMessage;
private JScrollPane scroll;
    private JButton connect;
private JButton disconnect;
    private Socket socket;
    private ObjectInputStream input;
    private ObjectOutputStream output;
    private PrintWriter out;
public Client(){
    setLayout(null);

    txt = new JTextArea();
    scroll = new JScrollPane(txt);
    scroll.setBounds(25,10,325,200);
    add(scroll);


    mText = new JTextField();
    mText.setBounds(25,220,250,30);
    add(mText);

    sendMessage=new JButton("Send");
    sendMessage.setBounds(280,220,70,30);   
    add(sendMessage);

    connect= new JButton("Connect");
    connect.setBounds(25,260,100,30);
    add(connect);

    disconnect = new JButton("Disconnect");
    disconnect.setBounds(135,260,100,30);
    add(disconnect);
  //events stuff
       eventHandler handler = new eventHandler();
       sendMessage.addActionListener(handler);
       connect.addActionListener(handler);
       disconnect.addActionListener(handler);
   }
public class eventHandler implements ActionListener{
    public void actionPerformed(ActionEvent e) {
        if(e.getSource()==sendMessage){
            sendMessage();
        }
        else
            if(e.getSource()==connect){
            if(connected==0){
            try{
             connect();
             connected = 1;
             }catch(Exception e1){
                 e1.printStackTrace();
                 System.out.print(e1);
             }
            }else
                printOnScreen("you are already connected...");
          }
        else
            if(e.getSource()==disconnect){
                if(connected==1){
                 try{
                    disconnect();
                    connected = 0;
                 }catch(Exception e1){
                     e1.printStackTrace();
                     System.out.print(e1);
                 }
                 }else{printOnScreen("you are not connected");} 
             }
  }
}


public void printOnScreen(String m){
    txt.append("\n"+m);
}

public void sendMessage(){
    String message = txt.getText();
    out.print(message);
}
public void connect() throws UnknownHostException, IOException{
    socket=new Socket("localhost",6789);
    input = new ObjectInputStream(socket.getInputStream());
    output= new ObjectOutputStream(socket.getOutputStream());
    out = new PrintWriter(socket.getOutputStream(),true);
    out.print("client connecting");
    out.flush();
}
public void disconnect() throws IOException{
    out.print("Client disconnecting");
    out.flush();
    out.close();
    input.close();
    output.close();
    socket.close();
}

public static void main(String[]args){
    Client cFrame = new Client();
    cFrame.setDefaultCloseOperation(EXIT_ON_CLOSE);
    cFrame.setSize(385,350);
    cFrame.setTitle("             ---___Client1___---");
    cFrame.setVisible(true);
}

}
和服务器代码:

import java.awt.Event;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.EventHandler;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.net.*;
import javax.swing.*;
public class Server extends JFrame {
private int running =0;

private JPanel showInformation;
private JButton start;
private JButton stop;
private JTextArea infoArea;
private JScrollPane scroll;

private ServerSocket server;
private Socket client;   

private ObjectOutputStream output;
private ObjectInputStream input;

private PrintWriter out;

public Server(){
   //setting looks of Frame
   setLayout(null);
   showInformation=new JPanel();
   start = new JButton("Start Server");
   stop=new JButton("Stop Server");
   infoArea= new JTextArea(20,27);
   infoArea.setEnabled(false);
   infoArea.setEditable(false);
   scroll = new JScrollPane(infoArea);
   scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
   scroll.setBounds(25,10,325,200);
   scroll.setEnabled(true);
   add(scroll);

   showInformation.setSize(300, 200);
   showInformation.setBounds(25,5,325,200);
   add(showInformation);
   infoArea.setLineWrap(true);
   start.setBounds(25,225,150,50);
   stop.setBounds(200,225,150,50);

   add(start);
   add(stop);     
   //events stuff
   eventHandler handler = new eventHandler();
   start.addActionListener(handler);
   stop.addActionListener(handler);

   //sockets 
}

public void printOnScreen(String m){
    infoArea.append("\n"+m);
}

public class eventHandler implements ActionListener{
    public void actionPerformed(ActionEvent e) {
        if(e.getSource()==start){
              if(running==1)
                  printOnScreen("Server Already Running !!!");
              else
              {
                  try{
                       startServer();
                  }catch(Exception e1){
                      e1.printStackTrace();
                      System.out.print(e1);
                  }
                  running=1;

              }
           }
        else 
          if(e.getSource()==stop){
              if(running==0)
                  printOnScreen("Server Not Running !!!");
              else
              {
                  try{
                      stopServer();
                  }catch(Exception e1){
                      e1.printStackTrace();
                      System.out.print(e1);
                  }
                  running=0;
             }
    }

}
}

public void startServer() throws IOException{
    server = new ServerSocket(6789);
    running=1;
    Listener ls = new  Listener();
    ls.run();
    client =  server.accept();
    input = new ObjectInputStream(client.getInputStream());
    output = new ObjectOutputStream(client.getOutputStream());
    output.flush();
    out = new PrintWriter(client.getOutputStream(),true);
    out.flush();
    printOnScreen("Server Started !!!");
    printOnScreen("waiting for connection...");
}

public void stopServer() throws IOException{
  output.writeObject("Server Stoped");
  output.flush();
  input.close();
  output.close();
  client.close();
  server.close();
  printOnScreen("Server Stopped");
}


public void getMessage() throws ClassNotFoundException, IOException{
try{
    String message = (String)input.readObject();
    printOnScreen("client: "+message);
}catch(Exception e){
    e.printStackTrace();
}

}

class Listener extends Thread{
    public Listener(){

    }
    public void run(){
        try {
            client = server.accept();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
            System.out.print(e1);
        }
        while(running==1){
            try {
                Thread.sleep(4000);
                getMessage();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
                System.out.print(e);
            } catch (IOException e) {
                e.printStackTrace();
                System.out.print(e);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

public static void main(String[]args){
   Server s = new Server();
   s.setDefaultCloseOperation(EXIT_ON_CLOSE);
   s.setSize(385, 350);
   s.setVisible(true);
   s.setTitle("      ----Server----");
   s.setTitle("Server Manager");
 }

}
以下是eror代码:

 java.lang.NullPointerException
at Server.getMessage(Server.java:129)
at Server$Listener.run(Server.java:152)
at Server.startServer(Server.java:105)
at Server$eventHandler.actionPerformed(Server.java:73)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

描述“卡住”和“有时”。进程是否崩溃、挂起、变得非常慢、消耗系统上的所有内存或CPU?每跑三次,或者每次正好是一小时?如果附加了调试器,进程会停留在哪里?这是Swing(UI)代码中的问题还是IPC(客户端-服务器)中的问题代码?卡住是指按钮被按下但没有释放,所有JFrame没有响应,就像程序被压碎一样,或者正在等待什么。这是eror:每次都会发生。我打赌你正在阻止网络操作,比如EDT上的server.accept()。在设置输入之前,您尝试访问输入。这就是为什么有时候它仍然是空的。这只是偶尔发生的,因为您创建了一个经典的赛车条件。正如Fildor已经描述的,您正在EDT线程上处理服务器。正常的ServerSocket模式是在新线程上运行它。在您的情况下,我会让整个ServerSocket部分在一个不同的线程上运行,您可以从GUI控制该线程。另外,每个clientSocket都应该在不同的线程中处理,因此您可以支持多个客户端。我还注意到,您试图连续关闭所有资源,只捕获一个异常。如果在前几行中有一行出现异常,则无法关闭剩余的资源,您也可以检查一下。