服务端:        public void showById() throws IOException   
        {   
            //接收客户端传来的商品ID   
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));    
   String goodsid1=br.readLine();   
   int goodsid = Integer.parseInt(goodsid1);   
System.out.println(goodsid);   //可以读出
 ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());   
//遍历集合   
for(int i = 0 ; i< goodsData.size(); i++)   
{   
ShopGoods sg = goodsData.get(i);   
//查询单品   
if(sg.getGid()==goodsid)   
{   
oos.writeObject(goodsData);    
System.out.println("ssssssssss");           //此行读不出
}   
}   
}  
客户端:public void getGoodsTable() throws IOException,   
ClassNotFoundException   
{   
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));   
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));   
System.out.println("请输入您要查询的商品编号:");   
goodsid = br.readLine();   
bw.write(goodsid);   
bw.flush();   
bw.close();   
br.close();   
System.out.println("商品编号"+"\t\t"+"商品名称"+"\t\t"+"商品单位"+"\t\t"+"商品价格"+"\t\t"+"商品数量");        
ois = new ObjectInputStream(s.getInputStream());           
ArrayList<ShopGoods> goodsData =(ArrayList<ShopGoods>)ois.readObject();   
for (ShopGoods sg : goodsData) {   
System.out.println(" "+sg.getGid()+"\t\t"+sg.getGname()+"\t"+"     "+   
sg.getGmean()+"\t\t"+"  "+sg.getGprice()+"\t\t"+"  "+sg.getGnum());   
                }   
            }  客户端报错:socket is closed;服务端报错:oftware caused connection abort: socket write error;

解决方案 »

  1.   

    java.net.SocketException: Socket is closed,
    该异常在客户端和服务器均可能发生。异常的原因是己方主动关闭了连接后(调用了Socket的close方法)再对网络连接进行读写操作。
    java.net.SocketException: (Connection reset或者Connect reset by peer:Socket write error)。
    该异常在客户端和服务器端均有可能发生,引起该异常的原因有两个,第一个就是如果一端的Socket被关闭(或主动关闭或者因为异常退出而引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer)。另一个是一端退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常(Connection reset)。简单的说就是在连接断开后的读和写操作引起的。
      

  2.   

    介个我看了很多遍了,不是很明白,太宽泛了,整个程序木有调用close()方法,服务端soocket写成死循环了(通过客户端传过来的类型判断该进入哪个模块),客户端socket我试着在发送商品编号之前又初始化一遍,but会报connection reset  
    我在想是不是集合写错了
      

  3.   

    如果方便的话,代码贴全点。我COPY了看下,前段时间一直弄这个。
      

  4.   

    就用List传一次,希望能给你点帮助吧:
    Server: try{
         ServerSocket ss=new ServerSocket(8090);
         System.out.println("我是服务器,在8090端口监听");
         Socket s=ss.accept();
         //读取客户端的信息
         ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
         User user = (User) ois.readObject();
         System.out.println("name:"+user.getName()+"\npassword"+user.getPassword());
        
          List<String> list = new ArrayList<String>();
          list.add("测试语句");
         ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());  
         oos.writeObject(list);        }catch(Exception  ex)
            {
                ex.printStackTrace();    
            }
    Client: try{
             //去连接某个服务器端,ip以及端口号
         Socket s=new Socket("127.0.0.1",8090);//运行程序,就会打印出11
         User user = new User("admin", "admin");
        
         //发送到服务器端的信息,我这里是传的对象,对象要进行序列化
         ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
         oos.writeObject(user);
        
         ObjectInputStream ois = new ObjectInputStream(s.getInputStream());  
         List<String> list = (List<String>) ois.readObject();
         for(String str :list){
         System.out.println(str);
         }
            
            }catch(Exception  ex)
            {
                ex.printStackTrace();    
            }
      

  5.   


    谢谢。劳您大驾,问题找到了,不是集合操作的问题,是传递的问题,同一个操作我分了两步去传了,服务端socket只认第一次传的
    我解决的方式是,把这个操作所需要传的东西,都写在HashMap里,然后一次性写过去就可以了,也就是一次操作只用一个ObjectStream 。