代码之家  ›  专栏  ›  技术社区  ›  Mr_and_Mrs_D

java DataOutputStream异常

  •  1
  • Mr_and_Mrs_D  · 技术社区  · 14 年前

    import java.io.*;
    import java.net.*;
    
    class TCPclient {
        public static void main(String[] args) throws Exception {
            String hostname, msg;
            InetAddress hostaddress;
            BufferedReader inFromUser = new BufferedReader (new InputStreamReader(System.in));
            System.out.println("Please type host\n");
            hostname = inFromUser.readLine();   //I type localhost
            hostaddress = InetAddress.getByName(hostname);
            Socket cSocket = new Socket(hostaddress, 44444);
            String cAddress = cSocket.getLocalSocketAddress().toString();
            DataOutputStream outToServer = new DataOutputStream (cSocket.getOutputStream());
            while (true)
            {
                msg = inFromUser.readLine();
                System.out.println(msg);
                if (msg.equals("exit"))
                {
                    System.out.println("exit");
                    break;
                }
                outToServer.writeBytes(cAddress + " said : " + msg + '\n'); //this line throws an exception the second time it runs
            }
            cSocket.close();
        }
    }
    

    我是java新手,所以我想我遗漏了一些明显的东西。异常读取:

    java.net.SocketException:软件 错误 位于java.net.SocketOutputStream.socketWrite0(本机方法) 在java.net.SocketOutputStream.socketWrite(SocketOutputStream。java:92) 在java.io.DataOutputStream.writeBytes(DataOutputStream。java:259) 在TCPclient.main(TCPclient。java:52)爪哇

    服务器:

    import java.io.*;
    import java.net.*;
    
    class TCPServer {
       public static void main(String argv[]) throws Exception {
          String clientSentence;
          ServerSocket welcomeSocket = new ServerSocket(44444);
          while(true) {
             Socket connectionSocket = welcomeSocket.accept();
             BufferedReader inFromClient = new BufferedReader(
                    new InputStreamReader(connectionSocket.getInputStream( ) ) );
             clientSentence = inFromClient.readLine();
             System.out.println(clientSentence + "\n");
          }
       }
    }
    
    3 回复  |  直到 13 年前
        1
  •  4
  •   Mark Peters    14 年前

    您的客户机创建一个套接字,并一遍又一遍地写入该套接字。另一方面,服务器执行以下操作:

    ServerSocket welcomeSocket = new ServerSocket(44444);
    while(true) {
       Socket connectionSocket = welcomeSocket.accept();
    

    所以要解决眼前的问题,试着搬家

        Socket connectionSocket = welcomeSocket.accept();
        BufferedReader inFromClient = new BufferedReader(
                new InputStreamReader(connectionSocket.getInputStream( ) ) );
    

        2
  •  1
  •   Georgy Bolyuba    14 年前

    在打第二行之前你要等多久?这可能与套接字空闲有关。

    同样使用这样的服务器代码,您将只看到第一条消息。试试这个:

    import java.io.*;
    import java.net.*;
    
    class TCPServer {
        public static void main(String argv[]) throws Exception {
            String clientSentence;
            ServerSocket welcomeSocket = new ServerSocket(44444);
            Socket connectionSocket = welcomeSocket.accept();
            BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
            while (true) {
                clientSentence = inFromClient.readLine();
                System.out.println(clientSentence + "\n");
            }
        }
    }
    
        3
  •  0
  •   Justian Meyer    14 年前

    尝试:

    while (true)
    {
        if(inFromUser.readLine() != null)
        {        
            msg = inFromUser.readLine();
    
            System.out.println(msg);
            if (msg.equals("exit"))
            {
               System.out.println("exit");
               break;
            }
    
            outToServer.writeBytes(cAddress + " said : " + msg + "\n");
        }
    }
    

    注意这些变化:

    if(inFromUser.readLine() != null)
    { 
    

    ... "\n"); 
    

    ... '\n');
    

    试试看。这可能是一个太简单的解决方案,但它的东西:)