java - 服务器向客户端套接字发送消息

标签 java sockets

这周我开始使用套接字,但我遇到了困难。 我的目标是当客户端发送消息时,服务器以通知进行响应。 在客户端发送到服务器没有问题,但是服务器发送到客户端时没有任何问题。 有人可以帮我解决这个问题吗?

客户:

    Thread thread = new Thread(new myServerThread());
    thread.start();

class myServerThread implements Runnable {
    Socket socket;
    ServerSocket serverSocket;
    InputStreamReader inputStreamReader;
    BufferedReader bufferedReader;
    String message;
    Handler handler = new Handler();

    @Override
    public void run() {
        try {
            serverSocket = new ServerSocket(5000);
            while (true){
                socket = serverSocket.accept();
                inputStreamReader = new InputStreamReader(socket.getInputStream());
                bufferedReader = new BufferedReader(inputStreamReader);
                message = bufferedReader.readLine();
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(), message,Toast.LENGTH_LONG).show();
                        }
                    });
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
}

服务器:

 String EMAIL = "Email";

   try {        
       serverSocket = new ServerSocket(6000);
       while(true){
       socket = serverSocket.accept();
       inputStreamReader = new InputStreamReader(socket.getInputStream());
       bufferedReader = new BufferedReader(inputStreamReader);
       email = bufferedReader.readLine();


       System.out.println(email);

       if(email.equals(EMAIL)){
           jTextArea1.setText(email);
           try {
            socket = new Socket("localHost", 5000);
            PrintWriter  printWriter = new PrintWriter(socket.getOutputStream());
            printWriter.write(message);
            printWriter.flush();
            printWriter.close();
            System.out.println("connected");


        } catch (IOException e) {
            e.printStackTrace();
        }

       }else{
       }

       }

   } catch (IOException ex) {
   }
    etEmail = findViewById(R.id.etvEmail);

最佳答案

首先是简短的回答:您的 Java 代码几乎都工作得很好。

无论如何,您应该始终针对另一个已知正常的程序来测试您的应用程序。通过将一个自编写的程序与另一个新的自编写的程序进行测试,很难说两者中哪一个被破坏了。看来你正在使用一些 GUI(Android?)来测试它。将相关部分转换为在普通 PC 上运行的简单控制台应用程序可以使故障排除变得更加容易。

那么让我展示一下我如何在我的 Linux 笔记本电脑上检查您的代码:

首先将“客户端”代码复制到“Hello-World”模板中。我添加了一些调试消息和一个循环,允许客户端接收多行文本:

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

class Main
{

    static class myServerThread implements Runnable
    {
        Socket socket;
        ServerSocket serverSocket;
        InputStreamReader inputStreamReader;
        BufferedReader bufferedReader;
        String message;

        @Override
        public void run()
        {
            try
            {
                serverSocket = new ServerSocket(5000);
                while (true)
                {
                    System.out.println("Accepting...");
                    socket = serverSocket.accept();
                    System.out.println("Connected...");
                    inputStreamReader = new InputStreamReader(socket.getInputStream());
                    bufferedReader = new BufferedReader(inputStreamReader);
                    String message = bufferedReader.readLine();
                    while (message!=null)
                    {
                        System.out.println("Received:" + message);
                        message = bufferedReader.readLine();
                    }
                    System.out.println("Closing...");
                    socket.close();
                }

            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args)
    {
        Thread thread = new Thread(new myServerThread());
        thread.start();
    }
}

我启动了“客户端”并打开了另一个命令窗口以打开与 Netcat 的网络连接并发送两行文本:

nc localhost 5000
Hallo
Test

“客户端”程序的相关输出是:

Accepting...
Connected...
Received:Hallo
Received:Test
Closing...
Accepting...

所以“客户端”部分显然运行良好。

接下来,我将您的“服务器”代码复制到“Hello World”模板中:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

class Main
{

    static class myServerThread implements Runnable
    {
        Socket socket;
        ServerSocket serverSocket;
        InputStreamReader inputStreamReader;
        BufferedReader bufferedReader;
        String message;

        @Override
        public void run()
        {
            String EMAIL = "Email";

            try
            {
                serverSocket = new ServerSocket(6000);
                while (true)
                {
                    System.out.println("Accepting...");
                    socket = serverSocket.accept();
                    System.out.println("Connected...");
                    inputStreamReader = new InputStreamReader(socket.getInputStream());
                    bufferedReader = new BufferedReader(inputStreamReader);

                    String message = bufferedReader.readLine();
                    while (message != null)
                    {
                        System.out.println("Received:" + message);

                        if (message.equals(EMAIL))
                        {
                            System.out.println("Sending...");
                            try
                            {
                                socket = new Socket("localHost", 5000);
                                PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
                                printWriter.write(message);
                                printWriter.flush();
                                printWriter.close();
                                System.out.println("sending done");

                            }
                            catch (IOException e)
                            {
                                e.printStackTrace();
                            }

                        }
                        message = bufferedReader.readLine();
                    }
                    System.out.println("Closing...");
                    socket.close();
                }
            }
            catch (IOException ex)
            {
                ex.printStackTrace();
            }
        }
    }

    public static void main(String[] args)
    {
        Thread thread = new Thread(new myServerThread());
        thread.start();
    }
}

我再次添加了一些调试消息和循环,以便服务器可以接收多行文本。由于这个 Java 程序处理两个连接,因此我必须打开两个命令窗口。

在第一个命令窗口中,我告诉 NetCat 接受(监听)端口 5000 上的连接。这就是您的“服务器”将“电子邮件”消息发送到的位置:

nc -lp 5000

在第二个命令窗口中,我告诉 Netcat 连接到端口 6000 上的“服务器”,然后发送两行文本,然后按 Ctrl-C 停止它:

nc localhost 6000
Test
Email
^C

“服务器”程序的相关输出是:

Accepting...
Connected...
Received:Test
Received:Email
Sending...
sending done
Closing...
Accepting...

我在其他(第一个)命令窗口中监听 Netcat 产生了以下输出:

stefan@stefanpc:/hdd/stefan$ nc -lp 5000
Emailstefan@stefanpc:/hdd/stefan$ 

所以在我的机器上一切看起来都很好。除了一个小细节之外:“服务器”发送给客户端(在本例中为 NetCat)的“电子邮件”之后没有换行符。所以修复很简单:

printWriter.write(message+"\n"); 

最后的换行符是必需的,因为您的客户端通过 readLine() 使用输入。

NetCat 是一个非常有用的工具,用于测试纯文本 TCP 套接字通信。它包含在所有 Linux 发行版中。如果您很难找到 Windows 可执行文件,请从我的主页获取:http://stefanfrings.de/avr_tools/netcat-win32-1.12.zip

如果对您有帮助,请评论。

关于java - 服务器向客户端套接字发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60284869/

相关文章:

java - 如何向 Java 进程传递参数?

c - 服务器在限制连接总数时返回的正确 HTTP 状态代码是什么?

java - Jena 在要求缺席 Xerces 的类(class)时失败,而 Xerces 2 已包含在内

java - 使用 Wifi Direct 将 Android 应用程序连接到 PC

node.js - 网络服务器的 UDP 打洞?

.net - 如何使用powershell连接到tcp socket发送和接收数据?

sockets - Windows Phone 7.1 是否支持 SSL 套接字?

java - 有人可以解释二叉搜索树中的递归delete()并帮我转换它吗

java - 如何在时间戳上添加毫秒以获得下一次时间