【问题标题】:Java TCP - server & client working, but can't get answerJava TCP - 服务器和客户端工作,但无法得到答案
【发布时间】:2016-10-09 02:56:05
【问题描述】:

我正在尝试制作一个小型 TCP 服务器/客户端。我有一个客户端和一个服务器,在解决了一些基本的异常之后,没有任何效果。 客户端应该将(用户)数据发送到服务器(在端口 6789,本地主机),然后服务器应该将其以大写形式写入并结束。一切似乎都有效,除了发回大写字母。代码如下:

TCP服务器:

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer {

    public static void main(String[] args) throws Exception {

        System.out.println("SERVER");

        String clientSentence;
        String capitalizedSentence;
        ServerSocket server = new ServerSocket(6789);


        TCPClient.main(null);


        while (true) {
            Socket connection = server.accept();
            System.out.println("<S> Connection!");
            BufferedReader fromClient = new BufferedReader(
                new InputStreamReader(connection.getInputStream()) );
            DataOutputStream toClient = new DataOutputStream(connection.getOutputStream());

            clientSentence = fromClient.readLine();
            System.out.println("<S> Recieved: " + clientSentence);

            capitalizedSentence = clientSentence.toUpperCase() + '\n';
            System.out.print("About to send: " + capitalizedSentence);
            toClient.writeBytes(capitalizedSentence);
        }
    }

}

TCP客户端:

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.Socket;

public class TCPClient {

    public static void main(String[] args) throws Exception {

        System.out.println("CLIENT");

        String sentence;
        String modSentence;
        BufferedReader inUser = new BufferedReader(new InputStreamReader(System.in));

        Socket clientToServer = new Socket("localhost", 6789);
        DataOutputStream outServer = new DataOutputStream(clientToServer.getOutputStream());
        BufferedReader inServer = new BufferedReader(
            new InputStreamReader(clientToServer.getInputStream()) );

        System.out.println("<C> Type now: ");
        sentence = inUser.readLine();
        System.out.println("<C> Got it!");

        System.out.println("<C> Sending " + sentence + " to server...");
        outServer.writeBytes(sentence + '\n');
        outServer.flush();

        System.out.println("<C> Server respodse:");
        modSentence = inServer.readLine();

        System.out.println("<C> From server: " + modSentence);
        clientToServer.close();
    }
}

控制台:

SERVER
CLIENT
<C> Type now: 
efd
<C> Got it!
<C> Sending efd to server...
<C> Server respodse:
asd

还有……

什么都没有

【问题讨论】:

  • 您忘记刷新服务器的响应
  • 我想我明白了(终于)!这可能与我在同一个线程上运行客户端和服务器的事实有关,对吧?这样循环永远不会被访问
  • 这些是独立的程序,它们在不同的进程上运行
  • 顺便说一句:很好的编码风格。特别是变量的命名非常好。我将事情推进到更多的方法中,但是对于一个新手来说,非常好的代码!

标签: java tcp


【解决方案1】:

答案是: 我很傻。

我不小心让客户端和服务器在同一个线程上运行。我现在将TCPClient 设为Runnable,一切都按计划进行。

注意: TCPClient.main(null) 不会启动新的程序/线程,只是同一个线程,另一个静态函数。

【讨论】:

    【解决方案2】:

    您在 客户端 端刷新 - 但不是在服务器端!

    只需添加一个

    toClient.flush()
    

    也在服务器端调用!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      • 2019-02-26
      • 2019-02-26
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多