2017-02-23 4 views
1

私はサーバーとクライアントでテキスト文字列を前後に渡して簡単なプログラムを作ろうとしています。私は接続に問題があります。私はソケット受け入れラインのすぐ下にテストプリントラインを持っていて、それは印刷されないので、そこに問題があると仮定しますが、もっと徹底的にチェックする方法がわかりません。Javaでソケット接続を受け入れることができない

私はこのプログラムをEclipseで作成しています。

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

public class HW2Q1S { 

public static void main(String[] args) throws Exception { 

    try { 
     //connection 
     ServerSocket srvr = new ServerSocket(7654); 
     Socket skt = srvr.accept(); 
     System.out.println(skt.getPort()); 

     //data xfer 
     BufferedReader sIn = new BufferedReader(new InputStreamReader(skt.getInputStream())); 
     PrintWriter sOut = new PrintWriter(skt.getOutputStream(), true); 

     //string receiving 
     int count = 1; 
     String msg = ""; 

     while((msg = sIn.readLine()) != null) { 
      while(count < 11) { 
       msg = sIn.readLine(); 
       System.out.println("Received: "+ msg); 
       String returnMsg = msg.toUpperCase(); 
       System.out.println("Capped: "+ returnMsg); 
       sOut.write(returnMsg); 
       count++; 
      } 
     } //end of read from client in while loop 
     if (count == 10) { 
      System.out.println("Max reached."); 
     } 
     srvr.close(); 
     return; 
    } 

    catch(Exception e) { 
     System.out.println("Error caught: " + e); 
    } 

} // end of main 
} // end of class 

そして、これはクライアントです::

これはサーバです

import java.util.Random; 
import java.io.*; 
import java.net.*; 

public class HW2Q1C { 

public static void main(String[] args) throws IOException { 

    String capped = ""; 
    String temp = ""; 

    try { 
     //make the connection 
     Socket skt = new Socket("localhost", 7654); 
     BufferedReader cIn = new BufferedReader(new InputStreamReader(skt.getInputStream())); 
     PrintWriter cOut = new PrintWriter(skt.getOutputStream(), true); 

     //send 11 strings 
     for (int i = 0; i < 11; i++) { 
      temp = Stringer(); 
      cOut.write(temp); 
      System.out.println("Sending: " + temp); 

     } 

     //receive server strings 
     while(cIn.readLine() != null) { 
     capped = cIn.readLine(); 
     System.out.println("From server: "+ capped); 
     } 

     skt.close(); 
    } // end of connection try block 

    catch(Exception e) { 
     System.out.print("Whoops! It didn't work!\n"); 
    } 

} //end of main 

static String Stringer() { 
    String msg, alpha; 
    msg = ""; 
    alpha = "abcdefghijklmnopqrstuvwxyz"; 
    Random rnd = new Random(); 
    for (int i = 0; i < 10; i++) { 
     msg += alpha.charAt(rnd.nextInt(25)); 
    } 
    return msg; 
} 
} //end of class 

ありがとう!

+1

例外が発生したと思いますが、スタックトレースは何ですか?あなたはそれをデバッグしようとしましたか? – Altoyyr

+0

それは私が思ったものですが、コンソールには何もありません。それは完全に空です。 – TurtleOrRodeo

+1

私はちょうどあなたのプログラムを実行し、私が見ることができる限り、接続そのものはうまくいきます。 srvr.accept()は、クライアントが接続するまで待機します(正しく動作します)。これは追加のヘルプの可能性があります。http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html – Altoyyr

答えて

2

あなたの問題が見つかりました。
writeの代わりにprintlnを使用する必要があります。問題は書き込みが実際の行を送信しないということです。string + \nとなり、サーバーは行を読み取ることができません。
私はそれが簡単にテストし、理解しやすくするために、あなたの例を少し変更しますが、これは私の作品:

サーバー:

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

public class Server { 
    public static void main(String[] args) throws Exception { 
     try { 
      //connection 
      ServerSocket srvr = new ServerSocket(7654); 
      Socket skt = srvr.accept(); 
      System.out.println(skt.getPort()); 

      BufferedReader in = new BufferedReader(new InputStreamReader(skt.getInputStream())); 

      String msg = ""; 
      while ((msg = in.readLine()) != null) { 
       System.out.println("Received: " + msg); 
      } //end of read from client in while loop 
      srvr.close(); 
     } catch (Exception e) { 
      System.out.println("Error caught: " + e); 
     } 

    } // end of main 
} // end of class 

クライアント:

import java.util.Random; 
import java.io.*; 
import java.net.*; 

public class Client { 

    public static void main(String[] args) throws IOException { 
     try { 
      Socket socket = new Socket("localhost", 7654); 
      PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 

      for (int i = 0; i < 11; i++) { 
       out.println(Stringer()); //<-- println instead of write 
      } 
      socket.close(); 
     } // end of connection try block 
     catch(Exception e) { 
      System.out.print(e.toString()); 
     } 

    } //end of main 

    static String Stringer() { 
     String msg, alpha; 
     msg = ""; 
     alpha = "abcdefghijklmnopqrstuvwxyz"; 
     Random rnd = new Random(); 
     for (int i = 0; i < 10; i++) { 
      msg += alpha.charAt(rnd.nextInt(25)); 
     } 
     return msg; 
    } 
} //end of class 

SERVEROUTPUT:

受信:scnhnmaiqh
受信:kuofypeefy
受付::tuussdmqqr
は、受信した受信vghsinefdi
:受信ysomirnfit

は受信lbhqjfbdio:受信qhcguladyg
:受信wihrogklfi
を:受信fmpdcbtxqb

が受信tipikgfvsx

をyujtuefqft
+0

それは、ありがとう! – TurtleOrRodeo

関連する問題