java - Chat-Server-Client 来回消息

标签 java client chat server

我正在尝试制作一个来回发送消息的程序。我似乎已经做到了;但是,为了能够来回发送消息,客户端必须首先发送一条消息以启动对话。

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

服务器:

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 套接字的一个端口上工作。因为 ServerSocket“main”方法是 accept() 而(客户端)Socket 的方法是 connect():你必须启动两个程序(封装每个 Socket 和一个 ServerSocket),接受连接相互(在不同的端口)。

(java.net.*) MultiCastSocket 之一或 DatagrammSocket也可能符合您的需求。

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

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 个尝试连接时要做什么(如何处理)...

关于java - Chat-Server-Client 来回消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29629445/

相关文章:

java - 对 hazelcast ISet 和 IList 的支持即将上线

java - 在java中使用线程计算所用的总时间

iphone - 关于服务器/客户端结构 iOS App 开发的服务器实现的建议?

java - LDAP 的 Java 客户端

client - Jena 桌面 SPARQL 客户端 (TDB)?

chat - QuickBlox:如何清理组对话框而不删除它?

java - ZipException:重复输入异常

java - 清除 Swing 中按钮单击操作的文本字段

javascript - 我正在开发一个 Vuejs 聊天应用程序,单击输入消息框时,如何在 Android 中显示键盘时发送整个输入 div

ios - PUBNUB + IOS 如何管理后台在线/离线/离开状态?