首页 > 解决方案 > Java 基本并发通信器 - 不完全接受连接

问题描述

我想用一台服务器和几个可以连接并向其发送数据的客户端创建简单的通信器。它在没有任何线程的情况下工作正常,只有一个客户端,但是一旦我尝试合并并发它就不起作用。从客户端的角度来看,有一些连接,我可以发送数据,但没有迹象表明在服务器上接收到该数据。这是服务器类:

    import java.io.*;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.Random;


    public class MyServerSocket implements Runnable
    {
        private ServerSocket serverSocket;

        public MyServerSocket() throws Exception
        {
            Random generator = new Random();
            this.serverSocket = new ServerSocket(generator.nextInt(65000 - 60000) + 60000, 50, InetAddress.getByName("192.168.0.105"));
        }


        public InetAddress getSocketIPAddress()
        {
            return this.serverSocket.getInetAddress();
        }

        public int getPort()
        {
            return this.serverSocket.getLocalPort();
        }

        public void run()
        {
            while (true)
            {
                System.out.println("Running a thread");
                try
                {
                    String data = null;
                    Socket client = this.serverSocket.accept();
                    String clientAddress = client.getInetAddress().getHostName();
                    System.out.println("Connection from: " + clientAddress);

                    System.out.println("Here I am");
                    BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
                    BufferedWriter out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
                    String message = "";
                    while ((data = in.readLine()) != null && data.compareToIgnoreCase("quit") != 0)
                    {
                        message = ("\r\nMessage from " + clientAddress + ": " + data);
                        System.out.println(message);
                        out.write(message);
                    }
                } catch (Exception e)
                {
                    System.out.println("Something went wrong");
                } finally
                {
                    try
                    {
                        serverSocket.close();
                    } catch (IOException e)
                    {
                        e.printStackTrace();
                    }
                }
            }


        }
    }

服务器主要:

import java.lang.Thread;
public class Main 
{

    public static void main(String[] args)
    {
        try
        {
            MyServerSocket socket = new MyServerSocket();
            Runnable runnable = new MyServerSocket();
            System.out.println("Port number: " + socket.getPort() + " IP address: " + socket.getSocketIPAddress());
            Thread thread = new Thread(runnable);
            thread.start();
        }catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

客户端类:

    import java.io.PrintWriter;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.util.Scanner;

    public class ClientSocket
    {
        private Socket socket;
        private Scanner scanner;

        ClientSocket(InetAddress serverAddress, int serverPort) throws Exception
        {
            this.socket = new Socket(serverAddress, serverPort);
            this.scanner = new Scanner(System.in);
        }

        public void sendData() throws Exception
        {
            String data;
            System.out.println("Please type in the message. If you want to terminate the connection, type Quit");
            PrintWriter out = new PrintWriter(this.socket.getOutputStream(), true);
            do
            {
                data = scanner.nextLine();
                out.println(data);
                out.flush();
            }while(data.compareToIgnoreCase("quit") != 0);
            out.println();
        }
    }

客户主要:

    import java.net.InetAddress;
    import java.util.Scanner;

    public class Main
    {
        public static void main(String[] args)
        {
            Scanner scanner = new Scanner(System.in);
            int port;
            System.out.println("Provide port at which you will communicate with the server");
            port = scanner.nextInt();

            try
            {
            ClientSocket socket1 = new ClientSocket(InetAddress.getByName("192.168.0.105"), port);
            socket1.sendData();

            }catch(Exception e)
            {
                System.out.println("Could not connect to the server.");
            }
        }
    }

服务器在即将接受客户端连接时以某种方式停止工作,而客户端工作正常并且似乎已连接到服务器。

标签: javasocketsconcurrency

解决方案


在服务器端,一旦您接受客户端连接,您应该新建一个线程来处理此连接:

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;


public class MyServerSocket implements Runnable {
    private ServerSocket serverSocket;

    public MyServerSocket() throws Exception {
        Random generator = new Random();
        this.serverSocket = new ServerSocket(generator.nextInt(65000 - 60000) + 60000, 50, InetAddress.getByName("192.168.0.105"));
    }


    public InetAddress getSocketIPAddress() {
        return this.serverSocket.getInetAddress();
    }

    public int getPort() {
        return this.serverSocket.getLocalPort();
    }

    public void run() {
        while (true) {
            System.out.println("Running a thread");
            try(Socket client = this.serverSocket.accept()) {

                // new thread to process this client
                new Thread(() -> {
                    try {
                        String data = null;
                        String clientAddress = client.getInetAddress().getHostName();
                        System.out.println("Connection from: " + clientAddress);

                        System.out.println("Here I am");
                        BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
                        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
                        String message = "";
                        while (true) {
                            if (!((data = in.readLine()) != null && data.compareToIgnoreCase("quit") != 0)) break;
                            message = ("\r\nMessage from " + clientAddress + ": " + data);
                            System.out.println(message);
                            out.write(message);
                        }
                    } catch (IOException e) {
                        System.out.println("Something went wrong");
                    } 
                }).start();

            } catch (Exception e) {
                System.out.println("Something went wrong");
            }
        }
    }
}

推荐阅读