java - 如何使两个单独的 Mac 终端(命令提示符窗口)相互发送短信而不会出现 "Address already in use"错误?

标签 java eclipse cmd

我正在尝试用 java 创建一个文本消息程序,它将使用两个单独的 mac 终端(命令提示符窗口)使用 Eclipse 中的两个单独的 .java 文件相互发送和接收文本消息(UTF-8 字符串) (一个是服务器,一个是客户端)(两个.java文件有独立的线程,一个称为Server,另一个称为Client)

左侧窗口为客户端,右侧窗口为服务器

服务器的命令行参数为:

java DirectMessengerServer -l 3000

客户端的命令行参数为:

java DirectMessengerClient 3000

稍后将使用“-l”来区分客户端和服务器(暂时忽略它)

端口号将为 3000。

错误截图: enter image description here

客户端代码(DirectMessengerClient.java):

import java.io.*;
import java.net.*;
import java.util.*;
import static java.nio.charset.StandardCharsets.*;
public class DirectMessengerClient
{
    public static void main(String args[]) throws IOException
    {
        Thread Client = new Thread () 
        {
              public void run ()
              {   
                    System.out.println("Client thread is now running");
                    ServerSocket server_socket = null;
                    Socket client_socket;
                    Socket smtpSocket = null;  
                    DataOutputStream outputstream = null;
                    DataInputStream inputstream = null;

                            try
                            {
                                System.out.println("Try block begins..");
                                int port_number1= Integer.valueOf(args[0]);
                                ServerSocket listener = new ServerSocket(port_number1);
                                System.out.println("Listening for connections..");
                                System.out.println( "Listening on port: " + Integer.toString( port_number1 ) );
                                Socket socket = listener.accept();
                                client_socket= server_socket.accept();
                                BufferedReader reader= new BufferedReader(new InputStreamReader(client_socket.getInputStream(), "UTF8"));
                                PrintWriter output= new PrintWriter( client_socket.getOutputStream(), true );
                                outputstream = new DataOutputStream(smtpSocket.getOutputStream());
                                inputstream = new DataInputStream(smtpSocket.getInputStream());
                                String input_line= reader.readLine();
                                System.out.println( "Received from client: " );
                                System.out.println( input_line );
                                output.println( input_line );
                            }
                            catch ( Exception e )
                            {
                                System.out.println( e.getMessage() );
                            }
                            //server.close();
                       // }
                    }

        };
        Client.start();
    }
}

服务器代码(DirectMessengerServer.java):

import java.io.*;
import java.net.*;
import java.util.*;
import static java.nio.charset.StandardCharsets.*;
public class DirectMessengerServer
{
    public static void main(String args[]) throws IOException
    {
        Thread Server = new Thread () 
        {
              public void run ()
              {   
                    System.out.println("Server thread is now running");
                    ServerSocket server_socket = null;
                    Socket client_socket;
                    String message1;

                    for(int i = 0; i < args.length; i++)
                    {
                        if(args[i].equals("-l"))
                        {
                            try
                            {
                                System.out.println("Try block begins..");
                                int port_number1= Integer.valueOf(args[i+1]);
                                ServerSocket listener = new ServerSocket(port_number1);
                                System.out.println("Listening for connections..");
                                System.out.println( "Listening on port: " + Integer.toString( port_number1 ) );
                                Socket socket = listener.accept();
                                client_socket= server_socket.accept();
                                BufferedReader reader= new BufferedReader(new InputStreamReader(client_socket.getInputStream(), "UTF8"));
                                PrintWriter output= new PrintWriter( client_socket.getOutputStream(), true );
                                String input_line= reader.readLine();
                                System.out.println( "Received from client: " );
                                System.out.println( input_line );
                                output.println( input_line );
                            }
                            catch ( Exception e )
                            {
                                System.out.println( e.getMessage() );
                            }
                            //server.close();
                        }
                    }
              }
        };
        Server.start();
    }
}

我的问题是:有没有办法在具有相同端口号的情况下删除“已使用的地址”,或者也许我应该使用 inetaddress 或其他东西?我不确定如何使这两个程序进行通信(通信是将文本消息从一个程序输出到另一个程序,就像两部手机之间的文本消息一样),但这就是我想知道如何实现的目标

最佳答案

问题是:您启动服务器,端口被服务器占用,只是等待客户端到来,然后您启动客户端,这也以某种方式(可能是复制粘贴问题)创建了一个服务器..然后连接失败,因为该端口已被您以前的服务器使用...

DirectMessengerClient类中删除服务器部分

关于java - 如何使两个单独的 Mac 终端(命令提示符窗口)相互发送短信而不会出现 "Address already in use"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43214395/

相关文章:

java - 使用部分匹配触发字数统计

java - 如何设置 IDEA 为混合的 Scala/Java Maven 项目自动配置 Scala 方面?

java - 如何在 Eclipse Swing 项目中使用 JavaFX

android - 将 android 项目从 eclipse 迁移到 android studio 时出现 "Gradle location is incorrect"

batch-file - 尽管拥有完全控制权,Robocopy 访问仍被拒绝?

java - DateTimeFormatter 支持单个数字的月份日期和年份月份

java - 需要有关 JTable 的帮助吗?

java.lang.Integer.parseInt 不会取 0xFFFFFFFF

windows - CMD Findstr 与 ping

powershell - cmd.exe 和 PowerShell 中提示的颜色(只是提示正确)?