`
yznxing
  • 浏览: 370478 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java中socket通讯的小陷阱

    博客分类:
  • java
阅读更多

1:在java的服务端代码:

 

public class SimpleServerSocket {
    public static void main(String[] args) {
        try {
            ServerSocket server = new ServerSocket(6789);
            Socket client;
            while (true) {
                try {
                    client = server.accept();
                    System.out.println(client.getInetAddress());

                    System.out.println("server waiting for getInputStream " + System.currentTimeMillis());

                    ObjectInputStream input = new ObjectInputStream(client.getInputStream());

                    System.out.println("server waiting for getOutputStream() " + System.currentTimeMillis());

                    ObjectOutputStream output = new ObjectOutputStream(client.getOutputStream());

                    System.out.println("server waiting for reading client " + System.currentTimeMillis());

                   

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

            //client.close();

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

    }
}
 

 

2: 客户端的代码:

 

public class SimpleClientSocket {
    public static void main(String[] args) {
        Socket server;
        try {
            server = new Socket("127.0.0.1", 6789);

            /**
             * 下面这两行的顺序改变试试
             */
            ObjectInputStream input = new ObjectInputStream(server.getInputStream());
            ObjectOutputStream output = new ObjectOutputStream(server.getOutputStream());

            System.out.println(server.getInetAddress());

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

    }
}
 

 

可以试下再本机运行。如果client和server都是先进行getInputStream
那 么程序运行的时候就会一直堵塞。不能成功建立通讯。

但是如果将client调换下顺序,就可以成功 建立连接。

目前猜想的原因是在TCP三次握手的时候堵塞住了吧,具体原因还不是很清楚,继续研究 中!~


=========================================================================

目 前原因已经找到,主要问题是出在构造ObjectInputStream的时候出问题的 。看 下源码:
public ObjectInputStream(InputStream in) throws IOException {
verifySubclass();
bin = new BlockDataInputStream(in);
handles = new HandleTable(10);
vlist = new ValidationList();
enableOverride = false;
readStreamHeader();
bin.setBlockDataMode(true);
    }

读取stream的header的时候,源码:
short s0 = bin.readShort();
这个方法会阻塞的,直 到读到东西位置!!

因此,如果客户端跟服务端都先构造ObjectInputStream的话,就 会互相堵塞,而如果其中一方先构造
ObjectOutputStream的时候就不会出问题,这是因为构造 ObjectOutputStream的时候会有一个方法,看源码:

public ObjectOutputStream(OutputStream out) throws IOException {
verifySubclass();
bout = new BlockDataOutputStream(out);
handles = new HandleTable(10, (float) 3.00);
subs = new ReplaceTable(10, (float) 3.00);
enableOverride = false;
writeStreamHeader();
bout.setBlockDataMode(true);
        if (extendedDebugInfo) {

   debugInfoStack = new DebugTraceInfoStack();
} else {
   debugInfoStack = null;
        }   
    }

wirte的源码:
 protected void writeStreamHeader() throws IOException {
bout.writeShort(STREAM_MAGIC);
bout.writeShort(STREAM_VERSION);
    }

这 里会写一个魔数和一个版本号,这样构造ObjectInputStream的时候就会读取到东西啦。
至此问题得以弄清楚!~





1
0
分享到:
评论

相关推荐

    java 写socket通讯

    java 写socket通讯 发送信息 接收数据

    Java_Socket通讯源代码

    Java_Socket通讯源代码是Java网络编程中一个重要的学习资源,它主要展示了如何利用Java的Socket类进行TCP/IP通信。TCP/IP模式是一种可靠的传输协议,它确保了数据的顺序和完整性,适合处理大量数据,如GB级别的文件...

    Java应用Socket通讯一对多

    Java应用Socket通讯一对多: ⑴、一对多; ⑵、通过list/map存储连接的socket对象,服务端向所有客户端群发消息,可以修改为服务端向指定客户端发送消息; ⑶、自动定时扫描客户端,移除断开的连接。

    java socket USB和 串口通讯源码

    java socket USB和 串口通讯,使用java程序与硬件通讯的三种方式。

    qt与java之间socket通讯

    总结,Qt与Java之间的Socket通信涉及了网络编程、JSON序列化和反序列化、多线程处理(特别是在Java中处理并发连接时)、以及错误处理等多个技术点。理解并熟练掌握这些知识点,可以构建可靠的跨平台通信系统。

    java-socketcan

    Java SocketCAN是一个用于在...总的来说,`java-socketcan`是一个方便Java开发者在Linux环境中进行CAN通信的工具,它通过JNI桥接Java和底层SocketCAN库,提供了易于使用的API,使得在Java中控制CAN设备变得更加简单。

    Java基于socket实现的客户端和服务端通信功能完整实例

    在Java中,Socket是实现网络通信的基础,通过Socket可以实现客户端和服务器端之间的通信。本文将详细介绍Java基于Socket实现的客户端和服务端通信功能,包括客户端和服务器端的实现、连接和通信的过程。 Socket的...

    JAVA SOCKET通讯程序

    Java中的`java.net.Socket`类和`java.net.ServerSocket`类是实现客户端与服务端通信的基础。 #### 二、Java Socket编程基础概念 - **Socket**:一个端到端的连接,用于客户端和服务端之间的数据传输。 - **...

    Java基于socket的进程间通信 聊天小程序

    在Java中,Socket代表了一个网络连接的端点,由IP地址和端口号唯一标识。 2. **TCP/IP协议**: TCP(传输控制协议)是网络通信中的一种可靠协议,它确保数据包按顺序、无丢失地传递。IP(互联网协议)负责将数据包...

    java socket通讯程序源码

    在Java中,Socket是基于TCP/IP协议的一种低级通信机制,它提供了进程间网络通信的能力。本篇文章将深入探讨Java Socket通信的基本概念、工作原理以及如何通过源码实现简单的通信程序。 首先,理解Socket的基本概念...

    java socket 即时通讯工具

    基于java的即时通讯工具,不局限于局域网

    java Socket 通讯 源代码

    在Java中用socket进行客户/服务器之间的通信编程。Socket是两个实体之间进行通信的有效端点。通过socket可以获得源IP地址和源端口、终点IP地址和终点端口。用户可以将多个socket连入同一个端口,以便对于单个端口...

    JAVA Socket编程实现文件上传

    在Java中,`java.net.Socket`和`java.net.ServerSocket`类是进行Socket通信的核心。ServerSocket监听特定端口,等待客户端的连接请求;Socket则用于建立与ServerSocket的连接,并进行数据交换。 2. **文件I/O操作**...

    java socket开发即时通讯服务器

    Java Socket 开发即时通讯服务器是构建实时通信系统的关键技术之一,尤其在企业级应用、在线游戏、聊天室等场景中广泛应用。本篇将深入探讨Java Socket在即时通讯服务器开发中的核心概念、步骤以及关键技术。 首先...

    java实现socket通讯互发

    用java实现socket通信,客户端和服务端互发消息,通过关键字推出链接

    java与c++通过socket通信

    在Java中,使用`java.net.Socket`类来创建一个Socket实例,以建立到指定服务器的连接。客户端通常需要执行以下步骤: 1. 创建`Socket`对象,指定服务器的IP地址和端口号,如`new Socket("服务器IP", 端口号)`。 2. ...

    java Socket即时通讯

    在Java中,Socket编程是实现客户端-服务器应用通信的基础,它提供了低级别的、面向连接的、可靠的字节流服务。在这个教程中,我们将深入理解Java Socket的基本概念,并通过一个实际的示例来阐述如何在Tomcat服务器上...

    基于socket java 语言网络通讯机制和程序设计

    在Java中,Socket编程主要涉及两个核心类:`Socket` 和 `ServerSocket`。前者用于表示客户端,后者用于表示服务器端。Socket通信遵循客户机-服务器模型,其中服务器端通常监听特定端口上的连接请求,而客户端则主动...

    JAVA即时通讯+P2P+socket

    在Java中,Socket类和ServerSocket类是主要的工具,分别用于客户端和服务器端的通信。 1. **Socket**:客户端使用Socket类创建一个到远程服务器的连接。Socket对象代表了这个连接,并提供了输入输出流来读写数据。...

    JAVA中使用Socket通讯的实现.pdf

    JAVA 中使用 Socket 通讯的实现 JAVA 中使用 Socket 通讯的实现是指利用 JAVA 语言在 MyEclipse 环境下,借助于 Swing 可视化界面设计,完成了相邻计算机使用 Socket 进行通信的实现。该实现利用 ServerSocket 监听...

Global site tag (gtag.js) - Google Analytics