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 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序