java - java中的聊天不同步(套接字,线程)

标签 java multithreading sockets chat

我正在尝试找出一种方法,通过在两个客户端之间创建聊天线程,让服务器实例在它们之间进行协商。

我创建了这个项目,它“几乎”可以工作......但似乎存在同步问题的缓冲区。

当在一侧(即 Client#1)写入一行时,它不会传递到另一侧(即 Client#2),但只有在 Client#2 也尝试传递一行之后。

我知道可能有更好的方法来实现此目的,但我想了解我的代码有什么问题。

您的帮助将非常有用!

代码:

服务器

import java.io.*;
import java.net.*;

public class Server
{
    public static void main(String[] args)
    {
        int id = 1;

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

        try
        {
           ServerSocket serverSocket = new ServerSocket(4321);

            while (true)
            {
                Socket client1Socket = serverSocket.accept();
                Socket client2Socket = serverSocket.accept();

                System.out.println("clients connected from ports: \n"
                        + client1Socket.getPort() + ", " + client2Socket.getPort());

                Thread client1Thread = new ServerThread(client1Socket, client2Socket, id);
                client1Thread.start();
                id++;

                Thread client2Thread = new ServerThread(client2Socket, client1Socket, id);
                client2Thread.start();
                id++;
            }
        } 
        catch (IOException ioe) 
        {
            ioe.printStackTrace();
        }
    }
}

服务器线程

import java.io.*;
import java.net.*;
import java.util.*;

public class ServerThread extends Thread 
{
    Socket sourceSocket;
    Socket destSocket;
    int id;

    public ServerThread(Socket src, Socket dst, int n) 
    {
        sourceSocket = src;
        destSocket = dst;
        id = n;
    }

    public void run() 
    {
        try
        {
            Scanner clientInput = new Scanner(sourceSocket.getInputStream());
            PrintStream destOutput = new PrintStream(destSocket.getOutputStream());
            destOutput.println("You are chatting with Client " + id);

            boolean more = true;
            while (more) 
            {
                String input = clientInput.nextLine();
                destOutput.println(input);

                if (input.equals("Q"))
                {
                    more = false;
                }
            }
            sourceSocket.close();
            destSocket.close();
        }
        catch (IOException ex) 
        {
            ex.printStackTrace();
        }
    }
}

客户端

import java.io.*;
import java.net.*;
import java.util.*;

public class Client 
{
    public static void main(String[] args) 
    {
        System.out.println();
        System.out.println("Client");

        try
        {
            Socket clientSocket = new Socket("localhost", 4321);

            System.out.println("Connection Established");
            Scanner input = new Scanner(clientSocket.getInputStream());
            PrintStream output = new PrintStream(clientSocket.getOutputStream());
            Scanner in = new Scanner(System.in);

            System.out.println(input.nextLine());

            boolean more = true;

            while (more) 
            {
                String text = in.nextLine();
                output.println(text);
                String nextInput = input.nextLine();

                if (nextInput == null) 
                {
                    more = false;
                }
                else 
                {
                    System.out.println(nextInput);
                }
            }
        }
        catch (IOException ex) 
        {
            ex.printStackTrace();
        }
    }
}

最佳答案

在您的客户端代码中,行 String text = in.nextLine(); 将阻塞您的线程。这意味着如果您从未在客户端中输入任何内容,您将无法收到任何内容。所以解决方案是将消息接收代码放在另一个线程中。如:

    Thread thread = new Thread(new Runnable() {

                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        while (!Thread.interrupted()) {
                            System.out.println(input.nextLine());
                        }
                    }

                });
                thread.start();

                while (true) 
                {
                    String text = in.nextLine();
                    output.println(text);
//                String nextInput = input.nextLine();
                    ......................
                }

关于java - java中的聊天不同步(套接字,线程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23060994/

相关文章:

java - 为什么 SocketTimeoutException 使我的程序卡住?

sockets - IPv6:监听连接时, `::' 是否等同于 `0.0.0.0'?

java - 如何在 SXSSFWorkbook 和 Apache POI 中使用 vlookup 或公式?

java - 无法使用 ChromeDriver 下载文件

java - 扫描仪问题

c - PThread Create 不创建线程

java - Spark-Kafka-Streaming : Offset Management - Can't get manual commit to work (Java)

c# - Task.Run 如何受 CPU 内核限制?

java - 异步客户端 Java 套接字

java - 通过套接字编程将png图像文件从服务器(桌面)发送到客户端(android)