Java客户端/服务器不通过Socket/ServerSocket进行通信

标签 java sockets bufferedreader

我有一个简单的 socket/serversocket 示例,我正在尝试运行该示例,但是当客户端和服务器的 BufferedReader 时,客户端和服务器都会挂起code>s 尝试阅读。以下是每个的代码:

服务器

package picturePerfect;
--imports--

public class PictureServer implements Runnable{
static ServerSocket serverSocket;

public static void main(String[] args) throws IOException {
    serverSocket = new ServerSocket(2342);
    Thread firstSessionThread = new Thread(new PictureServer());
    firstSessionThread.start();
}

@Override
public void run() {
    Socket socket = null;
    try {
        socket = serverSocket.accept();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String clientRequest = bufferedReader.readLine();
        System.out.println(clientRequest);
        PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
        printWriter.println("Sent from server!");
    } catch (IOException e) {
        e.printStackTrace();
    }       
}

}

客户端

package picturePerfect;
--imports--

public class PictureClient {
    public static void main(String[] args) throws UnknownHostException, IOException, InterruptedException {
        Socket socket = new Socket("localhost", 2342);
        PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
        printWriter.write("Sent from client!");
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String response = bufferedReader.readLine();
        System.out.println(response);
        socket.close();
    }
}

这是我可以简化代码的最低限度。我有一个我一直在关注的示例程序,它看起来几乎完全相同。这是示例服务器和客户端(确实工作):

示例服务器

--imports--

public class Server implements Runnable{
    static ServerSocket ss;

    public static void main(String[] args) throws IOException {
        ss = new ServerSocket(3142);
        Thread thread = new Thread(new Server());
        thread.start();
    }

    @Override
    public void run() {
        while ( true ) {
            Socket s = null;

            try {
                s = ss.accept();
                BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
                String operands = br.readLine();
                System.out.println(operands + " was received");
                PrintWriter pw = new PrintWriter(s.getOutputStream(), true);
                pw.println(operands + " right back!");
            } catch ( IOException e ) {
                e.printStackTrace();
            }
        }
    }
}

示例客户端

--imports--

public class Server implements Runnable{
    static ServerSocket ss;


    public static void main(String[] args) throws IOException {
        ss = new ServerSocket(3142);
        Thread thread = new Thread(new Server());
        thread.start();
    }

    @Override
    public void run() {
        while ( true ) {
            Socket s = null;

            try {
                s = ss.accept();
                BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
                String operands = br.readLine();
                System.out.println(operands + " was received");
                PrintWriter pw = new PrintWriter(s.getOutputStream(), true);
                pw.println(operands + " right back!");
            } catch ( IOException e ) {
                e.printStackTrace();
            }
        }
    }
}

我尝试将 while 循环放入我的服务器中,并将我的客户端和服务器移至默认包,但都没有帮助。我还尝试使用 read() 而不是 readLine(),并以 \r\n 结束 printWriter 的行,但同样不成功那里。

为什么我的代码在 readLine() 上挂起,特别是当示例代码没有挂起时?

最佳答案

readline() 的作用是等待它看到一个新行字符,直到它返回,因此是 readLine()。

在您的客户端中,您不需要编写新行。您使用:

printWriter.write("Sent from client!");

相反,使用 println 将换行符写入流中,

printWriter.println("Sent from client!");

关于Java客户端/服务器不通过Socket/ServerSocket进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23067911/

相关文章:

Java soundApi 录音错误

c - 接收C套接字数据分配二维数组

c - "select"在 C socket 中

java - 合并文件中的行以与给定的 header 相对应

java - 如何修复我的 .text 字计数器中的 NullPointerException

java - 读取纯文本文件

java - 如何使maven测试文件夹中的资源可供其他项目使用

java - 一对多查询jpql

Java 问题 - ArrayList 和 Time Elapsed 函数

C套接字接收文件