初めてスレッドとソケットを使っているのでチャット(ローカル)をしてみます
ClientA (実際にはサーバー) :
public class ClientA {
public static void main(String[] args) {
ServerSocket servsock = null;
try {
servsock = new ServerSocket(9998);
Socket conn = servsock.accept();
System.out.println("server socket listening on local port : " + servsock.getLocalPort());
System.out.println("socket listening on local port : " + conn.getLocalPort());
System.out.println("socket listening on port : " + conn.getPort());
servsock.close();
TReadingSock tls = new TReadingSock(conn);
tls.start();
TWritingSock tes = new TWritingSock(conn);
tes.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
クライアント B、実際のクライアント:
public class ClientB {
public static void main(String[] args) {
Socket sock = null;
try {
sock = new Socket("localhost", 9998);
System.out.println("socket listening on local port : " + sock.getLocalPort());
System.out.println("socket listening on port : " + sock.getPort());
} catch (IOException e) {
e.printStackTrace();
}
TReadingSock tls = new TReadingSock(sock);
tls.start();
TWritingSock tes = new TWritingSock(sock);
tes.start();
}
}
印刷ショーこれ:
クライアントA:
server socket listening on local port : 9998
socket listening on local port : 9998
socket listening on port : 50875
クライアント B:
socket listening on local port : 50875
socket listening on port : 9998
ばかげているように見えますが、ソケット全体を理解するのに深刻な問題があります。ここで得られるのは、プログラムが異なるポートでリッスンしているということだけです。理由はわかりません。一部の人にとってはかなり明白に見えるに違いないと思うので、私を啓発するためにあなたの助けを求めています!
前もって感謝します。
編集:すべての回答に感謝します。問題は、ポートをリッスンし、接続しようとしているクライアントを受け入れるために ServerSocket が必要なことです。完了すると、Socket オブジェクトが返されます。これをスレッドに渡して、スレッドがジョブを実行できるようにします。これは ClientA 用です。クライアント B はソケットを作成するだけで、9998 ポートに接続しようとします。これは、私が ServerSocket でリッスンしているポートです。次に、それをスレッドに渡します。問題は、クライアント (A から B) を起動し、コンソール A で書き込みを行うと、コンソール B では何も起こらないことです (おそらく、以前に指定する必要があったかもしれません、申し訳ありません)。
ソケットが使用しているポートが原因だと思いました。いくつかのチュートリアルを確認しましたが、あなたの回答を読んだ後でも、何が問題なのかわかりません. 念のため、スレッドの内容を投稿します。
public class TWritingSock extends Thread {
private Socket sockw;
public TWritingSock(Socket sockw){
this.sockw = sockw;
}
@Override
public void run(){
try {
while(true){
//Recuperation des saisies clavier
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//Ecriture de la saisie
PrintWriter pw= new PrintWriter(sockw.getOutputStream(), true);
String typed = br.readLine();
if(typed.equals("fin")){
//sockw.close();
System.out.println("fermé");
break;
}
pw.write(typed);
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
sockw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
と
public class TReadingSock extends Thread {
private Socket sockr;
public TReadingSock(Socket sockr){
this.sockr = sockr;
}
@Override
public void run(){
try {
while(true){
BufferedReader br = new BufferedReader(new InputStreamReader(sockr.getInputStream()));
String typed = br.readLine();
if(typed.equals("fin")){
//sockr.close();
System.out.println("fermé");
break;
}
System.out.println(typed);
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
sockr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}