PacosonSWJTU
2016-01-30 14:58
采纳率: 66.7%
浏览 2.9k
已采纳

Socket获取outputStream 抛出异常

0)功能简介:

利用 socket 模拟qq 的消息发送和接收功能。既可以接收消息,也可以发送消息,无论是server 还是 client。在server 和 client 端都开启了两个线程, 一个线程用于接收并打印消息,一个线程用于发送消息。

1)问题简介:

先启动 server ,后启动client 去连接server, client 端抛出异常,说, socket 获取outputStream失败。。找不到原因啊。。oh。 求高手解答。
图片说明

2)client代码如下:

 package com.corejava.chapter3;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class AnalogQQClient
{
    public static void main(String[] args) throws IOException
    {
        try(Socket socket = new Socket("127.0.0.1", 8189))
        {
            new Thread(new Runnable() // print server's info
            {
                @Override
                public void run()
                {
                    try
                    {
                        Scanner scanner = new Scanner(socket.getInputStream());
                        while(true)
                        {
                            if(scanner.hasNext())
                            {
                                String line = scanner.nextLine();
                                System.out.println("from client: " + line);
                                if(line.equals("bye"))
                                {
                                    break;
                                }                           
                            }                       
                        }
                    } catch (IOException e)
                    {
                        e.printStackTrace();
                    }
                }
            }).start();

            new Thread(new Runnable() // send info typed to the server
            {
                @Override
                public void run()
                {
                    try
                    {
                        PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
                        while(true)
                        {
                             Scanner scanner = new Scanner(System.in);
                             if(scanner.hasNext())
                             {
                                 writer.println("from server: " + scanner.nextLine());
                             }
                        }
                    } catch (IOException e)
                    {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
        finally
        {
            System.out.println("the client is closed !");
        }
    }
}

3)server 代码如下:

 package com.corejava.chapter3;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class AnalogQQServer
{
    public static void main(String[] args) throws IOException
    {
        try(ServerSocket serverSocket = new ServerSocket(8189))
        {
            Socket socket = serverSocket.accept();

            new Thread(new Runnable() // print client's info
            {
                @Override
                public void run()
                {
                    try
                    {
                        Scanner scanner = new Scanner(socket.getInputStream());
                        while(true)
                        {
                            if(scanner.hasNext())
                            {
                                String line = scanner.nextLine();
                                System.out.println("from client: " + line);
                                if(line.equals("bye"))
                                {
                                    break;
                                }                           
                            }                       
                        }
                    } catch (IOException e)
                    {
                        e.printStackTrace();
                    }
                }
            }).start();

            new Thread(new Runnable() // send info typed to the client
            {
                @Override
                public void run()
                {
                    try
                    {
                        PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
                        while(true)
                        {
                             Scanner scanner = new Scanner(System.in);
                             if(scanner.hasNext())
                             {
                                 writer.println("from server: " + scanner.nextLine());
                             }
                        }
                    } catch (IOException e)
                    {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
        finally
        {
            System.out.println("the server is closed !");
        }
    }
}


  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • 毕小宝 2016-01-30 22:52
    已采纳

    分析了下你的代码,根本原因是你用了jdk1.7的try()操作,将客户端的Socket写在try()后面了,导致启动的两个线程还在使用socket时,jdk已经自动将该socket关闭了。
    修改方法很简单,将Client端的try()括号里面的代码挪到{}中,然后使用完成后手动关闭。

     try {
                Socket socket = new Socket("127.0.0.1", 8189);
    

    这样修改后就可以正常通信了,但是你的通信终止操作还需要再设计下,因为你是开启了多个线程来通信的,怎么让客户端在收到bye的消息后也终止发送呢?
    这个我觉得你还需要认真思考下。祝好,有问题再交流。

    点赞 打赏 评论
  • devmiao 2016-01-30 15:54
    点赞 打赏 评论

相关推荐 更多相似问题