【问题标题】:Chat-Server-Client back and forth messagesChat-Server-Client 来回消息
【发布时间】:2023-03-04 23:13:01
【问题描述】:

我正在尝试制作一个来回发送消息的程序。我似乎已经这样做了;但是,为了来回发送消息,客户端必须首先发送消息才能开始对话。

我想知道如何根据谁先发送消息来发送消息。此外,它们似乎处于交替的对话方式中,如果服务器或客户端发送两条直接消息,则会出现错误......我真的希望这是有道理的。

服务器:

import java.io.*;

import java.net.*;

class Server 

public static void main(String arg[]) throws IOException {

ServerSocket ss = null;

try{

ss = new ServerSocket(1111);

}catch(IOException e){

System.out.println("Failed");}

Socket sock = null;

try{

sock = ss.accept();

}catch(IOException io){
System.out.println("Socket Failed");}

System.out.println("Connection Successful..");

BufferedReader input = new BufferedReader(new InputStreamReader(sock.getInputStream()));

PrintStream output = new PrintStream(sock.getOutputStream());

BufferedReader ServerMessage = new BufferedReader(new InputStreamReader(System.in));

String Message;

while(true){
message= input.readLine();
System.out.println("Clien: " + message);

System.out.println("Server: ");

message = ServerMessage.readLine();

output.println(message);

System.out.println("Server: " + message);

}

}

}

客户:

import java.io.*;

import java.net.*;

class Server 

public static void main(String arg[]) throws IOException {

Socket sock = null;

try{

sock = new Socket("127.0.0.1", 1111);

}catch(IOException io){
System.out.println("Socket Failed");}

System.out.println("Connection Successful..");

BufferedReader in = new BufferedReader(new `InputStreamReader(sock.getInputStream()));`

PrintStream out = new PrintStream(sock.getOutputStream());

BufferedReader ClientMessage = new BufferedReader(new InputStreamReader(System.in));

String Message;

while(true){

System.out.print("Client: ");
Message = ClientMessage.readLine();
output.println(Message);
System.out.println("Client: " + Message);

Message = in.readLine();
System.out.println("Server: " + Message);

}

}

}

【问题讨论】:

标签: java client chat server


【解决方案1】:

您实际上正在寻找的解决方案是“基于对等”的解决方案,并且不适用于带有(普通旧)Java 套接字的一个端口。由于ServerSocket“main”方法是accept(),而(客户端)Socket 的方法是connect():您必须启动两个程序(封装每个程序 Socket 和 一个 ServerSocket),acceptconnect 相互(在不同的端口上)。

(java.net.*) MultiCastSocketDatagrammSocket 之一也可能满足您的需求。

看看我对“简单聊天客户端”的想法:

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

/**
 *
 * @author xerx593
 */
public class SocketPeer {

    public static void main(String args[]) throws IOException {
        //args: <nickName> <server port> <client port>
        startServer(Short.valueOf(args[1]));
        startClient(args[0], Short.valueOf(args[2]));
    }

    private static void startServer(short port) throws IOException {
        final Thread st = new Thread(() -> {
            try {
                //start the server...
                final ServerSocket ss = new ServerSocket(port);
                System.out.println("Listening for connections..");
                //and (blockingly) listen for connections 
                final Socket sock = ss.accept();
                //got one!
                final BufferedReader input = new BufferedReader(new InputStreamReader(
                    sock.getInputStream()//remote input!
                ));
                while (true) {// as long as connected, bad exception otherwise
                    String message1 = input.readLine();// read remote message
                    System.out.println(message1);// print to (local) console
                }
            } catch (IOException ioe) {
                System.out.println(ioe.getMessage());
                ioe.printStackTrace(System.err);
            }
        });
        st.start();
    }

    private static void startClient(String id, short port) {
        final Thread ct = new Thread(() -> {
            Socket sock = null;
            while (sock == null) {
                try {//..to connect with a server
                    sock = new Socket("127.0.0.1", port);
                } catch (IOException io) {
                    System.out.println("Socket Failed.. retry in 10 sec");
                    try {//..retry in 10 secs
                        Thread.sleep(10000);
                    } catch (InterruptedException ex) {
                        ex.printStackTrace(System.err);
                    }
                }
            }
            //sock != null -> connection established
            try {
                System.out.println("Connection Successful..");
                final BufferedReader in = new BufferedReader(new InputStreamReader(
                    System.in //(local!) "keyboard"
                ));
                //remote output
                final PrintStream out = new PrintStream(sock.getOutputStream());
                while (true) {
                    System.out.print(id + ">");
                    final String message1 = in.readLine();
                    out.println(id + ">" + message1);
                }
            } catch (IOException io) {
                System.out.println("Socket Failed");
            }
        });
        ct.start();

    }

}

它在“127.0.0.1”上硬编码,但它可能适用于任何(可配置的)地址。您通过以下方式启动程序的两个实例:

$>java SocketPeer mickey 8081 8082

$>java SocketPeer minnie 8082 8081

这仍然很大程度上取决于您的代码,当然没有太多的错误处理或有用的帮助消息,但仍然是一个不错的工作程序。好好享受! :-)

待办事项:

  • 正确处理命令行参数,并打印帮助/使用信息
  • 参数化 IP 地址
  • 想想该怎么做(如何处理),当一个对等点消失时——“对等点”,或者超过 2 个尝试连接...

【讨论】:

  • 感谢您的帮助,不胜感激
  • 所以我应该用我的程序创建两个类,然后在我的主类中运行它们..?
  • 我可以把它们变成一个“可运行”的语法,而不是我只是吐口水
  • 实际上,这是一个可运行的(使用 java8 lambda 表示法),要使其成为 pre-java-8,请将 new Thread(() -&gt; {...}); 替换为 new Thread(new Runnable(){@Override public void run() {...}});
猜你喜欢
  • 2015-09-27
  • 2012-05-22
  • 1970-01-01
  • 1970-01-01
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
  • 2014-02-28
  • 1970-01-01
相关资源
最近更新 更多