急求socket编程阻塞问题

问题描述

急求socket编程阻塞问题

我想做个测试,用cs模式,从客户端传一个对象给服务器,服务器修改这个对象的属性,再传回客户端。但是出了个问题。客户端运行到ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());这一行时,停住了。
服务器端也是运行到ObjectInputStream ois= new ObjectInputStream(socket.getInputStream());这一行停住了。
请大侠解释一下,为什么。

 public class Client {

    public static void main(String[] args) {
         Good good = new Good();
         User user = new User();
         good.setName("good one");
         good.setPrice(18);

         user.setAge(21);
         user.setName("jack");
                try {
                    Socket socket =new Socket("192.168.52.129",30000);
                    System.out.println("socket successful");
                    ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                    ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                    System.out.println("oos is ok");

                    oos.writeObject(good);
                    socket.shutdownOutput();
                    ois.readObject();
                    System.out.println(good.getName()+good.getPrice());

                    oos.close();
                    ois.close();
                    socket.close();
                } catch (UnknownHostException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (ClassNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

    }
}
 public class Server {

    public static void main(String[] args) throws Exception {

        try {
            ServerSocket serverSocket = new ServerSocket(30000);
            System.out.println("服务器已经启动,等待连接");
            Socket socket = serverSocket.accept();
            System.out.println("服务器收到请求");
            ObjectInputStream ois= new ObjectInputStream(socket.getInputStream());
            System.out.println("ois is ok");
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            System.out.println("oos is ok");
            Good good = (Good)ois.readObject();
            System.out.println(good.getName()+good.getPrice());
            good.setName("servergood");
            good.setPrice(25);
            socket.shutdownInput();
            oos.writeObject(good);
                    ois.close();
                    oos.close();
                    socket.close();

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        }
    }

解决方案

用线程解决Socket的getInputStream阻塞

解决方案二:

两边都block在read上了吧,结果谁都没有发数据出去。

解决方案三:

自己修改代码后发现,创建了ois之后,不能马上创建oos。这样就会阻塞,oos什么时候用,什么时候再创建。

时间: 2024-08-30 13:17:04

急求socket编程阻塞问题的相关文章

跪求..Socket编程资料

问题描述 如题,我百度了2天,网上关于c#方面的Socket编程资料很少,烦请哪位大师,能给点详细的资料,或是推荐一本好书,我买谢谢!! 解决方案 解决方案二:msdn解决方案三:http://www.cnblogs.com/RobotTech/archive/2007/02/15/651077.html解决方案四:http://topic.csdn.net/u/20120331/21/29fcea3f-a4b8-4112-8f5a-a12c9b2814d6.html解决方案五:http://d

socket编程发送消息出现socket closed求大神,急

问题描述 socket编程发送消息出现socket closed求大神,急 import java.io.DataInputStream; import java.io.EOFException; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Server { ServerSocket ss; Socket s ; Clients clients; Da

java-急求Java socket编程实现两个客户端通信通过服务器转发不要图形界面不用连接数据库

问题描述 急求Java socket编程实现两个客户端通信通过服务器转发不要图形界面不用连接数据库 实现两个客户端通信通过服务器转发不要图形界面不用连接数据库 求源码 解决方案 通过服务器,也就是说各个客户端与服务器要正常通讯,这是最基本的要求.这个要求应该不难吧,网上有很多类似的代码,如Android Socket 编程(WIFI 和 ADB),这是我在 CSDN 博客中的一篇文章,希望对你有帮助. 然后呢,做协议,当服务器接收到数据满足一定的格式.或所有数据,都转发到另一端. 解决方案二:

关于socket编程问题求大神解决

问题描述 关于socket编程问题求大神解决 我写了一个简单的socket程序手机那边发个数据PC这边接收.写在DEV里时可以正常的接收到数据可是写在vs2010的一个按钮里就接收不到数据了,怎么回事啊,急求啊 SOCKET socket1; WSADATA wsaData; if (WSAStartup(MAKEWORD(2,1),&wsaData)) //调用Windows Sockets DLL { AfxMessageBox(_T("Winsock无法初始化!"));

linux编程问题,expect脚本问题,急求

问题描述 linux编程问题,expect脚本问题,急求 #!/usr/bin/expect -f set IP [lindex $argv 0 ] spawn scp /root/.ssh/id_rsa.pub root@${IP}:/root/.ssh/ expect { "Are you sure you want to continue connecting*" { send "yesr"; exp_continue } 写了个脚本,大概是这样,但现在有个问

请问谁有C#数据库编程实例?java,c的话也可以!!!急求在线等!!

问题描述 请问谁有C#数据库编程实例?java,c的话也可以!!!急求在线等!! 用c#或c或java连接SQL开发数据库-急求..请问谁有C#数据库编程实例?java,c的话也可以!!!急求在线等!! 解决方案 http://download.csdn.net/detail/qq_27582155/8843075 登陆名:lgs 密码:123 C#版本2013 解决方案二: 你要哪方面的实例?我这边有java连MYSQL的代码很完整,需不需要 解决方案三: 在51cto下载站可以下载高一凡<数

c语言-M只猴子选大王的另一种问法,怎样用C语言编程解决啊,急求

问题描述 M只猴子选大王的另一种问法,怎样用C语言编程解决啊,急求 M只猴子选大王,选举办法如下:所有猴子按1...M编号围坐一圈,从第1号开始按顺序1,2...N报数,报到N的猴子退出到圈外,再从下一个猴子开始继续1,2...N报数,报到N的猴子退出圈外,如此循环,直至圈内只剩下一只猴子时就说大王,给定M和最后出圈的者的编号S,求最小的N 解决方案 约瑟夫环问题 解决方案二: 来自百度: #include #include #define n 19 #define m 4 typedef st

急求,eclipse编程时实现当前代码自动复制保存到指定文件的类,方法,打jar包

问题描述 急求,eclipse编程时实现当前代码自动复制保存到指定文件的类,方法,打jar包 先说下需求,编程时总希望把当前正在编写的自认为比较有借鉴意义的代码追加保存到指定文件,留作日后参考,但如果每次都手动复制粘贴,又很麻烦,故思考写个实现该功能的工具类,打成jar包,封装本方法,这样以后不管在哪个项目里敲代码,想保存时就导入自定义的jar包,调用一下该方法就完成了追加保存,简洁方便:然本人初学能力不足,只完成了部分,截图如下,望各位不吝赐教 可以看到主要困难在于获得当前文件的路径名,ecl

java 基础编程题,急求结果

问题描述 java 基础编程题,急求结果 1,int isVesuvian(int n),如果n是有且仅是两组不同的两个数的平方和,返回1,否则0. 2,int isOneBalanced(int a[]),判读数组是否是平衡数组,开头连续为1的数 + 结尾连续为1的数 = 中间连续不为1的数 结果返回1,否则为0. 3,int closestFibonacci(int n),返回比n小的最大的斐波拉契元素.斐波拉契数列 1 1 2 3 5 8 13 21 34 PS:1 1 2 3 5 8 1