0

私はこの問題について立ち往生していて、それを修正する方法がわかりません。

私は、Javaソケットプログラミングを使用してサーバーとクライアント間の通信を作成しようとしています。このサーバー用リンクとクライアント用リンクのソースコードを使用してアプリケーションを作成し、2つのプロジェクトパッケージ(クライアントとサーバー)に分割します。しかし、クライアント側では、この側にライブラリを追加したいので、このソースコードをいくつかのクラスに変更します。

この変更されたサワーコードを使用してクライアントからサーバーにデータを送信しようとすると、問題が発生します。サーバーからのソケットは常に「読み取りに失敗しました」というメッセージを送信しましたが、元のソースコードを使用すると正しく機能します(読み取ることができます)。

これはサーバー側のソースコードです(サーバーパッケージ)

    package server;

/**
 *
 * @author IRVAN AHADI
 */
import java.awt.Color;
import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;

import java.io.*;
import java.net.*;

class ClientWorker implements Runnable {
  private Socket client;
  private JTextArea textArea;

  ClientWorker(Socket client, JTextArea textArea) {
   this.client = client;
   this.textArea = textArea;   
  }

  public void run(){
    String line;
    BufferedReader in = null;
    PrintWriter out = null;
    try{
      in = new BufferedReader(new InputStreamReader(client.getInputStream()));
      out = new PrintWriter(client.getOutputStream(), true);
    } catch (IOException e) {
      System.out.println("in or out failed");
      System.exit(-1);
    }

    while(true){
      try{
        line = in.readLine();
//Send data back to client
         out.println(line);
         textArea.append(line);
       } catch (IOException e) {
         System.out.println("Read failed");
         System.exit(-1);
       }
    }
  }
}

class SocketThrdServer extends JFrame{

   JLabel label = new JLabel("Text received over socket:");
   JPanel panel;
   JTextArea textArea = new JTextArea();
   ServerSocket server = null;

   SocketThrdServer(){ //Begin Constructor
     panel = new JPanel();
     panel.setLayout(new BorderLayout());
     panel.setBackground(Color.white);
     getContentPane().add(panel);
     panel.add("North", label);
     panel.add("Center", textArea);
   } //End Constructor

  public void listenSocket(){
    try{
      server = new ServerSocket(4444);
      System.out.println("succes crate socket");
    } catch (IOException e) {
      System.out.println("Could not listen on port 4444");
      System.exit(-1);
    }
    while(true){
      ClientWorker w;
      try{
        w = new ClientWorker(server.accept(), textArea);
        Thread t = new Thread(w);
        t.start();
        System.out.println("succes accept socket");
      } catch (IOException e) {
        System.out.println("Accept failed: 4444");
        System.exit(-1);
      }
    }
  }

  protected void finalize(){
//Objects created in run method are finalized when 
//program terminates and thread exits
     try{
        server.close();
    } catch (IOException e) {
        System.out.println("Could not close socket");
        System.exit(-1);
    }
  }

  public static void main(String[] args){
        SocketThrdServer frame = new SocketThrdServer();
    frame.setTitle("Server Program");
        WindowListener l = new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                        System.exit(0);
                }
        };
        frame.addWindowListener(l);
        frame.pack();
        frame.setVisible(true);
        frame.listenSocket();
  }
}

これはクライアント側のソースコードです(クライアントパッケージ)

  1. Client.java

パッケージクライアント;

import java.io.*; 
import java.net.*;
public class Client{
Socket socket;
PrintWriter out = null;
BufferedReader in =  null;
String message = null;


        Client(){
                try{    
                    socket = new Socket("IRVANA-PC",4444);
                    out = new PrintWriter(socket.getOutputStream(),true);
                    in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    System.out.println("Socket created and now connected to "+socket.getPort());
                }catch(UnknownHostException e){
                    System.out.println("Unknown host!");
                    System.exit(1);
                }catch(IOException e){
                    System.out.println("No I/O");
                    System.exit(1);
                }
        }

        Client(String host, int port){
                try{
                    socket = new Socket(host, port);
                    out = new PrintWriter(socket.getOutputStream());
                    in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    System.out.println("Socket created and now connected to "+socket.getPort());
                }catch(UnknownHostException e){
                    System.out.println("Unknown host!");
                    System.exit(1);
                }catch(IOException e){
                    System.out.println("No I/O");
                    System.exit(1);
                }
        }

        public void sendData(String a){
                out.println(a);
        }

        public void getData(){
                try{
                    String line = in.readLine();
                    System.out.println("Text received :" + line);
                } catch (IOException e){
                    System.out.println("Read failed");
                    System.exit(1);
                }
        }

        public void disconnect(){
                try{
                    this.socket.close();
                }catch(IOException ioException){
                    ioException.printStackTrace();
                }
        }
    } 

2. Clientside.java(クライアントパッケージのメインクラス)

package client;


import org.hyperic.sigar.CpuPerc;
import org.hyperic.sigar.cmd.SigarCommandBase;
import org.hyperic.sigar.Sigar;


public class ClientSide {

public ClientSide(){

}

public static void main(String[] args) throws Exception{
    ClientSide client = new ClientSide();
    if ((args.length > 0) &&(args.length == 2))
    {

            int port = Integer.parseInt(args[1]);
            Client clientNetwork = new Client(args[0],port);
            System.out.println(clientNetwork.socket.getPort());
            String data = client.persentaseCPU();
            System.out.println(data);
            clientNetwork.sendData(data);                                

    }
    else{
        Client clientNetwork = new Client();
        String data = client.persentaseCPU();
        clientNetwork.sendData(data);
        }
    }

public String persentaseCPU() throws Exception{
    CpuNfo cpunfo = new CpuNfo();
    Sigar a = new Sigar();
    CpuPerc cpus = a.getCpuPerc();
    String percentage="idle "+CpuPerc.format(cpus.getIdle());
    return percentage;
}
}

Clientside.javaから呼び出したときに、なぜclientNetwork.sendData(data);それが機能しないのか疑問に思っています。何かを見逃したのでしょうか。クライアントソケットを介してデータを送信するためのメソッドsendData(String a)をClient.javaに正しく作成しましたか?

本当にありがとう!

4

0 に答える 0