【问题标题】:Java networkingJava 网络
【发布时间】:2014-11-21 19:31:53
【问题描述】:

我正在使用Socket 制作一个简单的网络。

它工作正常,但问题是它像棋盘游戏一样工作

每次服务器必须等待客户端,客户端就会等待服务器,以此类推。

每当我从任何一方输入数据时,我都希望数据从服务器发送到客户端以及从客户端发送到服务器。

这是我在服务器中的一部分代码

in = Integer.parseInt(myInputStream.readLine())); // server gets data
out = new Scanner(System.in).nextInt(); 
myOutputStream.println(column);  // server sends data

【问题讨论】:

  • 如果我理解正确的话,服务器也应该是客户端,客户端也应该是服务器?所以基本上你需要建立2个连接。一个从 A 到 B,一个从 B 到 A。
  • 您好,不知怎的,我无法理解您要说的内容。请提供更多代码或再次深入解释。打开 Socket 时,调用(acceptreceive)将阻塞并等待传入​​连接(如果是 ServerSocket)或传入数据报(如果是 DatagramSocket)。所以在那种情况下,“等待”对我来说是可以的。 (download.oracle.com/javase/tutorial/networking/sockets/…)
  • @THelper 有可能吗?理论上至少?
  • @nyyrikki 只是我不想让任何一方等待对方的数据......

标签: java sockets networking


【解决方案1】:

一句话:线程。您的应用程序在每一端都需要多个线程。特别是,应该有线程专门用于在每一端维护传入和传出消息的队列,以便想要发送或接收消息的代码不必等待。

这是一个非常大的话题——我无法真正告诉你具体该怎么做。我建议您从 Java 教程的 Concurrency 章节开始。

【讨论】:

  • 将套接字的“发送”部分放在主类中。然后你可以随时发送,例如按下按钮。将接收部分放在一个单独的线程中的 while 循环中 - 这将在自己的时间等待传入的消息,而不影响其余部分。
  • 嗯,不,不是真的。如果您同步发送,那么如果网络很慢,您将需要等待发送。最好在专用线程中同时执行。
  • 如你所说。但是通过 LAN 发送一个简单的字符串不会超过一秒钟。我创建了许多 LAN 聊天室/游戏/应用程序,它们可以立即发送内容,即使我正忙于通过网络复制文件。但你说的欧内斯特仍然是真的! ...我创建了一个应用程序,它每半秒发送一次屏幕截图,并且没有发生滞后/延迟。
  • 我创建了 2 个线程,一个用于读取,另一个用于写入,但是当我运行时它给了我异常...
    检查它们
    pastebin.com/mEsLKAH4<br> pastebin.com/KCqenKnT
    @987654324 @
【解决方案2】:

我希望从服务器发送数据 到客户端和从客户端到服务器 每当我从任何一方输入数据时..

为了实现上述目的,您的客户端和服务器都需要为multi-threaded。因此,虽然每一侧的一个线程都在侦听来自另一个对等方的数据,但消息的处理实际上是由另一个线程完成的。

如果您之前没有使用任何语言进行多线程编程,这可能是一项艰巨的任务,所以下面是一个开始的链接:

Multithreaded Client/Server Applications

然后,您可以访问以下链接以获得更好的构建游戏的想法:

Network Programming Example: A Networked Game Framework

【讨论】:

    【解决方案3】:
    Server.java
    
    
    import java.io.*;
    
    import java.net.*;
    
    public class Server implements Runnable {
    
    String messageIN, messageOUT;
    Thread t1 = null, t2 = null;
    BufferedReader b1, b2;
    ServerSocket ss;
    Socket s;
    PrintWriter p1;
    
    Server() {
        try {
            ss = new ServerSocket(8000);
            System.out.println();
            System.out.println("Server is Waiting . . . . . ");
            s = ss.accept();
            System.out.println();
            System.out.println("Client Connected ! ! ! ");
            t1 = new Thread(this);
            t2 = new Thread(this);
            t1.start();
            t2.start();
        } catch (Exception e) {
            System.out.println(e);
        }
    }
    //----------------------------------------------------------------------------------------
    
    public void run() {
    
        if (Thread.currentThread() == t1) {
            try {
                b1 = new BufferedReader(new InputStreamReader(System.in));
                p1 = new PrintWriter(s.getOutputStream(), true);
    
                do {
                    System.out.println();
                    messageIN = b1.readLine();
                    System.out.println("Server Says : : : "+messageIN);
                    p1.println(messageIN);
                } while (!messageIN.equals("END"));
            } catch (Exception ex) {
            }
    
    
        } else {
            try {
                b2 = new BufferedReader(new InputStreamReader(s.getInputStream()));
                do {
                    messageOUT = b2.readLine();
                    System.out.println("Client Says : : : " + messageOUT);
                    System.out.println();
                } while (!messageOUT.equals("END"));
            } catch (Exception e) {
            }
        }
    }
    //----------------------------------------------------------------------------------------
    
    public static void main(String[] args) {
        new Server();
    }
    }
    
    //-----------------------------------------------------------------------------------------
    

    Client.java

    import java.io.*;
    import java.net.*;
    
    
    
     public class Client implements Runnable {
    
    String messageIN, messageOUT;
    Thread thread1 = null, thread2 = null;
    BufferedReader br1, br2;
    Socket s;
    PrintWriter pw;
    
    Client() {
        try {
            System.out.println();
            System.out.println("Going to connect to Server");
            s = new Socket("localhost", 8000);
            System.out.println();
            System.out.println("Connected");
            thread1 = new Thread(this);
            thread2 = new Thread(this);
            thread1.start();
            thread2.start();
        } catch (Exception ex) {
            System.out.println("ex = " + ex);
        }
        }
       //-----------------------------------------------------------------------------------------
    
      public void run() {
        if (Thread.currentThread() == thread2) {
            try {
                br1 = new BufferedReader(new InputStreamReader(System.in));
    
                do {
                    System.out.println();                    
                    messageIN = br1.readLine();
                    System.out.println("Client Says : : "+messageIN);
                    pw = new PrintWriter(s.getOutputStream(), true);
                    pw.println(messageIN);
                } while (!messageIN.equals("END"));
            } catch (Exception ex) {
            }
    
    
    
        } else {
            try {
                do {
                    br2 = new BufferedReader(new InputStreamReader(s.getInputStream()));
                    messageOUT = br2.readLine();
                    System.out.println("Server Says : : : " + messageOUT);
                    System.out.println();
                } while (!messageOUT.equals("END"));
    
            } catch (Exception e) {
            }
    
        }
     }
    
    //----------------------------------------------------------------------------------------  
    public static void main(String[] args) {
        new Client();
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-21
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多