同样的代码为什么我的报异常了

来源:3-5 使用多线程实现多客户端的通信

幕布斯9176636

2019-02-07 23:58

import java.io.*;
import java.net.*;
import java.net.Socket;

import org.omg.CORBA.portable.InputStream;

/**基于TCP协议的服务器端
 *
 */
public class Server {

 public static void main(String[] args) {
  // TODO 自动生成的方法存根
  try {
   
   ServerSocket server=new ServerSocket(7001);
   //调用accept()方法侦听,等待客户端的链接
   System.out.println("服务器已启动,等待客户端的连接");
   Socket socket;
   int count=0;
   while(true) {
    socket=server.accept();
    ServerThread serverthread=new ServerThread(socket);
    serverthread.start();
    count++;
    System.out.println("客户端的数量:"+count);
   }

} catch (IOException e) {
   // TODO 自动生成的 catch 块
   e.printStackTrace();
  }
  
 }

}


import java.io.*;
import java.net.*;
//客户端
public class Clien {

 public static void main(String[] args) {
  // TODO 自动生成的方法存根
  try {
   Socket socket=new Socket(InetAddress.getLocalHost()
     ,7001);
   //获取输出流,用于想服务器端发送信息
   OutputStream os=socket.getOutputStream();
   PrintWriter pw=new PrintWriter(os);//将字节输出流包装成打印流
   pw.write("用户名:admin; 密码:123");
   pw.flush();
   socket.shutdownOutput();//关闭输出流
   //获取输入流,读取服务端响应
   InputStream is=socket.getInputStream();
   BufferedReader br=new BufferedReader(new InputStreamReader(is));
   String info=null;
   while((info=br.readLine())!=null) {
    System.out.println("我是客户端,服务器说:"+info);
    
   }
   br.close();
   is.close();
   pw.close();
   os.close();
   socket.close();
  } catch (UnknownHostException e) {
   // TODO 自动生成的 catch 块
   e.printStackTrace();
  } catch (IOException e) {
   // TODO 自动生成的 catch 块
   e.printStackTrace();
  }
 }

}


import java.io.*;
import java.net.*;
public class ServerThread extends Thread {
 Socket socket;
 public ServerThread(Socket soket) {
  this.socket=socket;
 }
 public void run() {
  BufferedReader br=null;
  OutputStream os=null;
  PrintWriter pw = null;
  InputStreamReader isr=null;
  InputStream is=null;
  try {
   //获取输入流
   //is=socket.getInputStream();
   isr=new InputStreamReader(socket.getInputStream());
   br=new BufferedReader(isr);
   String info=null;
   while((info=br.readLine())!=null) {
    System.out.println("我是服务器,客户端说:"+info);
   }
   socket.shutdownInput();
   
   //获取输出流。响应客户端
   os=socket.getOutputStream();
   pw=new PrintWriter(os);
   pw.write("欢迎您");
   pw.flush();
  } catch (IOException e) {
   // TODO 自动生成的 catch 块
   e.printStackTrace();
  }finally {
   //必须要执行的代码
   //关闭资源
   try {
    if(pw!=null)
     pw.close();
    if(os!=null)
     os.close();
    if(br!=null)
     br.close();
    if(isr!=null)
     isr.close();
    //if(is!=null)
   //  is.close();
    if(socket!=null)
     socket.close();
   } catch (IOException e) {
    // TODO 自动生成的 catch 块
    e.printStackTrace();
   }
  }
  
 }
}

写回答 关注

1回答

  • 慕哥3872218
    2019-02-16 17:41:17

    ServerThread类中  //获取输入流

    import org.omg.CORBA.portable.InputStream;你要导入IO流的包;

    客户端中,Socket socket=new Socket(InetAddress.getLocalHost(),7001);将InetAdress.getLocalHost()直接写成"IP"这种就行了,IP是你自己的IP地址。

    另外是先启动服务端,如果服务端没有启动的话,启动客户端会报错

     br.close();
       is.close();
       pw.close();
       os.close();
       socket.close();   如果多个流连接在一起,直接关闭最终的流就可以了;br.close();os.close();socket.close();

Java Socket应用---通信是这样练成的

分享的是 Java 中的网络编程,使用Socket实现网络聊天通信

125013 学习 · 590 问题

查看课程

相似问题