Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java basic并发通信器-不完全接受连接_Java_Sockets_Concurrency - Fatal编程技术网

Java basic并发通信器-不完全接受连接

Java basic并发通信器-不完全接受连接,java,sockets,concurrency,Java,Sockets,Concurrency,我想创建一个简单的通信器,只有一台服务器和几个可以连接并向其发送数据的客户端。没有任何线程,只有一个客户机,它可以正常工作,但一旦我尝试合并并发性,它就不起作用了。从客户端的角度来看,有一些连接,我可以发送数据,但并没有迹象表明服务器上收到了那个些数据。以下是服务器类: import java.io.*; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socke

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

    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.");
            }
        }
    }

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

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

import java.io.*;
导入java.net.InetAddress;
导入java.net.ServerSocket;
导入java.net.Socket;
导入java.util.Random;
公共类MyServerSocket实现可运行{
私有服务器套接字服务器套接字;
public MyServerSocket()引发异常{
随机生成器=新随机();
this.serverSocket=newserversocket(generator.nextInt(65000-60000)+60000,50,InetAddress.getByName(“192.168.0.105”);
}
公共地址getSocketIPAddress(){
返回此.serverSocket.getInetAddress();
}
公共int getPort(){
返回此.serverSocket.getLocalPort();
}
公开募捐{
while(true){
System.out.println(“运行线程”);
try(套接字客户端=this.serverSocket.accept()){
//处理此客户端的新线程
新线程(()->{
试一试{
字符串数据=null;
字符串clientAddress=client.getInetAddress().getHostName();
System.out.println(“连接源:“+clientAddress”);
System.out.println(“我在这里”);
BufferedReader in=新的BufferedReader(新的InputStreamReader(client.getInputStream());
BufferedWriter out=新的BufferedWriter(新的OutputStreamWriter(client.getOutputStream());
字符串消息=”;
while(true){
如果(!((data=in.readLine())!=null和&data.compareTignoreCase(“退出”)!=0))中断;
消息=(“\r\n来自“+clientAddress+”:“+data”的消息);
System.out.println(消息);
写出(信息);
}
}捕获(IOE异常){
System.out.println(“出错”);
} 
}).start();
}捕获(例外e){
System.out.println(“出错”);
}
}
}
}

好的,我以某种方式解决了这个问题,但我仍然需要了解它是如何工作的:

  • 在try块内接受连接,没有finally块(也没有try with resources),所以套接字一直处于打开状态

  • 修改了main方法,所以其中根本没有线程或可运行对象。整个过程在课堂上完成:

  • 代码:


    如果有人能指出这个最终版本代码中仍然存在的错误,我将不胜感激。

    仍然有相同的输出。@SzK抱歉,我忘记删除您的
    finally
    片段,您不应该在接受客户端连接后关闭serverSocket。我有更新代码,您可以尝试我的新代码片段。@SzK您从未显示程序输出的内容。我只能猜测你的意图,我认为我的服务器端代码是正确的。@Szk你可以尝试修改你的主代码作为你的后续自我应答。如果运行一个带有
    start
    的线程,并且主线程立即退出,那么服务器程序永远不会真正完全启动。这不是我的服务器端代码的问题,请尝试参考资料,它只关闭与一个特殊客户机的连接。服务器类的一切都很好—问题在于主类。终于一切顺利了,谢谢你的帮助。
    public class Main 
    {
            public static void main(String[] args)
            {
                try
                {
                    MyServerSocket socket = new MyServerSocket();
                    System.out.println("Port number: " + socket.getPort() + " IP address: " + socket.getSocketIPAddress());
                    socket.run();
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
    }