我需要在我自己编写的java
服务器和C#
客户端之间进行套接字通信,问题是C#
客户端无法从我的java服务器接收任何消息,但是发送邮件到我的java服务器。
我的工作流程:
Java Server代码:
public class Communicator {
private int m_port;
private Socket m_socket;
private ServerSocket m_serverSocket;
public Communicator(int port) {
this.m_port = port;
initConnection();
}
private void initConnection() {
try {
System.out.println("Creating Server");
m_serverSocket = new ServerSocket(m_port);
System.out.println("Waiting for client connection");
m_socket = m_serverSocket.accept();
System.out.println("Connection made");
} catch (IOException e) {
e.printStackTrace();
}
}
public String sendMsg(JSONMessage msg) {
try {
//get msg
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(m_socket.getInputStream()));
System.out.println("Waiting for msg...");
String answer = bufferedReader.readLine();
System.out.println("Received: " + answer);
//send msg
PrintWriter writer = new PrintWriter(m_socket.getOutputStream(),true);
writer.print(msg.getMsg());
System.out.println("Sending: " + msg.getMsg());
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}
return "";
}
}
我的C#客户端代码:
class Communicator
{
private int m_port;
private Thread mainThread;
public Communicator(int port)
{
m_port = port;
mainThread = new Thread(new ThreadStart(this.initConnection));
mainThread.Start();
}
public void initConnection()
{
IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), m_port);
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
Console.WriteLine("Trying to build connection");
server.Connect(ip);
Console.WriteLine("Connection successful");
NetworkStream ns = new NetworkStream(server);
StreamReader sr = new StreamReader(ns);
StreamWriter sw = new StreamWriter(ns);
string data;
string welcome = "Hello";
Console.WriteLine("Sending: " + welcome);
sw.WriteLine(welcome);
sw.Flush();
Console.WriteLine("Receiving...");
data = sr.ReadLine();
// --> NEVER REACHING THIS POINT <---
Console.WriteLine("Received: " + data);
}
catch (SocketException e)
{
Console.WriteLine("Connection failed.");
return;
}
}
}
有人知道为什么它永远不会到达我的客户代码Console.WriteLine("Received: " + data);
吗?
我已经尝试过双方的等待。我没有得到任何例外或错误,所以我真的不知道我的问题在哪里。
由于
答案 0 :(得分:4)
如果您的接收方需要行,则您的发件人必须发送行。您的发件人不会发送线路,因此接收方会一直等到它为止。
为了避免将来出现这些问题,您应该始终制作一份规范文档,说明协议的工作原理,最好是在字节级别。它应指定协议是否包含消息,如果是,则指示发送方如何标记消息边界以及接收方如何识别它们。
此处,您的接收方通过查找行结尾来识别消息边界。但是您的发件人不会使用行结尾标记邮件边界。所以接收器永远等待。
如果您有协议规范,这将是显而易见的。将来,我强烈建议您花时间指定您实施的每个协议。
答案 1 :(得分:2)
您需要使用println()添加新行而不是print()。在Java中,readLine等待一个新行,我希望它在C#中也能这样做。 println也会自动刷新,所以你也不需要刷新。
如果您打算使用此连接mreo而不是一次,则需要保留BufferedReader和PrintWriter以进行连接。 (所以我建议你在创建/接受套接字后创建它们)为同一个套接字多次创建这些可能容易出错并且容易混淆。