Java 为什么它说客户端输入流中没有行?(套接字编程)

Java 为什么它说客户端输入流中没有行?(套接字编程),java,sockets,Java,Sockets,我试图编写一个简单的程序,运行一个服务器,然后接受两个客户端。然后其中一个尝试向另一个客户端发送字符串。 但是我的代码不起作用,我也不知道为什么 这是我的TestClient类: public class TestClient extends Thread{ int id; String Name; Socket client; boolean isAsk; public TestClient(int id,String clientName,boolean isAsk) throws I

我试图编写一个简单的程序,运行一个服务器,然后接受两个客户端。然后其中一个尝试向另一个客户端发送字符串。 但是我的代码不起作用,我也不知道为什么

这是我的TestClient类:

public class TestClient extends Thread{

int id;
String Name;
Socket client;
boolean isAsk;


public TestClient(int id,String clientName,boolean isAsk) throws IOException {
    this.id=id;
    this.Name=clientName;
    this.isAsk=isAsk;
}


public void connectTheClientToTheLocalHost(ServerSocket server){
    try {
        client = new Socket("localhost",1111);
        server.accept();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void readFromTerminal(){
    try {
        InputStream is=client.getInputStream();
        OutputStream os = client.getOutputStream();
        PrintWriter pw = new PrintWriter(os);
        pw.println("sdklfsdklfk");
        pw.flush();
        pw.close();
    }catch (IOException e){
        e.printStackTrace();
    }
}
public void closeTheCientSocket(){
    try {
        client.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
public void write(){
    try {

        Scanner sc = new Scanner(client.getInputStream());
        BufferedWriter bw = new BufferedWriter(new FileWriter(new File("file1.txt")));

        String st =sc.nextLine();

        bw.write(st);

        bw.close();

    }catch (IOException e){
        e.printStackTrace();
    }
}

@Override
public void run() {

    if(isAsk){

        readFromTerminal();
    }
    else{

        write();
    }
}
这是主要功能:

public class PCServer {


public static void main(String[] args){

    try {
        ServerSocket s = new ServerSocket(1111);
        TestClient t1=(new TestClient(1,"reza",true));
        TestClient t2=(new TestClient(2,"man",false));
        t1.connectTheClientToTheLocalHost(s);

        t1.start();
        Scanner sc = new Scanner(t1.client.getInputStream());
        String st=sc.nextLine();
        System.out.println(st);
        t1.closeTheCientSocket();

        t2.connectTheClientToTheLocalHost(s);
        PrintWriter pw = new PrintWriter(t2.client.getOutputStream());
        pw.println(st);
        pw.flush();

        t2.start();
        t2.closeTheCientSocket();


    }catch (Exception e){
        e.printStackTrace();
    }
}
}

实际上,这段代码在

String st=sc.nextLine();   
在主函数中,表示未找到行。
问题出在哪里?

java中的ServerSocket通常以另一种方式使用

如果需要点对点连接,一台主机将创建一个ServerSocket并接受连接。示例:

第一个主机示例:

try(ServerSocket serverSocket = new ServerSocket(5555);
    Socket socket = serverSocket.accept();
    // it more convenient to use DataInputStream instead of Scanner I think
    DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
    DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());) {

    while (!Thread.currentThread().isInterrupted()) {
        String msg = dataInputStream.readUTF();
        System.out.println("got request: " + msg);

        dataOutputStream.writeUTF("1-response");
        dataOutputStream.flush();
    }
} catch (IOException e) {
    e.printStackTrace();
}
try(Socket socket = new Socket("127.0.0.1", 5555);
    DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
    DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream())) {

    while (!Thread.currentThread().isInterrupted()) {
        dataOutputStream.writeUTF("2-request");
        dataOutputStream.flush();

        String msg = dataInputStream.readUTF();
        System.out.println("got response: " + msg);
    }
} catch (IOException e) {
    e.printStackTrace();
}
第二台主机示例:

try(ServerSocket serverSocket = new ServerSocket(5555);
    Socket socket = serverSocket.accept();
    // it more convenient to use DataInputStream instead of Scanner I think
    DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
    DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());) {

    while (!Thread.currentThread().isInterrupted()) {
        String msg = dataInputStream.readUTF();
        System.out.println("got request: " + msg);

        dataOutputStream.writeUTF("1-response");
        dataOutputStream.flush();
    }
} catch (IOException e) {
    e.printStackTrace();
}
try(Socket socket = new Socket("127.0.0.1", 5555);
    DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
    DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream())) {

    while (!Thread.currentThread().isInterrupted()) {
        dataOutputStream.writeUTF("2-request");
        dataOutputStream.flush();

        String msg = dataInputStream.readUTF();
        System.out.println("got response: " + msg);
    }
} catch (IOException e) {
    e.printStackTrace();
}
如果您希望一台主机通过服务器(代理)与另一台主机通信,那么您需要主机上的平面java套接字和代理上的ServerSocket,并且代理必须将它从一台主机接收到的消息传输到另一台主机。示例:

代理(在单独的线程或进程中运行)

第二台主机(在单独的线程或进程中运行)


它抛出的异常是什么?没有这样的元素异常:没有行,谢谢。但实际上我想写一个运行服务器的程序,让客户端通过服务器相互交互。@user109107所以broker的例子就是你要找的。客户端将通过代理(服务器)相互交互,但是我的代码有什么问题?我认为我的代码在某种程度上与broker的示例类似,只是我的代码使用不同的方法来完成工作
try(Socket socket = new Socket("127.0.0.1", 5555);
    DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
    DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream())) {

    while (!Thread.currentThread().isInterrupted()) {
        String msg = dataInputStream.readUTF();
        System.out.println("got msg: " + msg);
        TimeUnit.SECONDS.sleep(5);

        dataOutputStream.writeUTF("2");
        dataOutputStream.flush();
    }
} catch (IOException | InterruptedException e) {
    e.printStackTrace();
}