我写了一个主类是通过socket和C 程序通讯的.
在这个主类中,当连接建立后,我会开启一个线程,然后把socket传递过去,来循环执行握手操作...保持这个socket的长连接...
然后主线程执行下面的socket操作.....这个握手线程会每隔30秒执行一次....
现在的问题是,两个线程如果同时执行一个socket操作,比如,两个socket同时执行write操作..
就会出现问题.
如果用同步的方式,应该如何写?
代码如下:public class MainThread(){ private Socket socket;

DataOutputStream outData;
    DataInputStream inData;
......
.....
public method1(...){
.....
.....
Hand2NC h = new Hand2NC(30000, "Hand NC", socket, outData, inData);
                  h.start();//启动握手线程
.....
.....
.....//执行其他socket操作
}}
public class Hand2NC extends Thread{

    int pauseTime; //间隔时间    String name; //线程名称    Socket socket;    DataOutputStream outData;    DataInputStream inData;
    
    ....
    
    //构造方法
Hand2NC(int x, String n, Socket s, DataOutputStream out, DataInputStream in) {
        pauseTime = x;
        name = n;
        socket = s;
        outData = out;
        inData = in;
    } public void run() {

while(true){
try{

//执行握手操作
....
}
catch(Exception ex){
outData.close();
inData.close();
socket.close();
}
}//end while

}//end run}

解决方案 »

  1.   

    两个线程同时操作同一个 socket 吗?这样不好吧?……如果一定要这么做,那就需要同步一下喽。两个线程里面在需要操作 socket 的时候都加上    synchronized (socket) {
            ……
        }
      

  2.   

    to maquan('ma:kju):我现在写的这个是WEB方式和C服务通讯.
    为了保持长连接.必须进行socket握手操作........如果不开一个线程去执行握手操作的话,还有其他的方法可以解决这个问吗?有好的方法吗?
      

  3.   

    你说的“握手操作”应该是“keep-alive”那种吧?就是隔一段时间发个包,不为别的,就怕底层驱动把你的连接给断掉,是吧?如果要在单独的线程里面做,就用我前面说的 synchronized(socket),应该是可以的。如果在同一个线程里做,也应该可以。你不就是怕“闲置”太久吗,那就在“闲置”到一定的时间后起来做一次喽。至于这个“定时”机制,要根据你原本主线程的主循环逻辑来处理了。说到这里,我倒真觉得,用两个线程分头处理,好像程序逻辑的确清楚一点,hehe  :D
      

  4.   

    to maquan('ma:kju):你说的很有道理,我也赞同.为什么分开来做这个握手线程..主要是我写的不是应用程序,不是C/S的.
    而是WEB方式的.....换句话说,用户在登陆网站之后的操作是请求--响应的方式...
    只有在用户点了网页上的操作之后,才会触发后台主程序的socket操作...所以我才会想到单独开个线程来进行握手.....