Socket和ObjectOutputStream问题

用到Socket序列化对象网络传输时ObjectOutputStream一直刷新连接

用户代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.jachs.ladflower.ladflower;
 
import java.net.Socket;
 
import org.apache.log4j.Logger;
 
import com.jachs.ladflower.ladflower.thread.UserReaderThread;
import com.jachs.ladflower.ladflower.thread.UserWriterThread;
 
public class UserSocket {
    private static Logger logger = Logger.getLogger(UserSocket.class);
 
    static{
        try {
            Socket socket = new Socket(Constant.serverConfigure.getServerIp(), Constant.serverConfigure.getServerPort());
            new Thread(new UserReaderThread(socket.getInputStream())).start();
            new Thread(new UserWriterThread(socket.getOutputStream())).start();
//          MainFrame MainFrame=new MainFrame(socket.getInetAddress().getHostName());
        } catch (Exception e) {
            logger.error("客户端Socket异常:\t" + e.getMessage());
            e.printStackTrace();
        }
    }
}

  用户写入线程代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package com.jachs.ladflower.ladflower.thread;
 
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.util.Scanner;
 
import org.apache.log4j.Logger;
 
import com.google.gson.Gson;
import com.jachs.ladflower.ladflower.Constant;
import com.jachs.ladflower.ladflower.entity.SendInfo;
 
/****
 * 用户Socket写
 * @author zhanchaohan
 *
 */
public class UserWriterThread implements Runnable{
    private Logger logger= Logger.getLogger(UserWriterThread.class);
//  private ObjectOutputStream objectOutputStream;
    private DataOutputStream dataOutputStream;
    private Gson gson=new Gson();
     
    public UserWriterThread(OutputStream outputStream) {
        super();
        try {
//          this.objectOutputStream =new ObjectOutputStream(outputStream);
            this.dataOutputStream=new DataOutputStream(outputStream);
        } catch (Exception e) {
            logger.error("用户写线程构造器异常:\t"+e.getMessage());
        }
    }
 
    public void run() {
        try {
            Scanner scanner=new Scanner(System.in);
            String info;
            SendInfo sendInfo;
//          while((info=scanner.nextLine())!=null) {
//              sendInfo=new SendInfo(Constant.STATECODE_2,info);
//              objectOutputStream.writeObject(sendInfo);
//          }
            while((info=scanner.nextLine())!=null) {
                System.out.println("写:\t\t"+info);
                sendInfo=new SendInfo(Constant.STATECODE_2,info);
                System.out.println("a");
                dataOutputStream.writeUTF(gson.toJson(sendInfo));
                System.out.println("b");
            }
        } catch (Exception e) {
            logger.error("用户端写入线程出现异常:\t"+e.getMessage());
        }
    }
 
}

  服务器代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package com.jachs.ladflower.ladflower;
 
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
 
import org.apache.log4j.Logger;
 
import com.jachs.ladflower.ladflower.entity.SendInfo;
import com.jachs.ladflower.ladflower.quartz.QuartzInit;
import com.jachs.ladflower.ladflower.thread.ServerReaderThread;
import com.jachs.ladflower.ladflower.thread.ServerWriterThread;
import com.jachs.ladflower.ladflower.utill.SocketUtill;
 
 
/****
 * 服务器Socket
 * @author zhanchaohan
 *
 */
public class ServerSockets {
    private static Logger logger= Logger.getLogger(ServerSockets.class);
    static {
        try {
            //初始化定时器
//          QuartzInit quartzInit=new QuartzInit();
            //启动在线用户刷新定时器
//          quartzInit.MonitoringOnLine_Heartbeat();
             
            ServerSocket serverSocket=new ServerSocket(Constant.SERVERPORT);
            Socket socket;
            while((socket=serverSocket.accept())!=null) {
//              Constant.list.add(socket);
                new Thread(new ServerReaderThread(socket.getInputStream())).start();
                new Thread(new ServerWriterThread(socket.getOutputStream())).start();
//              SocketUtill.sendMsgToAllSocket(new SendInfo(Constant.STATECODE_0, socket.getInetAddress().getHostName()));
                System.out.println("getIn");
            }
        } catch (IOException e) {
            logger.error("服务器端服务开启失败:\t"+e.getMessage());
            e.printStackTrace();
        }
    }
}

  服务器

写入代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package com.jachs.ladflower.ladflower.thread;
 
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.util.Scanner;
 
import org.apache.log4j.Logger;
 
import com.google.gson.Gson;
import com.jachs.ladflower.ladflower.Constant;
import com.jachs.ladflower.ladflower.entity.SendInfo;
 
 
/****
 * 服务器Socket写
 * @author zhanchaohan
 *
 */
public class ServerWriterThread implements Runnable{
    private Logger logger= Logger.getLogger(ServerWriterThread.class);
//  private ObjectOutputStream objectOutputStream;
    private DataOutputStream dataOutputStream;
    private Gson gson=new Gson();
     
    public ServerWriterThread(OutputStream outputStream) {
        super();
        try {
            this.dataOutputStream=new DataOutputStream(outputStream);
//          this.objectOutputStream =new ObjectOutputStream(outputStream);
        } catch (Exception e) {
            logger.error("服务器写线程构造器异常:\t"+e.getMessage());
        }
    }
 
    public void run() {
        try {
            Scanner scanner=new Scanner(System.in);
            String info;
            SendInfo sendInfo;
//          while((info=scanner.nextLine())!=null) {
//              sendInfo=new SendInfo(Constant.STATECODE_2,info);
//              objectOutputStream.writeObject(sendInfo);
//          }
            while((info=scanner.nextLine())!=null) {
                sendInfo=new SendInfo(Constant.STATECODE_2,info);
                dataOutputStream.writeUTF(gson.toJson(sendInfo));
            }
        } catch (Exception e) {
            logger.error("服务器端写入线程出现异常:\t"+e.getMessage());
        }
    }
 
}

  服务器读取代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package com.jachs.ladflower.ladflower.thread;
 
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
 
import org.apache.log4j.Logger;
 
import com.jachs.ladflower.ladflower.entity.SendInfo;
import com.jachs.ladflower.ladflower.utill.SocketUtill;
 
/****
 * 服务器Socket读
 *
 * @author zhanchaohan
 *
 */
public class ServerReaderThread implements Runnable {
    private Logger logger = Logger.getLogger(ServerReaderThread.class);
//  private ObjectInputStream inputStream;
    private DataInputStream dataInputStream;
     
    public ServerReaderThread(InputStream inputStream) {
        super();
        this.dataInputStream=new DataInputStream(inputStream);
        /*try {
            this.inputStream = new ObjectInputStream(inputStream);
        } catch (IOException e) {
            logger.error("服务器读线程构造器异常:\t"+e.getMessage());
        }*/
    }
 
    public void run() {
        try {
            /*SendInfo send;
            while ((send = (SendInfo) inputStream.readObject()) != null) {
                SocketUtill.SwithInfo(send);
            }*/
            while(true) {
                System.out.println(dataInputStream.readUTF());
            }
        } catch (Exception e) {
            logger.error("服务器端读取线程异常:\t" + e.getMessage());
        }
 
    }
}

  再新起一个项目也使用ObjectInputStream序列化对象传输时正常未找到原因,改用传输json使用Gson

posted @   Jachs  阅读(1001)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示
人生而自由,却无往不在枷锁中。