0

私はクライアントサーバープログラミングに比較的慣れていません。アプレットGUIでクライアントとサーバー間の簡単な通信を取得しようとしています。現在は機能していますが、クライアントを実行すると例外が発生します

変更されたコード:

クライアント:

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

import javax.swing.*;


public class Client extends JApplet{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private JTextArea displayArea;
    private Socket socket = null;
    private DataInputStream input;
    private DataOutputStream output;


    public void init()
    {

        Container container = getContentPane();

        // set up JTextArea to display
        displayArea = new JTextArea();
        displayArea.setEditable(false);
        container.add(new JScrollPane(displayArea), BorderLayout.SOUTH );

        try 
        {
            // make connection
            socket = new Socket(getCodeBase().getHost(), 5423);

            // get streams
            input = new DataInputStream( socket.getInputStream() );
            output = new DataOutputStream( socket.getOutputStream() ); 


            while(true) 
            {
                output.writeUTF("hello from client"); //send message to server
                output.flush(); 

                processMessage(input.readUTF()); //process data from server    
            }
        }
        // catch problems setting up connection and streams
        catch ( IOException ioException ) {
            ioException.printStackTrace(); 
        }

        try 
        {
            input.close();
            output.close();
        } 
        catch (IOException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }


    // process message received by client
    private void processMessage(String message)
    {
        if (message.equals("hello") ) 
        {
            displayMessage("Connected to server");
        }
    }


    private void displayMessage(final String messageToDisplay)
    {

        SwingUtilities.invokeLater(
                new Runnable() {  

                    public void run() 
                    {
                        displayArea.append(messageToDisplay);
                        displayArea.setCaretPosition(displayArea.getText().length());
                    }
                } 
            ); 
    }

}

サーバ:

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

import javax.swing.*;


public class Server extends JFrame{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private ServerSocket serverSocket;
    private JTextArea outputArea;
    private Socket socket = null;
    private DataInputStream input;
    private DataOutputStream output;


    public Server()
    {

        super("Server");

        try
        {
            serverSocket = new ServerSocket(5423, 1);
        }
        catch(IOException ioException)
        {
            ioException.printStackTrace();
            System.exit(1);
        }


        outputArea = new JTextArea();
        getContentPane().add(outputArea, BorderLayout.CENTER);
        outputArea.setText("Server awaiting connections\n");


        setSize(300, 300);
        setVisible(true);
    }


    private void doThis() throws IOException
    {
        try
        {
            while(true)
            {

                socket = serverSocket.accept();

                input = new DataInputStream(socket.getInputStream());
                output = new DataOutputStream(socket.getOutputStream());

                output.writeUTF("hello");
                outputArea.append(input.readUTF()); //receive data from client
                output.flush();     
            }
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            output.close();
            input.close();
            socket.close(); //close connection to client
        }
    }


    public static void main(String[] args) throws IOException 
    {
        Server server = new Server();   
        server.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        server.doThis();    
    }
}

例外は次のとおりです。

java.net.SocketException: java.net.SocketInputStream.read (不明なソース) で接続がリセットされました。 java.net.SocketInputStream.read (不明なソース) で java.net.SocketInputStream.read (不明なソース) でjava.io.DataInputStream.readUTF の .readUnsignedShort(未知のソース) java.io.DataInputStream.readUTF の 未知のソース) Client.init(Client.java:45) の sun.applet.AppletPanel.run( java.lang.Thread.run(不明なソース) の不明なソース)

4

2 に答える 2

0

現在、サーバーに障害があります。
ServerSocket は一度作成する必要があります (コードにあるように)。
その後、ServerSocket リスナーは新しい接続を受け入れるのを待つ必要があります。クライアントごとに 1 つです。これは、
新しいクライアント接続が新しい接続を受け入れたときにのみ発生します。スレッドは各クライアントを処理する必要があり、そのスレッド内で IO ストリームを 1 回開いてから、データの読み取り/書き込み/処理のループを作成する必要があります。再び IO ストリームは、データ処理ループが完了した後に 1 回だけ閉じる必要があります。

于 2013-10-28T11:16:37.900 に答える