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

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的消息后也终止发送呢?
    这个我觉得你还需要认真思考下。祝好,有问题再交流。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 opencv 无法读取视频
  • ¥15 用matlab 实现通信仿真
  • ¥15 按键修改电子时钟,C51单片机
  • ¥60 Java中实现如何实现张量类,并用于图像处理(不运用其他科学计算库和图像处理库))
  • ¥20 5037端口被adb自己占了
  • ¥15 python:excel数据写入多个对应word文档
  • ¥60 全一数分解素因子和素数循环节位数
  • ¥15 ffmpeg如何安装到虚拟环境
  • ¥188 寻找能做王者评分提取的
  • ¥15 matlab用simulink求解一个二阶微分方程,要求截图