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)。简单的说就是在连接断开后的读和写操作引起的。
该异常在客户端和服务器均可能发生。异常的原因是己方主动关闭了连接后(调用了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:
Client:
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
谢谢。劳您大驾,问题找到了,不是集合操作的问题,是传递的问题,同一个操作我分了两步去传了,服务端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)。简单的说就是在连接断开后的读和写操作引起的。
该异常在客户端和服务器均可能发生。异常的原因是己方主动关闭了连接后(调用了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:
Client:
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
谢谢。劳您大驾,问题找到了,不是集合操作的问题,是传递的问题,同一个操作我分了两步去传了,服务端socket只认第一次传的
我解决的方式是,把这个操作所需要传的东西,都写在HashMap里,然后一次性写过去就可以了,也就是一次操作只用一个ObjectStream 。