私は本当に奇妙な問題に遭遇して、UDPソケットを使用してJavaで本当に基本的なサーバ - クライアントモデルを実装しています。Java UDPソケット - データはサーバ側で残されています
私がしたいのは、ユーザー(クライアント)がサーバーにメッセージを送信し、サーバーがそれを印刷することだけです。
私は例があるが、私は以下の問題があるので、私は何かが欠けています:クライアントは「」それが正しく受信されますサーバーにメッセージを送信した場合
を。 クライアントが "bbb"というメッセージをサーバーに送信すると、正しく受信されます。 クライアントが "c"というメッセージをサーバーに送信すると、サーバーは "cbb"を受信メッセージとして出力します。
サーバーが新しいメッセージを受け取ったときに、何らかの種類のバッファをクリーンアップしているようです。
これは私が使用していたコードです:
サーバー
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPServer {
public static void main(String args[]) throws Exception {
byte[] receive_data = new byte[256];
int recv_port;
DatagramSocket server_socket = new DatagramSocket(5000);
System.out.println("Server - Initialized server. Waiting for client on port 5000");
while (true) {
// System.out.println("Server - Listening for connections...");
DatagramPacket receive_packet = new DatagramPacket(receive_data, receive_data.length);
server_socket.receive(receive_packet);
String data = new String(receive_packet.getData());
InetAddress IPAddress = receive_packet.getAddress();
recv_port = receive_packet.getPort();
if (data.equals("q") || data.equals("Q")) {
System.out.println("Server - Exiting !");
break;
} else {
System.out.println("Server - Client from IP " + IPAddress + " @ port " + recv_port + " said : " + data + " (length: " + receive_packet.getLength() + ")");
}
}
}
}
クライアント
public class UDPClient {
public static void main(String args[]) throws Exception {
byte[] send_data = new byte[256];
BufferedReader infromuser = new BufferedReader(new InputStreamReader(System.in));
DatagramSocket client_socket = new DatagramSocket();
InetAddress IPAddress = InetAddress.getByName("localhost");
System.out.println("Client - Initialized the client...");
while (true) {
System.out.print("Client - Type Something (q or Q to quit): ");
String data = infromuser.readLine();
if (data.equals("q") || data.equals("Q")) {
System.out.println("Client - Exited !");
DatagramPacket send_packet = new DatagramPacket(send_data, send_data.length, IPAddress, 5000);
System.out.println("Client - Sending data : <" + data + ">");
client_socket.send(send_packet);
break;
} else {
send_data = data.getBytes();
DatagramPacket send_packet = new DatagramPacket(send_data, send_data.length, IPAddress, 5000);
System.out.println("Client - Sending data : <" + data + ">");
client_socket.send(send_packet);
}
}
client_socket.close();
}
}
を私は間違いが些細なものですが、ネットワークプログラミングの私のスキルがあるとします限られているので、私はそれが何であるか分かりません。
サーバとクライアントの両方を別の端末の同じマシン(Mac)で実行していますが、状況に影響を与える場合があります。
ご協力いただければ幸いです。
EDIT
...そして私は自分の質問に答えるために戻ってきます。 問題は、サーバーソケットが読み取る予定のデータ量を定義していないことでした。 したがって、私はすべてが順調に働い
String data = new String(receive_packet.getData(), 0, receive_packet.getLength());
で
String data = new String(receive_packet.getData());
を変更したとき。ただ、今後の参考のために、同じ問題に遭遇するかもしれない人々のための
:)
本当に正しいことを、あなたはバイトのいくつかの種類を行う必要があります文字変換へ? –