2010-06-30 96 views
1

第二次输入内容(在输入主机名后)第24行抛出异常 - 服务器正常工作。代码java DataOutputStream异常

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.java:92(SocketOutputStream.java:92) at java.net.SocketOutputStream.write(SocketOutputStream.java:115) at java.io.DataOutputStream.writeBytes(DataOutputStream.java:259) at 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"); 
     } 
    } 
} 
+0

相关:http://stackoverflow.com/questions/2126607/official-reasons-for-software-caused-connection-abort-socket-write-error – BalusC 2010-06-30 16:57:50

+0

谢谢 - 我认为这对我来说一定是简单的 - “服务器”总是接收我输入的第一个字符串,而我在第二个字符串上遇到异常 - 这不是我混淆了我的字符串或任何东西 – 2010-06-30 17:02:41

+0

@dardana:这很很难知道发生了什么,不知道服务器是什么。 – 2010-06-30 17:11:44

回答

4

您的客户端创建一个套接字,并再次写入遍地一个插座。您的服务器,而另一方面,这是否:

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

接受传入连接,读取一行,然后放弃它(我猜的插座中的finalize被垃圾收集时,它关闭连接)。然后它等待一个新的连接。

所以要立即解决问题,请尝试while循环之前移动

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

+0

谢谢 - 我是一个新手,它显示:)我会尝试你所说的 – 2010-06-30 17:45:56

+0

是的 - 作品! 因此连接已关闭 - 这就是为什么我得到异常? – 2010-06-30 17:52:44

+0

没错。服务器端点放弃了连接并停止读取它。回想一下,服务器套接字能够接受来自*多个*客户端套接字的传入连接。但是,一旦通过'accept'接受了连接,检索到的套接字就是持久的(通过TCP/IP的魔力)。每次你想发送数据时都不需要重新建立连接。 – 2010-06-30 19:00:50

1

打字第二行之间等待多久?这可能与套接字空闲有关。

此外,与这样的服务器代码,你只会看到第一条消息。试试这个:

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

非常感谢 - 我会立即尝试你的建议 - 谢谢 – 2010-06-30 17:45:04

+0

工程 - 谢谢 - 它不是插座闲置,但连接关闭(???) – 2010-06-30 17:54:39

+0

我倾向于同意马克彼得斯:你只是收到第一条消息后,放弃所有对服务器套接字的引用。在某些时候,套接字将被关闭,您将得到异常。 – 2010-07-01 06:38:45

0

尝试:

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

给它一个镜头。这可能是一个简单的解决方案,但它的东西:)

+0

发送每两行中的第二行并将字符文字转换为字符串文字将无助于套接字问题。 – 2010-07-01 06:36:46