我将在Java中设置一个简单的TCP客户端服务器交互。
服务器:
服务器是用Java编写的桌面客户端:
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
class TCPServer
{
public static int PORT_NUMBER = 6129;
public static void main(String argv[]) throws Exception
{
String clientMessage;
ServerSocket welcomeSocket = new ServerSocket(PORT_NUMBER);
while (true)
{
Socket connectionSocket = welcomeSocket.accept();
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
clientMessage = inFromClient.readLine();
System.out.println("Received: " + clientMessage);
outToClient.writeBytes("I received this: "+ clientMessage +"\n");
}
}
}
客户端:
客户端是一个连接到服务器的Android应用,使用TCP协议。在客户端中,我有一个名为sendMessage(String msg)
的方法,它试图向服务器发送一条消息。
public static void sendMessage(String msg) throws IOException
{
if (mainSocket == null)
{
return;
}
if (!mainSocket.isConnected())
{
connectSocket();
}
PrintWriter output = new PrintWriter( mainSocket.getOutputStream());
output.println(msg);
output.flush();
System.out.println(msg);
}
问题是,服务器接收到第一条消息,但任何后续的消息都不会出现。当我关闭客户端时,所有其他消息突然一下子都在服务器上显示出来。
服务器看到的情况如下:
Received: message 1
长时间没有活动...
然后我关闭了客户端
Received: message 2 message 3 message 4 message 5 etc..
我在sendMessage()方法中加入了println,并且该方法正在实时调用。
sendMessage
方法是在什么上下文中运行的?它是从在 UI 线程上运行的Activity
中运行,还是从在非 UI 线程上运行的某个类中运行? - Jes