求教socket读写集合问题~~

时间:2022-09-04 19:41:01
服务端:

        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;



6 个解决方案

#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


引用 1 楼  的回复:
java.net.SocketException: Socket is closed,
该异常在客户端和服务器均可能发生。异常的原因是己方主动关闭了连接后(调用了Socket的close方法)再对网络连接进行读写操作。
java.net.SocketException: (Connection reset或者Connect reset by peer:Socket write error)。
……

介个我看了很多遍了,不是很明白,太宽泛了,整个程序木有调用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


有点切记,要先启动服务端,再启动客户端

#6


引用 5 楼  的回复:
有点切记,要先启动服务端,再启动客户端


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

#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


引用 1 楼  的回复:
java.net.SocketException: Socket is closed,
该异常在客户端和服务器均可能发生。异常的原因是己方主动关闭了连接后(调用了Socket的close方法)再对网络连接进行读写操作。
java.net.SocketException: (Connection reset或者Connect reset by peer:Socket write error)。
……

介个我看了很多遍了,不是很明白,太宽泛了,整个程序木有调用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


有点切记,要先启动服务端,再启动客户端

#6


引用 5 楼  的回复:
有点切记,要先启动服务端,再启动客户端


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