Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java聊天套接字不支持';添加文件发件人后不显示邮件_Java_Sockets_Chat - Fatal编程技术网

Java聊天套接字不支持';添加文件发件人后不显示邮件

Java聊天套接字不支持';添加文件发件人后不显示邮件,java,sockets,chat,Java,Sockets,Chat,我写了一个聊天客户端,它工作得很好,直到我决定添加一些文件发送者的东西,它应该将一个文件从客户端发送到服务器。在我为文件发送者添加行之后,它不再显示消息 我认为问题在于run()中有两个try语句 看起来ConnectareClient.java中有一个小的逻辑错误。发送“READY”的条件,我认为应该是NOT条件,否则它将永远不会向客户发送回复并继续文件编写。我已经试过了,可以看到文件正在从客户端复制到服务器 下面是我在ConnectareClient.java中所做的代码更改 //Cite

我写了一个聊天客户端,它工作得很好,直到我决定添加一些文件发送者的东西,它应该将一个文件从客户端发送到服务器。在我为文件发送者添加行之后,它不再显示消息

我认为问题在于run()中有两个try语句


看起来ConnectareClient.java中有一个小的逻辑错误。发送“READY”的条件,我认为应该是NOT条件,否则它将永远不会向客户发送回复并继续文件编写。我已经试过了,可以看到文件正在从客户端复制到服务器

下面是我在ConnectareClient.java中所做的代码更改


//Citeste calea fisierului
String filename = inReader.readLine();

// this seems should be a NOT condition
if(!filename.equals("")){
    //Trimit status READY la client
    outReader.write("READY\n");
    outReader.flush();
}

我已经下载并试用了你的代码。简而言之,您的问题是线程死锁。您有两个线程,一个在服务器端,一个在客户端,每个线程都在等待另一个线程执行某些操作,以便第一个线程也可以继续

更详细的情况如下:

  • ClientChat类在第260行将文件名发送到服务器,然后等待服务器发送回某个内容(带有“READY”的字符串),然后继续实际的文件发送

  • 另一方面,ConectareClient类在第38行停止,等待从客户机发送一些东西,然后继续(并发送“READY”状态消息,客户机正在等待)

我给你的建议是:

这看起来很像是一个满身灰尘的老教授给你的作业指导:)而且看起来这个家伙给你的这个东西没有先学习软件开发的基础知识。我不打算在这里发表社论,但这里有一些实用的建议可以帮助你:

  • 使用诸如Eclipse之类的IDE。不要使用记事本在命令行中编写代码。在这种情况下,Eclipse将使您受益匪浅,因为您可以轻松地调试代码,以避免出现这些微不足道的错误。下面是您应该做的:下载Eclipse,创建一个Java标准项目,复制所有的.Java文件并将它们粘贴到Eclipse项目的“src”文件夹中。然后在我上面提到的行中添加一些断点,启动客户端和服务器,尝试发送一个文件,看看代码中发生了什么

  • 进行单元测试!这是非常重要的,不管你的教授和同事们怎么说。进行单元测试对您的编码有双重好处:1。它将帮助您轻松发现此类重构回归错误。2.它将迫使您编写好的干净代码,每个任务都有单独的方法等

  • 虽然掌握服务器/客户机低级线程和套接字知识并不坏,但实现此项目的更好方法是使用Java Messenger Service。它是一个框架,可以完全按照您的要求执行,即以同步或异步的方式发送和接收所有类型的内容(原语、对象等),并且所有的搭建都已经为您完成,您只需实现业务逻辑。查一下,它可能会帮你很多忙


客户端可以发送一个名为
。\windows\system32\user32.dll
的文件吗?嗯,文件发送部分取自我编写的另一个应用程序,它运行正常,发送各种文件。是的,这正是我试图告诉你的问题。当客户端发送包含
的文件名时,服务器将覆盖完全不相关的文件,而服务器不应该覆盖这些文件。您必须在创建文件之前检查错误的文件名。感谢您的建议,我将尝试删除等待就绪部分,并查看发生了什么错误?我唯一要做的另一件事是将c:/temp指向我在Mac中的temp目录。如果您希望我们帮助您,而不是说它不工作,那么您需要更具体地检查您的客户机在修改后是否从服务器收到就绪消息。

//Citeste calea fisierului
String filename = inReader.readLine();

// this seems should be a NOT condition
if(!filename.equals("")){
    //Trimit status READY la client
    outReader.write("READY\n");
    outReader.flush();
}