这周我开始使用套接字,但我遇到了困难。 我的目标是当客户端发送消息时,服务器以通知进行响应。 在客户端发送到服务器没有问题,但是服务器发送到客户端时没有任何问题。 有人可以帮我解决这个问题吗?
客户:
Thread thread = new Thread(new myServerThread());
thread.start();
class myServerThread implements Runnable {
Socket socket;
ServerSocket serverSocket;
InputStreamReader inputStreamReader;
BufferedReader bufferedReader;
String message;
Handler handler = new Handler();
@Override
public void run() {
try {
serverSocket = new ServerSocket(5000);
while (true){
socket = serverSocket.accept();
inputStreamReader = new InputStreamReader(socket.getInputStream());
bufferedReader = new BufferedReader(inputStreamReader);
message = bufferedReader.readLine();
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), message,Toast.LENGTH_LONG).show();
}
});
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
服务器:
String EMAIL = "Email";
try {
serverSocket = new ServerSocket(6000);
while(true){
socket = serverSocket.accept();
inputStreamReader = new InputStreamReader(socket.getInputStream());
bufferedReader = new BufferedReader(inputStreamReader);
email = bufferedReader.readLine();
System.out.println(email);
if(email.equals(EMAIL)){
jTextArea1.setText(email);
try {
socket = new Socket("localHost", 5000);
PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
printWriter.write(message);
printWriter.flush();
printWriter.close();
System.out.println("connected");
} catch (IOException e) {
e.printStackTrace();
}
}else{
}
}
} catch (IOException ex) {
}
etEmail = findViewById(R.id.etvEmail);
最佳答案
首先是简短的回答:您的 Java 代码几乎都工作得很好。
无论如何,您应该始终针对另一个已知正常的程序来测试您的应用程序。通过将一个自编写的程序与另一个新的自编写的程序进行测试,很难说两者中哪一个被破坏了。看来你正在使用一些 GUI(Android?)来测试它。将相关部分转换为在普通 PC 上运行的简单控制台应用程序可以使故障排除变得更加容易。
那么让我展示一下我如何在我的 Linux 笔记本电脑上检查您的代码:
首先将“客户端”代码复制到“Hello-World”模板中。我添加了一些调试消息和一个循环,允许客户端接收多行文本:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
class Main
{
static class myServerThread implements Runnable
{
Socket socket;
ServerSocket serverSocket;
InputStreamReader inputStreamReader;
BufferedReader bufferedReader;
String message;
@Override
public void run()
{
try
{
serverSocket = new ServerSocket(5000);
while (true)
{
System.out.println("Accepting...");
socket = serverSocket.accept();
System.out.println("Connected...");
inputStreamReader = new InputStreamReader(socket.getInputStream());
bufferedReader = new BufferedReader(inputStreamReader);
String message = bufferedReader.readLine();
while (message!=null)
{
System.out.println("Received:" + message);
message = bufferedReader.readLine();
}
System.out.println("Closing...");
socket.close();
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
public static void main(String[] args)
{
Thread thread = new Thread(new myServerThread());
thread.start();
}
}
我启动了“客户端”并打开了另一个命令窗口以打开与 Netcat 的网络连接并发送两行文本:
nc localhost 5000
Hallo
Test
“客户端”程序的相关输出是:
Accepting...
Connected...
Received:Hallo
Received:Test
Closing...
Accepting...
所以“客户端”部分显然运行良好。
接下来,我将您的“服务器”代码复制到“Hello World”模板中:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
class Main
{
static class myServerThread implements Runnable
{
Socket socket;
ServerSocket serverSocket;
InputStreamReader inputStreamReader;
BufferedReader bufferedReader;
String message;
@Override
public void run()
{
String EMAIL = "Email";
try
{
serverSocket = new ServerSocket(6000);
while (true)
{
System.out.println("Accepting...");
socket = serverSocket.accept();
System.out.println("Connected...");
inputStreamReader = new InputStreamReader(socket.getInputStream());
bufferedReader = new BufferedReader(inputStreamReader);
String message = bufferedReader.readLine();
while (message != null)
{
System.out.println("Received:" + message);
if (message.equals(EMAIL))
{
System.out.println("Sending...");
try
{
socket = new Socket("localHost", 5000);
PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
printWriter.write(message);
printWriter.flush();
printWriter.close();
System.out.println("sending done");
}
catch (IOException e)
{
e.printStackTrace();
}
}
message = bufferedReader.readLine();
}
System.out.println("Closing...");
socket.close();
}
}
catch (IOException ex)
{
ex.printStackTrace();
}
}
}
public static void main(String[] args)
{
Thread thread = new Thread(new myServerThread());
thread.start();
}
}
我再次添加了一些调试消息和循环,以便服务器可以接收多行文本。由于这个 Java 程序处理两个连接,因此我必须打开两个命令窗口。
在第一个命令窗口中,我告诉 NetCat 接受(监听)端口 5000 上的连接。这就是您的“服务器”将“电子邮件”消息发送到的位置:
nc -lp 5000
在第二个命令窗口中,我告诉 Netcat 连接到端口 6000 上的“服务器”,然后发送两行文本,然后按 Ctrl-C 停止它:
nc localhost 6000
Test
Email
^C
“服务器”程序的相关输出是:
Accepting...
Connected...
Received:Test
Received:Email
Sending...
sending done
Closing...
Accepting...
我在其他(第一个)命令窗口中监听 Netcat 产生了以下输出:
stefan@stefanpc:/hdd/stefan$ nc -lp 5000
Emailstefan@stefanpc:/hdd/stefan$
所以在我的机器上一切看起来都很好。除了一个小细节之外:“服务器”发送给客户端(在本例中为 NetCat)的“电子邮件”之后没有换行符。所以修复很简单:
printWriter.write(message+"\n");
最后的换行符是必需的,因为您的客户端通过 readLine()
使用输入。
NetCat 是一个非常有用的工具,用于测试纯文本 TCP 套接字通信。它包含在所有 Linux 发行版中。如果您很难找到 Windows 可执行文件,请从我的主页获取:http://stefanfrings.de/avr_tools/netcat-win32-1.12.zip
如果对您有帮助,请评论。
关于java - 服务器向客户端套接字发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60284869/