java套接字输入流

java套接字输入流,java,sockets,Java,Sockets,我正在尝试创建一个简单的客户端-服务器聊天应用程序,使用客户端登录。我已经上网好几天了,现在正在寻找关于我目前遇到的问题的答案。我已经尝试了所有的建议和“解决方案”,但我仍然无法让它正常运行 问题在于流。如果在向服务器发送字符串后关闭客户端输出流,则服务器将成功读取该字符串。但是服务器无法发送回响应,因为套接字已关闭。若我不关闭客户端输出流,服务器将无法读取客户端发送的任何数据。我试过修改我的代码,但没用 这是我的客户代码: import java.io.*; import java.net.*

我正在尝试创建一个简单的客户端-服务器聊天应用程序,使用客户端登录。我已经上网好几天了,现在正在寻找关于我目前遇到的问题的答案。我已经尝试了所有的建议和“解决方案”,但我仍然无法让它正常运行

问题在于流。如果在向服务器发送字符串后关闭客户端输出流,则服务器将成功读取该字符串。但是服务器无法发送回响应,因为套接字已关闭。若我不关闭客户端输出流,服务器将无法读取客户端发送的任何数据。我试过修改我的代码,但没用

这是我的客户代码:

import java.io.*;
import java.net.*;
import java.net.Socket;

public class Client {

public static BufferedReader bf;
public static PrintWriter pw;
public static Socket s;
public static ClientLogin login = new ClientLogin();
public String me;

public static boolean connect(String ip, int port){
    try {
        s = new Socket(ip, port);
        pw = new PrintWriter(s.getOutputStream(), true);
        bf = new BufferedReader(new InputStreamReader(s.getInputStream()));
        new ServerListener().start();

    }catch (ConnectException ce){
        return false;
    } catch (UnknownHostException ex) {
        return false;
    } catch (IOException ex) {
        return false;
    }
    return true;
}

public void send(String msg){
    try{
        if(msg.length()>0){
            pw.write(msg);
            System.out.println("client message sent.. " + msg);
        }
    }catch(Exception e){
        System.out.println("Error in client sender: " + e);
    }
}
}

class ServerListener extends Thread{

@Override
public void run(){

    String res = "";
    String input;
    try{
        System.out.println("client listening....");
        input = Client.bf.readLine();
        System.out.println(input);

        if(input.startsWith("LOGIN")){
            ClientLogin cl = new ClientLogin();
            cl.login(input);
        }else{
            ClientLogin.errorLabel.setText(input);
        }

    }catch(Exception e){ 
        System.out.println("Error in Client listener: " + e); e.printStackTrace();
    }

}

}
服务器代码:

package server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.ServerSocket;
import java.net.SocketException;
import java.util.LinkedList;

public class ChatServer {
    public static final LinkedList<Socket> sockets = new LinkedList<>();
    private static Dbdriver db;
    private static int users;
    static clientThread cl = new clientThread();
    public static InetAddress ia;

public ChatServer(){
    db = new Dbdriver(); //database connection
    db.getClass();
    try{
        users = db.countUsers();
    }catch(Exception e){ e.printStackTrace(); }
}

//START SERVER
public static void startServer(){
    clientThread s = new clientThread();
    s.start();
}

public static void stopServer(){
    try {
        synchronized(ChatServer.sockets){
            for(Socket ss:sockets){
                if(ss.isConnected()){
                    MessengerEngine.pw.close();
                    ss.close();
                }
            }
            sockets.clear();
        }
        cl.theServer.close();
    } catch (IOException ex) {ex.printStackTrace(); }
}

}

class clientThread extends Thread {

public static ServerSocket theServer;

@Override
public void run() {
    int port = 8888;
    try{
        theServer = new ServerSocket(port);

        while(true){
            MessengerEngine engine = new MessengerEngine(theServer.accept());
            engine.start();         
        }
    }catch(SocketException se){
    }catch(Exception e){ 
    }
}
}

class MessengerEngine extends Thread{

public static Dbdriver theDriver;
private Socket theSocket;
    private BufferedReader bf;
    private PrintWriter pw;

    public String ipadd;

public MessengerEngine(Socket s){
    theSocket = s;
    synchronized(ChatServer.sockets){
        ChatServer.sockets.add(theSocket);
    }

try{
        bf = new BufferedReader(new InputStreamReader(theSocket.getInputStream()));
        pw = new PrintWriter(theSocket.getOutputStream(), true);
        ipadd = s.getInetAddress().getHostAddress();
        AdminServer.serverLog.setText(AdminServer.serverLog.getText() + ipadd +" has connected." +"\n");
}catch(Exception e){
        System.out.println("Socket.accept error");
}
}

@Override
public void run(){

    String res = ""; //server response

        try{
            String input = bf.readLine();
            System.out.println("String from client: " + input);
            String[] inputs= input.split("-");

            if(input.startsWith("LOGIN")){ //LOGIN - "LOGIN-name-pass-ip"
                Dbdriver db = new Dbdriver();
                res = db.userLogin(inputs[1], inputs[2], inputs[3]);
                System.out.println("Client logging in sent: " + inputs[1] + ", " + inputs[2] +", " + inputs[3]);
                send(res);
            }
        }catch(IOException e){
            e.printStackTrace(); 
        }
}

public void send(String msg){
    System.out.println("Server trying to send: "+ msg);
    pw.write(msg);
    System.out.println("server sent message..");
}
} 

ChatServer.java:102>>字符串输入=bf.readLine()

在通信完成之前,不得关闭流。这将始终导致关闭插座以及。您需要做的是在将某些内容写入数据输出流后使用
dos.flush()
,以使服务器能够获取信息,并在您完成通信后关闭dos。

这就是我实际上感到困惑的地方。我在写入输出流后尝试了flush()刷新,但是服务器没有读取数据。它只是在等待(我说得通吗?:(您在dis上使用的readLine方法已被弃用。如果您处理的是纯文本,您应该使用读写器。例如,用打印写入器替换dos,用缓冲读写器替换din会有帮助哦。我现在就这样做。:)谢谢!服务器侦听器正在引发异常java.net.SocketException:Connection reset。需要查看堆栈跟踪您不需要创建新的DataOutputStream来关闭它。但是您必须检查每个readLine()的结果如果是空的,那么关闭套接字并退出线程。可能是@EJP的重复,先生。我确保发送的数据不是空的。@Brian Roach感谢这个链接。但是也没有帮助:c最好放弃这个小小的冒险mine@andreianna也许从一开始就应该是一个更好的开始。
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:196)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:154)
at java.io.BufferedReader.readLine(BufferedReader.java:317)
at java.io.BufferedReader.readLine(BufferedReader.java:382)
at server.MessengerEngine.run(ChatServer.java:102)