TCP客户端/服务器

时间:2013-03-13 22:17:27

标签: java sockets tcp

我有这个代码,由于某种原因它停留在服务器端的readline()行总是在等待客户端但另一端的客户端发送数据。

服务器和客户端的代码都可以在下面找到。

服务器代码

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

public class TCPServer {
  public static final int SERVER_PORT = 6789;

  public static void main(String argv[]) throws Exception {
    String clientSentence;
    String capitalizedSentence;

    ServerSocket welcomeSocket = new ServerSocket(SERVER_PORT);

    while (true) {
      Socket connectSocket = welcomeSocket.accept();
      InputStream sin = connectSocket.getInputStream();
      BufferedReader inFromClient = new BufferedReader(new InputStreamReader(sin));

      PrintWriter outToClient = new PrintWriter(connectSocket.getOutputStream(), true);
      clientSentence = inFromClient.readLine();

      capitalizedSentence = clientSentence.toUpperCase() + "\r\n";

      outToClient.print(capitalizedSentence);
    }
  }
}

客户端代码

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

public class TCPClient {

  public static void main(String[] args) throws Exception { 
    String hostName = "localhost";
    int port = 6789;
    String sentence; 
    String modifiedSentence; 

    BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
    Socket clientSocket = new Socket(hostName, port);

    PrintWriter outToServer =  null;
    clientSocket.getOutputStream();

    BufferedReader inFromServer = null;
    inFromServer=new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    sentence = inFromUser.readLine(); 
    outToServer.print(sentence + "\r\n");

    modifiedSentence = inFromServer.readLine();
    System.out.println("FROM SERVER: " +modifiedSentence); 
    clientSocket.close(); 
  } 
}

1 个答案:

答案 0 :(得分:1)

outToServer周围修复语法错误之后,我认为问题在于您在客户端的输出流周围使用PrintWriter的方式。 From the documentation

  

与PrintStream类不同,如果启用了自动刷新,它将会   只有在println,printf或format方法之一时才能完成   调用,而不是每当换行符都出现时   输出。这些方法使用平台自己的行分隔符概念   而不是换行符。

由于您正在使用print手动添加新行,因此消息永远不会刷新到套接字的输出流。我相信您可以使用println来解决此问题:

outToServer.println(sentence);

更好的方法是使用DataInputStreamDataOutputStream代替BufferedReaderPrintWriter,因为它们更适合通过套接字流发送和接收任意数据。