发送/接收时出现套接字错误

时间:2017-09-19 19:07:43

标签: java sockets

如果我发送消息,只有在我循环运行时才会打印出来。

我尝试在1分钟后发送消息,发送50次,但没有任何内容会在服务器端打印出来。

我的错误是什么?

这是我的代码,它是用Netbeans编写的:

package me.jackboyplay.jc_cloudsystem.mechaniken;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author JackboyPlay
 */
public class SocketClient extends Thread {

    private Socket socket;

    public SocketClient(Socket socket){
        this.socket = socket;
        System.out.println("Ein Client wurde akzeptiert.");
    }

    @Override
    public void run() {
        BufferedReader br;
        PrintWriter pw;
        try {
            br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            pw = new PrintWriter(socket.getOutputStream());

            while(true){
                String line = br.readLine();
                System.out.println(line);
            }

        } catch (IOException ex) {
            Logger.getLogger(SocketClient.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

}

Internal Server Error

Class 1是向服务器发送消息的客户端。

Class 2是将打印出消息的服务器。

1 个答案:

答案 0 :(得分:0)

服务器正在使用BufferedReader.readLine(),但客户端没有发送任何换行符,因此readLine()永远不会返回:

  

读取一行文字。一条线被认为是由换行符('\ n'),回车符('\ r')或回车符后面的任何一个终止。

客户端应该使用PrintWriter.println()而不是PrintWriter.write()

  

通过写行分隔符字符串来终止当前行。行分隔符字符串由系统属性line.separator定义,不一定是单个换行符('\ n')。

dos.println("X: " + i);
  

打印字符串然后终止该行。此方法的行为就像调用print(String)然后调用println()

或者,使用PrintWriter.print()根据需要编写值,然后在完成时调用PrintWriter.println()

dos.print("X: ");
dos.print(i);
dos.println();

无论哪种方式,您可能还需要调用PrintWriter.flush()来实际通过网络发送输出:

dos.flush();