0

谢谢大家看到我的问题。我想用 java 解释一下我在 Socket 上的问题。使用套接字,一个用于服务器等待客户端连接,另一个用于客户端与服务器连接。有两个问题~~

(1)

+++全部连接后,双方就可以互相交换消息了。我已经完成了服务器和客户端的两个应用程序代码,每个代码都有自己的主线程,但我不能让它们相互通信。我使用 windows 命令来运行这两个文件 .class。我先运行服务器,然后运行客户端。他们无法相互交流。我想知道这是否是拥塞的问题。如果我建立另一个线程,这个问题可以解决吗??

(2) 我尝试在两个 Eclipse 上运行这两个应用程序,换句话说,每个 Eclipse 运行一个应用程序。为什么这个问题可以解决??

(3) 这里是我的客户代码:

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

public class CC {
    public static void main(String args[]){
         Socket   client=null;
         DataInputStream in=null;
         DataOutputStream out=null;
         try{
              client=new Socket("127.0.0.1",2060);
              in=new DataInputStream(client.getInputStream());
              out=new DataOutputStream(client.getOutputStream());
              System.out.println("You are a client,you send message to server");
              Scanner cin=new Scanner(System.in);
              while(true){
                String send=null,receive=null;
                System.out.println("Please input Client message sending to server!");
                send=cin.nextLine();
                out.writeUTF(send);
                receive=in.readUTF();
                System.out.println("Message from Server is:"+receive);
                Thread.sleep(500);  
              } 
         }
    
         catch(Exception e){
            System.out.println("break!"+e);
        
         }
        
   }    

}

这是我的服务器代码

 import java.util.*;
 import java.io.*;
 import java.net.*;
 public class SS {
  public  static void main(String args[]){
      ServerSocket socketServer=null;
      DataInputStream  in=null;
      DataOutputStream out=null;
      Socket server;
      try{
          socketServer=new ServerSocket(2060);
      }
      catch(Exception e1){
          System.out.println("can't estblish socketServer "+e1);  
      }
      try{
          Scanner cin=new Scanner(System.in);
          System.out.println("you are server ,please send message to client");
          server=socketServer.accept();  
          in=new DataInputStream(server.getInputStream());
          out=new DataOutputStream(server.getOutputStream());
          while(true){
              String send=null,receive=null;
              receive=in.readUTF();
              System.out.println("get message from client is "+receive);
              System.out.println("send message from client");
              send=cin.nextLine();
              out.writeUTF(send);
         }
      }
      catch(Exception e){
         System.out.println("break! "+e);
      }
  }      
}
4

2 回答 2

0

服务器和客户端代码死锁。

在您编写的客户端代码中send=cin.nextLine();,它会阻塞,直到有更多输入可用。在您编写的服务器代码中,receive=in.readUTF();在输入可用之前,它也会阻塞。

也就是说,在建立连接后,服务器和客户端都希望对方发送导致死锁的内容,并且他们都无限期地等待。

您必须确保服务器或客户端在等待接受输入之前先发送一些输出。

于 2013-04-04T17:55:33.427 回答
0

谢谢,这个问题我已经在我的朋友下解决了。因为我之前运行过这个应用程序,端口被占用了。然后我第二次运行这个应用程序,结果这两个应用程序无法传输消息。这两个应用程序是完全正确的。

于 2013-04-08T15:38:40.733 回答