当前位置: 首页 > 面试题库 >

Java套接字,这是死锁还是什么?

滕鸿畴
2023-03-14
问题内容

我有一个客户端服务器程序在服务器端使用套接字,并且读写发生在这种方式

soc = serversocket.accept();
System.out.println("Accepted");

in = new ObjectInputStream(soc.getInputStream());
out = new ObjectOutputStream(soc.getOutputStream());

if(in.readUTF() == null ? " " != null : !in.readUTF().equals(" "))
{
    diskinfo.setPath(in.readUTF());
}
Item[] pac = diskinfo.get();

out.writeObject(pac);

同样在cilent(android)方面…

Log.v("read", "item");
soc = new Socket(InetAddress.getByName("10.0.2.2"), 3838);
output = new ObjectOutputStream(soc.getOutputStream());
input = new ObjectInputStream(soc.getInputStream());

try 
{
    output.writeUTF(path);
    packets = (Item[]) input.readObject();
} 
catch (ClassNotFoundException e) 
{
    // TODO Auto-generated catch block
    e.printStackTrace();
}

问题是,建立连接后,程序会卡住它们,没有错误,也没有异常。停下来


问题答案:

这是一个死锁,您必须首先创建并刷新ObjectOutputStream。这是因为ObjectInputStream在继续操作之前先读取OOS发送的标头。



 类似资料:
  • 我试图建立一个多人游戏与游戏服务器运行最多4个客户端,使用java套接字和ServerSocket。在此代码中,我将客户端的数量限制在1个,并对播放器和服务器使用阻塞I/O模型。 游戏服务器线程(实现Runnable)使用套接字输入流从每个客户端接收“Snake object to Snake[i]”和“char变量to DirInput”,并使用套接字输出流发送“Snake object Arr

  • 我有一个类似的问题,但是我知道当我要求阅读一行时,发件人应该发送一个行尾。 让我困惑的是,在调试中,它是有效的。可能是因为我在调试时跳过的顺序(直到现在我都不知道这会有什么不同),但我想更好地理解它。 我已经使用线程,但不是很多。 这是我的服务器类: 线程(基于此) 和客户: 它似乎在某个地方进入了死锁,出于某种原因,除非在调试中运行,否则永远不要在向客户端发送数据的服务器类上输入该死锁 (顺便说

  • 本文向大家介绍什么是线程死锁?如何避免死锁?相关面试题,主要包含被问及什么是线程死锁?如何避免死锁?时的应答技巧和注意事项,需要的朋友参考一下 认识线程死锁 多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。 如下图所示,线程 A 持有资源 2,线程 B 持有资源 1,他们同时都想申请对方的资源,所以这两个线程就会互相等待而进入死锁状态

  • 本文向大家介绍请问什么是死锁(deadlock)?相关面试题,主要包含被问及请问什么是死锁(deadlock)?时的应答技巧和注意事项,需要的朋友参考一下 考察点:线程死锁 两个线程或两个以上线程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是这些线程都陷入了无限的等待中。 例如,如果线程1锁住了A,然后尝试对B进行加锁,同时线程2已经锁住了B,接着尝试对A进行加锁,这时死锁就发生

  • 读者: 这看起来像是一个僵局,但有几件事让我怀疑: 我找不到另一个可能持有相同锁的线程 4秒后进行线程转储会得到相同的结果,但现在所有线程都报告,这与第一次转储中的不同。

  • 在TCP套接字代码中,我们创建了2个套接字。第一个接收新连接,第二个接收来自客户端的数据,并在建立新连接时创建。 TCP报头中的什么控制位允许服务器知道是将此段传递给ServerSocket(连接请求被发送到的那个)还是Socket(连接建立后为通信而创建的Socket)?