私は2つの部分でプログラムを作ります。ソケット - Javaクライアント、C#サーバ
パート1:C#server-socket PC上で動作し、コマンドをリッスンし、それに応じて動作するアプリケーション。
パート2:ボタンを押すと、コマンドをPCに送信するJavaクライアントソケットアプリケーションが電話で実行されています。
現在、私はクライアントからサーバにコマンドを送ることができます。 しかし私の問題はこれです:特定のコマンドをサーバーに送信すると、サーバーがクライアントに返信し、クライアントがその応答を読み取るようにします。
クライアントが読み込もうとすると、タイムアウトになります。
Javaクライアントプログラム:
class ClientThread implements Runnable
{
public void run()
{
try
{
Socket socket = new Socket(serverIpAddress, serverPort);
socket.setSoTimeout(5000);
while (true)
{
try
{
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
Log.d("Nicklas", "Out it goes");
out.println(Command);
if (Command == "CMD:GetOptions<EOF>")
{
Log.d("Nicklas", "Getting options");
try
{
Log.d("Nicklas", "Line 1");
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
Log.d("Nicklas", "Line 2");
String answer = in.readLine();
Log.d("Nicklas", "answer = " + answer);
}
catch (Exception ee)
{
Log.d("Nicklasasasas", ee.toString());
}
}
break;
}
catch (Exception e)
{
Log.d("Nicklas", "CAE = " + e.toString());
break;
}
}
socket.close();
}
catch (ConnectException ee)
{
Log.d("Nicklas", "Kunne ikke forbinde");
}
catch (Exception e)
{
Log.d("Nicklasssssss", e.toString());
}
}
}
これを使って呼び出されます。
Thread cThread = new Thread(new ClientThread());
cThread.start();
そして押されたものをボタンに応じて、異なる情報が含まれていますグローバル変数 "Command" を、使用しています。
"String answer = in.readline();"という行でプログラムが失敗します。例外は「java.net.SocketTimeoutException」です。
これはプログラムのC#のサーバの一部です:
次のように呼び出されprivate void ListenForClients()
{
this.tcpListener.Start();
while (true)
{
//blocks until a client has connected to the server
TcpClient client = this.tcpListener.AcceptTcpClient();
//create a thread to handle communication
//with connected client
Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
clientThread.Start(client);
}
}
private void HandleClientComm(object client)
{
TcpClient tcpClient = (TcpClient)client;
NetworkStream clientStream = tcpClient.GetStream();
byte[] message = new byte[4096];
int bytesRead;
while (true)
{
bytesRead = 0;
try
{
//blocks until a client sends a message
bytesRead = clientStream.Read(message, 0, 4096);
}
catch
{
//a socket error has occured
break;
}
if (bytesRead == 0)
{
//the client has disconnected from the server
break;
}
//message has successfully been received
ASCIIEncoding encoder = new ASCIIEncoding();
//System.Diagnostics.Debug.WriteLine(encoder.GetString(message, 0, bytesRead));
string Input = (encoder.GetString(message, 0, bytesRead));
Input = Input.Trim();
object[] obj = new object[1];
obj[0] = Input;
if (Input == "CMD:GetOptions<EOF>")
{
try
{
byte[] buffer = encoder.GetBytes("CMD:Accepted");
clientStream.Write(buffer, 0, buffer.Length);
clientStream.Flush();
MessageBox.Show("Client program asked for reply");
}
catch (Exception e)
{
MessageBox.Show("Oh it no work!: " + e.ToString());
}
}
else
{
Udfor(Input);
}
}
tcpClient.Close();
}
、Form1の(中)
this.tcpListener = new TcpListener(IPAddress.Any, 4532);
this.listenThread = new Thread(new ThreadStart(ListenForClients));
this.listenThread.Start();
C#のサーバが正常に動作するようです、と示していメッセージボックス「クライアントプログラムから返信を求められました」
エラーを発見できる人は誰ですか?
クライアントがサーバーからの応答を受け取っていないように見えますか? SocketTimeoutExceptionは、指定されたタイムアウト内にソケットによって応答が受信されなかった場合にスローされます(例では5秒)。サーバーが応答を送信していますか? – Kerry
さて、IM 100%確実ではないが、99% C#プログラム: IF(入力== "CMD:GETOPTIONS ") {バイト[]バッファ= encoder.GetBytes(" CMD:承認")。 clientStream.Write(buffer、0、buffer.Length); clientStream.Flush(); MessageBox.Show( "ああ、zehオプションが必要でした"); } これは、メッセージが受信された後に実行されます。最後にmessageBoxも表示されているので、返信を送信する –
user1285334