исключение Java DataOutputStream - PullRequest
1 голос
/ 30 июня 2010

Исключение выдается в строке 24 при втором наборе чего-либо (после ввода имени хоста) - сервер работает правильно. Код

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.net.SocketOutputStream.write (SocketOutputStream.java:115) в java.io.DataOutputStream.writeBytes (DataOutputStream.java:259) в TCPclient.main (TCPClient.java:52) Java Результат: 1

Сервер:

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 ]

4 голосов
/ 30 июня 2010

Ваш клиент создает один сокет и снова и снова пишет в этот один сокет.Ваш сервер, с другой стороны, делает это:

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

, который принимает входящее соединение, читает одну строку, а затем отказывается от нее (и я предполагаю, что сокет завершает работу, когда сборщик мусора закрываетсясвязь).Затем он ждет нового соединения.

Итак, чтобы решить вашу непосредственную проблему, попробуйте переместить

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

до цикла while.

1 голос
/ 30 июня 2010

Как долго вы ждете между вводом второй строки?Это может быть связано с тем, что сокет простаивает.

Также с таким кодом сервера вы увидите только первое сообщение.Попробуйте это:

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");
        }
    }
}
0 голосов
/ 30 июня 2010

Попробуйте:

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');

Дайте ему шанс. Это, вероятно, слишком простое решение, но это нечто:)

...