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通讯一对多: ⑴、一对多; ⑵、通过list/map存储连接的socket对象,服务端向所有客户端群发消息,可以修改为服务端向指定客户端发送消息; ⑶、自动定时扫描客户端,移除断开的连接。
java socket USB和 串口通讯,使用java程序与硬件通讯的三种方式。
Java_Socket通讯源代码,包含服务端和客户端,基于TCP/IP模式,支持GB级别数据传送,包含发送,接收,确认及回发模式.通过这个例子,让你与Socket通讯全接触!绝对经典!
JAVA SOCKET通讯程序
基于java的即时通讯工具,不局限于局域网
在Java中用socket进行客户/服务器之间的通信编程。Socket是两个实体之间进行通信的有效端点。通过socket可以获得源IP地址和源端口、终点IP地址和终点端口。用户可以将多个socket连入同一个端口,以便对于单个端口...
java socket 通讯例子附有源码 希望还不太理解java socket的原理的朋友,通过这3个简单到复杂的例子有锁帮助。 详细说明请下载。
java socket 即时通讯服务器开发,
java socket client 断线重连的简单实现 有什么意见可以提哦
网络调试助手(NetAssist)java socket 通讯代码 可聊天。 网络调试助手(NetAssist)java socket通讯代码,java代码,有看不懂的可以参考博客https://blog.csdn.net/qq_39400208/article/details/81096436 java ...
qt与javasocket通讯,消息格式类似json。qt部分充当服务端。
java socket教程java socket教程java socket教程
用JAVA的socket编程,做的一个简单即时通讯程序。。很简单
基于socket java 语言网络通讯机制和程序设计
主要介绍了Java基于socket实现的客户端和服务端通信功能,结合完整实例形式分析了Java使用socket建立客户端与服务器端连接与通信功能,需要的朋友可以参考下
Java网络编程socket通讯简单封装(使用多线程)
Java实现Socket长连接和短连接,实现原理可参见个人博客
用java编写的基于socket的进程间通信程序 客户端服务器聊天小程序
JAVA中使用Socket通讯的实现