gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:55:09 25 4
gpt4 key购买 nike

我正在尝试用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com