0

GUIを使用してJavaでTCPクライアントサーバープログラムを作成しています。アイデアは、サーバー プログラムのテキスト フィールドから値を取得し、それをオブジェクトに格納して、クライアント側に送信することです。クライアント側はオブジェクトを逆シリアル化し、逆シリアル化されたオブジェクトの値でテキスト フィールドを更新します。

ChattingServer.java

public class ChattingServer extends JFrame {

private JTextField senddata;
private JTextField packettype;
private JTextField packetsize;
private JTextField offset;
private JButton sendButton;
private JButton startServer;
private TCPServer mServer;
private TCP_DATA_PACKET TDP;

sendButton = new JButton("Update");
    sendButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            TDP.bSendRequestedData = senddata.getText().toString();
            TDP.uPacketType = packettype.getText().toString();
            TDP.uPacketSize = packetsize.getText().toString();
            TDP.uOffset = offset.getText().toString();
            mServer.SendObject(TDP);                
        }
    });

    startServer = new JButton("Start");
    startServer.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {                
           startServer.setEnabled(false);               
           try{
                IP.setText(InetAddress.getLocalHost().getHostAddress());
           } catch (UnknownHostException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
           }
           mServer = new TCPServer();
           mServer.start();
        }
    });
public class TCPServer extends Thread{
    public TCP_DATA_PACKET packet;
    public final int SERVERPORT = Integer.parseInt(port.getText().toString());
    private ObjectOutputStream mOut;


    public void SendObject(Object obj){
        try{
          mOut.writeObject(this);
          System.out.println("Object sent successfully!");
          mOut.flush();
          mOut.close();

          }catch(IOException ioe){
            System.out.println(ioe);  
          }
    }
    @SuppressWarnings("resource")

    public void run() {
        super.run();

        try {
            System.out.println("S: Connecting...");
            ServerSocket serverSocket = new ServerSocket(SERVERPORT);
            System.out.println("Server ip:" + InetAddress.getLocalHost().getHostAddress());
            Socket client = serverSocket.accept();
            System.out.println(client.getRemoteSocketAddress()+" connected\n");
            ClientIP.setText(client.getRemoteSocketAddress().toString());
            System.out.println("S: Receiving...");

            try {
                mOut = new ObjectOutputStream(client.getOutputStream());

            } catch (Exception e) {
                System.out.println("S: Error");
                e.printStackTrace();
            } finally {
                client.close();
                System.out.println("S: Done.");
            }

        } catch (Exception e) {
            System.out.println("S: Error");
            e.printStackTrace();
        }
    }

ChattingClient.java はまったく同じですが、オブジェクトのみを受け取ります

public class TCPServer extends Thread{
    public TCP_DATA_PACKET packet = null;
    public final int SERVERPORT = Integer.parseInt(port.getText().toString());
    public final String SERVERADD = IP.getText().toString();
    public boolean running = false;

    public void run(){
        super.run();
        running = true;

        try {
            System.out.println("S: Connecting...");
            InetAddress serverAddr = InetAddress.getByName(SERVERADD);
            Socket client = new Socket(serverAddr,SERVERPORT);
            try {
                ObjectInputStream in = new ObjectInputStream(client.getInputStream());
                while (running) {
                    packet = (TCP_DATA_PACKET)in.readObject();

                    if (packet!= null) {
                        senddata.setText(packet.bSendRequestedData);
                        packettype.setText(packet.uPacketType);
                        packetsize.setText(packet.uPacketSize);
                        offset.setText(packet.uOffset);
                    }
                }

            } catch (Exception e) {
                System.out.println("S: Error");
                e.printStackTrace();
            } finally {
                client.close();
                System.out.println("S: Done.");
            }

        } catch (Exception e) {
            System.out.println("S: Error");
            e.printStackTrace();
        }

    }

ただし、サーバー側で NullPointer Exception が発生しています。

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at ChattingServer$1.actionPerformed(ChattingServer.java:81)

TDP.bSendRequestedData = senddata.getText().toString();

sendButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            TDP.bSendRequestedData = senddata.getText().toString();
            TDP.uPacketType = packettype.getText().toString();
            TDP.uPacketSize = packetsize.getText().toString();
            TDP.uOffset = offset.getText().toString();
            mServer.SendObject(TDP);                
        }
    });

クライアント側のEOF例外

ObjectInputStream in = new ObjectInputStream(client.getInputStream());

私はここで立ち往生しています...どんな助けもいただければ幸いです。前もって感謝します!!

編集: オブジェクト TDP を初期化して NullPointerException を修正しました:

TCP_DATA_PACKET TDP = new TCP_DATA_PACKET();

クライアントとサーバーの両方で。今、サーバー側でこの例外を取得しています

java.net.SocketException: Socket closed

クライアント側の同じEOF例外

java.io.EOFException

at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at ChattingClient$TCPServer.run(ChattingClient.java:132)

ここで何がうまくいかないのか教えてください。どんな助けでも大歓迎です。:)

4

0 に答える 0