2016-05-01 20 views
0

私はクライアントとサーバーの間でデータを送信する(ネットワークプログラミングを実践するための)小さなプログラムを作成しています。クライアントがデータ(整数)をサーバーに送信してから、サーバーがクライアントにデータを追加してクライアントに送信し、クライアントを追加してサーバーに送信して100までのサイクルを繰り返すだけです。クライアントとサーバーとの間でデータを同期させますか?

サーバ・クラスのコード:その後、

package simpleslickgame; 

import java.io.DataOutputStream; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.ArrayList; 
import java.util.Scanner; 

public class NewServer{ 

static ArrayList<Socket> sockets = new ArrayList<Socket>(20); 
static ArrayList<String> msgHistory = new ArrayList<String>(10000); 
public static void main(String args[]){ 

    int port = 60606; 

    Socket socky; 
    ServerSocket ss; 

    try{ 
     System.out.println("Welcome to the data sender!"); 
     System.out.println("Listening on port " + port); 

     ss = new ServerSocket(port); 

     while (true){ 
      socky = ss.accept(); 

      sockets.add(socky); 

      System.out.println(socky.toString()); 
      //pw = new PrintWriter(socky.getOutputStream(), true); 
      System.out.println("Connection established!"); 
      Thread t = new Thread(
        new DataThread(socky)); 
      t.start(); 

     } 

    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 
} 
class DataThread extends NewServer implements Runnable{ 
private Socket s; 
private int data; 

public DataThread(Socket sock){ 
    this.s = sock; 
} 

public void run(){ 
    String client = s.getInetAddress().toString(); 
    System.out.println("Connected to " + client); 

    try{ 
     Scanner in = new Scanner(s.getInputStream()); 

     PrintWriter pw = new PrintWriter(s.getOutputStream(), true); 

     while(true){ 
     //pw.println("Testing..."); 
     this.data = in.nextInt(); 
     if(this.data > 99) 
      break; 
     System.out.println("Server: " + this.data); 
     pw.println(this.data+1); 
     } 
     s.close(); 
     in.close(); 

    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 
} 

とClientクラス

package simpleslickgame; 

import java.io.IOException; 
import java.io.PrintWriter; 
import java.net.InetAddress; 
import java.net.Socket; 
import java.net.UnknownHostException; 
import java.util.Scanner; 

public class NewClient { 

public static void main(String[] args) { 
    int port = 60606; 
    System.out.println("Welcome to the message client!"); 
    Socket s = getSocket(port); 
    String message; 

    String user; 
    try{ 
     System.out.println("Connected on port " + port); 


     while(true){ 
      Thread t = new Thread(
        new GameThread(s)); 
      t.start(); 
     } 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 
private static Socket getSocket(int port){ 
    Socket s; 
    String host; 
    InetAddress ip; 

    Scanner input = new Scanner(System.in); 
    while(true){ 
     System.out.print("What server do you want to connect to?"); 
     host = input.nextLine(); 
     try{ 
      ip = InetAddress.getByName(host); 
      s = new Socket(ip,port); 
      return s; 
     }catch(UnknownHostException e){ 
      System.out.println("The host is unknown."); 
     }catch(IOException e){ 
      System.out.println("Network error."); 
     } 
    } 
} 

} 
class GameThread extends NewClient implements Runnable{ 
private Socket s; 
private int data; 
public GameThread(Socket sock){ 
    this.s = sock; 
} 
public void run(){ 
    try{ 
     Scanner in = new Scanner(s.getInputStream()); 
     PrintWriter out = new PrintWriter(s.getOutputStream(), true); 
     this.data = -1; 
     while(true){ 

      out.println(this.data+1); 
      this.data = in.nextInt(); 
      System.out.println("Client: " + this.data); 
      if(this.data > 99){ 
       break; 
      } 
     } 
     this.s.close(); 


    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 



} 

私はしかし、これらの2を実行すると、私はちょうど行い、出力の膨大な量を取得しますコードに従わず、代わりにj無作為な量であるように見えます(明らかにそうではありませんが、なぜインクリメンタルでないのかを理解するのに役立つでしょう)。

出力例:NEWCLIENTクラスの

Server: 4 Server: 10 Server: 12 Server: 2 Server: 16 Server: 14 Server: 6 Server: 4 Server: 6 Server: 12 Server: 12 Server: 6 Server: 10 Server: 16 Server: 10 Server: 12

答えて

1

 while(true){ 
     Thread t = new Thread(
       new GameThread(s)); 
     t.start(); 
    } 

は同じソケットを使用して複数のスレッドを生成します。したがって、同じ通信チャネルを使用するサーバがいくつか存在するため、サーバは一見無作為intになります。

関連する問題