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的时候就会读取到东西啦。
至此问题得以弄清楚!~
分享到:
相关推荐
java 写socket通讯 发送信息 接收数据
Java_Socket通讯源代码是Java网络编程中一个重要的学习资源,它主要展示了如何利用Java的Socket类进行TCP/IP通信。TCP/IP模式是一种可靠的传输协议,它确保了数据的顺序和完整性,适合处理大量数据,如GB级别的文件...
Java应用Socket通讯一对多: ⑴、一对多; ⑵、通过list/map存储连接的socket对象,服务端向所有客户端群发消息,可以修改为服务端向指定客户端发送消息; ⑶、自动定时扫描客户端,移除断开的连接。
java socket USB和 串口通讯,使用java程序与硬件通讯的三种方式。
总结,Qt与Java之间的Socket通信涉及了网络编程、JSON序列化和反序列化、多线程处理(特别是在Java中处理并发连接时)、以及错误处理等多个技术点。理解并熟练掌握这些知识点,可以构建可靠的跨平台通信系统。
Java SocketCAN是一个用于在...总的来说,`java-socketcan`是一个方便Java开发者在Linux环境中进行CAN通信的工具,它通过JNI桥接Java和底层SocketCAN库,提供了易于使用的API,使得在Java中控制CAN设备变得更加简单。
在Java中,Socket是实现网络通信的基础,通过Socket可以实现客户端和服务器端之间的通信。本文将详细介绍Java基于Socket实现的客户端和服务端通信功能,包括客户端和服务器端的实现、连接和通信的过程。 Socket的...
Java中的`java.net.Socket`类和`java.net.ServerSocket`类是实现客户端与服务端通信的基础。 #### 二、Java Socket编程基础概念 - **Socket**:一个端到端的连接,用于客户端和服务端之间的数据传输。 - **...
在Java中,Socket代表了一个网络连接的端点,由IP地址和端口号唯一标识。 2. **TCP/IP协议**: TCP(传输控制协议)是网络通信中的一种可靠协议,它确保数据包按顺序、无丢失地传递。IP(互联网协议)负责将数据包...
在Java中,Socket是基于TCP/IP协议的一种低级通信机制,它提供了进程间网络通信的能力。本篇文章将深入探讨Java Socket通信的基本概念、工作原理以及如何通过源码实现简单的通信程序。 首先,理解Socket的基本概念...
基于java的即时通讯工具,不局限于局域网
在Java中用socket进行客户/服务器之间的通信编程。Socket是两个实体之间进行通信的有效端点。通过socket可以获得源IP地址和源端口、终点IP地址和终点端口。用户可以将多个socket连入同一个端口,以便对于单个端口...
在Java中,`java.net.Socket`和`java.net.ServerSocket`类是进行Socket通信的核心。ServerSocket监听特定端口,等待客户端的连接请求;Socket则用于建立与ServerSocket的连接,并进行数据交换。 2. **文件I/O操作**...
Java Socket 开发即时通讯服务器是构建实时通信系统的关键技术之一,尤其在企业级应用、在线游戏、聊天室等场景中广泛应用。本篇将深入探讨Java Socket在即时通讯服务器开发中的核心概念、步骤以及关键技术。 首先...
用java实现socket通信,客户端和服务端互发消息,通过关键字推出链接
在Java中,使用`java.net.Socket`类来创建一个Socket实例,以建立到指定服务器的连接。客户端通常需要执行以下步骤: 1. 创建`Socket`对象,指定服务器的IP地址和端口号,如`new Socket("服务器IP", 端口号)`。 2. ...
在Java中,Socket编程是实现客户端-服务器应用通信的基础,它提供了低级别的、面向连接的、可靠的字节流服务。在这个教程中,我们将深入理解Java Socket的基本概念,并通过一个实际的示例来阐述如何在Tomcat服务器上...
在Java中,Socket编程主要涉及两个核心类:`Socket` 和 `ServerSocket`。前者用于表示客户端,后者用于表示服务器端。Socket通信遵循客户机-服务器模型,其中服务器端通常监听特定端口上的连接请求,而客户端则主动...
在Java中,Socket类和ServerSocket类是主要的工具,分别用于客户端和服务器端的通信。 1. **Socket**:客户端使用Socket类创建一个到远程服务器的连接。Socket对象代表了这个连接,并提供了输入输出流来读写数据。...
JAVA 中使用 Socket 通讯的实现 JAVA 中使用 Socket 通讯的实现是指利用 JAVA 语言在 MyEclipse 环境下,借助于 Swing 可视化界面设计,完成了相邻计算机使用 Socket 进行通信的实现。该实现利用 ServerSocket 监听...