2

だから私はソケットを使って単純なクライアントサーバープログラムをやっています。ほとんどの場合、 KnockKnockServerからコードを取得しましたが、Threads を使用してクライアントを実装しました (後で Android アプリで使用したいので、これが必要です)。

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

public class HelpMeServer {
public static void main(String[] args) throws IOException {
    Database db=new Database();
    ServerSocket serverSocket = null;
    try {
        serverSocket = new ServerSocket(50000);
        System.out.println("Listening on port 911");
    } catch (IOException e) {
        System.err.println("Could not listen on port: 911.");
        System.exit(1);
    }

    Socket clientSocket = null;
    try {
        clientSocket = serverSocket.accept();
        System.out.println("incomig");
    } catch (IOException e) {
        System.err.println("Accept failed.");
        System.exit(1);
    }
    System.out.println("getting printwriter and bufferedreader");
    PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
    BufferedReader in = 
        new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    String inputLine, outputLine;


    Protocol kkp = new Protocol(db);
    // initiate conversation with client
    System.out.println("listening..");
//Here the exception is thrown.
    while ((inputLine = in.readLine()) != null) {
         kkp.processInput(inputLine);
         //if (outputLine.equals("Bye."))
            //break;
    }        out.close();
    in.close();
    clientSocket.close();
    serverSocket.close();
}
}
import java.net.*;
import java.io.*;

public class Protocol {
private static final int WAITING = 0;
private static final int REGISTERING = 1;
private static final int LOGIN = 2;

private int state = WAITING;
private Database db;
private String email;
private String password;
public Protocol(Database db)
{
    this.db=db;
    email=null;
    password=null;
}
public void processInput(String theInput) {
    System.out.println("Cliet: "+theInput);


    if (state == WAITING) {
        if(theInput.equals("register"))
            {
            state=REGISTERING;
            System.out.println("set state to registering");
            }
        else if(theInput=="login"){
            state=LOGIN;
            System.out.println("set state to registering");
        }
        }


    else if(state == REGISTERING)
    {
        if(email==null) {
            email=theInput;
            System.out.println("set email to "+email);
        }
        else {
            password=theInput;
            System.out.println("saving "+email);
            db.addUser(new String(email), new String(password));
            password=null;
            email=null;
            state=WAITING;
        }
    }
}
}
 import java.io.*;
 import java.net.*;

public class NetworkingThread extends Thread{

Socket kkSocket;
PrintWriter out;
BufferedReader in;
public void run()
    {
    kkSocket = null;
    out = null;
    in = null;

    try {
        kkSocket = new Socket("localhost", 50000);
        out = new PrintWriter(kkSocket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(kkSocket.getInputStream()));
    } catch (UnknownHostException e) {
        System.err.println("Don't know about host: taranis.");
        System.exit(1);
    } catch (IOException e) {
        System.err.println("Couldn't get I/O for the connection to: taranis.");
        System.exit(1);
    }   

}
public void close()
{
    out.close();
    try {
        in.close();
        kkSocket.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
public void write(String s)
{
    out.println(s);  
    out.flush();
}
}

public class go {

/**
 * @param args
 */
public static void main(String[] args) {
        NetworkingThread n=new NetworkingThread();
    n.start();
    n.write("register");
    n.write("a@gmail.com");
    n.write("password");
    n.close();

}

 }

私のエラー:

Exception in thread "main" java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
at java.io.InputStreamReader.read(Unknown Source)
at java.io.BufferedReader.fill(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at HelpMeServer.main(HelpMeServer.java:34)

このコードを取得して NetworkThread の run メソッドを挿入すると、エラーはなくなります。しかし、アプリでこれを使用することはできません。これらのメソッドを外部から呼び出す必要があります

n.write("register");
n.write("a@gmail.com");
n.write("password");
n.close();

あなたのアドバイスに従って行った変更(同じ場所で同じエラーが発生します)

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

public class HelpMeServer {
 public static void main(String[] args) throws IOException {
    Database db=new Database();
    ServerSocket serverSocket = null;
    try {
        serverSocket = new ServerSocket(50000);
        System.out.println("Listening on port 911");
    } catch (IOException e) {
        System.err.println("Could not listen on port: 911.");
        System.exit(1);
    }

   while(true)
   {
    Socket clientSocket = null;
    try {
        clientSocket = serverSocket.accept();
        System.out.println("incomig");
        ClientThread t=new ClientThread(clientSocket,db);
        t.start();
    } catch (IOException e) {
        System.err.println("Accept failed.");
        System.exit(1);
    }
   }
  }
          }

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;


public class ClientThread extends Thread {

Socket clientSocket;
Database db;
public ClientThread(Socket s,Database db)
{
    clientSocket=s;
    this.db=db;
}
public void run()
{
     System.out.println("getting printwriter and bufferedreader");
        PrintWriter out;
        try {
        out = new PrintWriter(clientSocket.getOutputStream(), true);
        BufferedReader in = 
        new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                String inputLine, outputLine;


                Protocol kkp = new Protocol(db);
                System.out.println("listening..");
                while ((inputLine = in.readLine()) != null) {//error!
                     kkp.processInput(inputLine);
                     //if (outputLine.equals("Bye."))
                        //break;
                } 
                out.close();
               in.close();
               clientSocket.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

}

  }
4

1 に答える 1