グーグルで時間を費やし、可能な限りすべての手段を試してみたら、なぜ私のコードが機能していないのかを少し説明することにしました。これは私が達成したいものです::Javaクライアントに関する問題<-->サーバソケット
クライアントとサーバーのソケットがあります。クライアントソケットは、サーバーにメッセージを送信します(例えば、"add:2:3" to add 2 and 3
など)。サーバーは応答で応答する必要があります。応答が到着すると、クライアントは"subtract:5:8" to subtract 5 from 8
のような追加のメッセージを送信することができます。したがって、クライアントはメッセージを送信し、応答を取得し、次のメッセージを送信して応答を取得します。コマンドラインからメッセージを送信しています。
これは私が今持っているものですが、それは::私が読んするために、2つのスレッドを使用することを決定し、クライアントのために
// Serverコード
public class MT extends Thread{
private Socket sock;
private BufferedReader rd;
private OutputStreamWriter wr;
private Client client;
public MT(Socket sock) throws IOException {
this.sock= sock;
rd = new BufferedReader(new InputStreamReader(sock.getInputStream()));
wr = new OutputStreamWriter(sock.getOutputStream());
wr.write("You are welcome" + "\n");
wr.flush();
}
public void run(){
try{
while(true){
String command = reader.readLine();
// Will process data here and then send results to client
// At the moment i just want to send the message back to client
wr.write(command + "\n"); // send results to client
}
}
}
}catch(IOException ex){
System.err.println("Problem reading data from client");
}
}
}
public class MyServio {
public static void main(String[] args) {
try(ServerSocket server = new ServerSocket()){
server.bind(new InetSocketAddress("0.0.0.0", 4444));
System.out.println("Listening...");
try{
while(true){
Socket con = server.accept();
Thread a = new MT(con);
a.start();
}
}catch(IOException ex){
System.err.println("Problem...");
}
}catch(IOException ex){
System.err.println("Server Issues");
}
}
}
//クライアント
が動作していませんサーバーに書き込みます。
public class MyRead extends Thread{
private BufferedReader r;
public ReadFromServer(BufferedReader r){
this.r = r;
}
@Override
public void run() {
StringBuilder m = new StringBuilder();
try {
while(true){
message.append(r.readLine());
System.out.println(m);
}
} catch (IOException e) {
System.out.println("Problem in MyRead");
e.printStackTrace();
}
}
}
public class MyWrite extends Thread{
private OutputStreamWriter w;
Scanner sc;
public WriteToServer(OutputStreamWriter w){
this.w = w;
sc = new Scanner(System.in);
}
@Override
public void run() {
try {
while(true){
System.out.print("Type message: ");
String msg = sc.nextLine();
w.write(msg + "\n");
w.flush();
}
} catch (IOException e) {
System.out.println("Problem in MyWrite");
e.printStackTrace();
}
}
}
public class CSock {
private OutputStreamWriter w;
private BufferedReader r;
public ClientSocket() {}
public void do(){
InetAddress ad = null;
try {
ad = InetAddress.getByName("127.0.0.1");
} catch (UnknownHostException e) {
System.err.println("Error InetAddress");
}
try (Socket s = new Socket(addr, PORT)) {
System.out.println("Server connecting...");
StringBuilder message = new StringBuilder();
r = new BufferedReader(new InputStreamReader(s.getInputStream()));
w = new OutputStreamWriter(s.getOutputStream());
message.append(r.readLine()); // reads the welcome message from server
System.out.println(message);
// I start the read and write threads so that the client can read and write message to the server
ReadFromServer rd = new ReadFromServer(r);
WriteToServer wt = new WriteToServer(w);
rd.start();
wt.start();
} catch (IOException ex) {
System.err.println("problem connecting to server");
}
}
}
public class Main {
public static void main(String[] args){
ClientSocket clientSocket = new ClientSocket();
clientSocket.do();
}
}
私はサーバーを最初に起動してからクライアントを起動しますが、クライアントは、例外を与える:::
Problem in MyRead
java.net.SocketException: socket closed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:170)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:161)
at java.io.BufferedReader.readLine(BufferedReader.java:324)
at java.io.BufferedReader.readLine(BufferedReader.java:389)
at model.ReadFromServer.run(ReadFromServer.java:31)
例外の最後の行は、コード内のmessage.append(reader.readLine());
が問題であることを示しています。私はコードをどこでもソケットや入力ストリームや出力ストリームを閉じることはありませんが、この例外が発生します。
また、任意の助けが
おかげ
UPDATEを理解されるであろう::
writer.flush();
次の行でrun()
方法でMyWrite
クラスに似たsocket closed
例外を取得例外の問題が解決/解決されました。もう一つの問題がある、あなたが私を助けることができるかもしれない。 "MyRead"スレッドが機能していません。コマンドラインでメッセージを入力してEnterキーを押すと、サーバーにデータが送信されますが、データはサーバーからクライアントに返されますが、MyReadはデータを読み取っていません。いつでも私はコマンドプロンプトでEnterキーを押すと、メッセージ "Type message:"が再び表示されます。私はサーバーからメッセージを取得しません。サーバーにメッセージを送信するたびに、結果をクライアントに送り返してから、別のメッセージを送信することができます。どんな助けもありがとう。ありがとう
あなたの答えに感謝します。 –
私は投稿を更新しました –