【发布时间】:2014-06-19 05:49:18
【问题描述】:
我有这三个类,TCPClient、TCPServer 和 Member。我正在使用 TCPClient 将 RequestPacket 对象发送到 TCPServer,然后 TCPServer 以字符串响应 TCPClient。代码如下:
TCP服务器
import java.io.*;
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.LinkedHashMap;
import java.util.Map;
import java.io.ObjectInputStream.GetField;
import java.net.*;
import data.RequestPacket;
public class TCPServer {
private static LinkedHashMap<Integer,String> port_database_map = new LinkedHashMap();
static{
port_database_map.put(2131,"testing1");
port_database_map.put(6789, "testing2");
}
public static void main(String[] args) throws Exception {
if(args.length==1){
String clientSentence;
String capitalizedSentence;
new TCPServer().sqlConnectionTest();
ServerSocket welcomeSocket = new ServerSocket(Integer.parseInt(args[0]));
System.out.println("Server running at "+welcomeSocket.getLocalSocketAddress()+" and port "+welcomeSocket.getLocalPort());
Socket connectionSocket = welcomeSocket.accept();
InputStream is = connectionSocket.getInputStream();
ObjectInputStream ois = new ObjectInputStream(is);
DataOutputStream outToClient;
//DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
while(true){
// BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
outToClient = new DataOutputStream(connectionSocket.getOutputStream());
//clientSentence = inFromClient.readLine();
RequestPacket rp = (RequestPacket) ois.readObject();
outToClient.writeUTF(rp.query);
outToClient.flush();
System.out.println("Received object "+rp.query);
//System.out.println("Client sentence is "+clientSentence);
//capitalizedSentence = getClientResponse(clientSentence);
// outToClient.writeBytes(getClientResponse(clientSentence));
}
} else{
System.out.println("Enter port numnber as argument");
System.exit(1);
}
}
public static String getClientResponse(String clientRequest){
return clientRequest.toUpperCase().trim()+'\n';
}
public void sqlConnectionTest(){
String sqlString;
try{
Class.forName("com.mysql.jdbc.Driver");
System.out.println("MySQLJDBC Driver registered");
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:8889/testing1","root","root");
if(connection!=null){
System.out.println("You made it!");
}else
System.out.println("Connection failed");
}catch(ClassNotFoundException e){
System.out.println("Where is your mySQL JDBC Driver? "+e);
}catch(SQLException e){
System.out.println("Caught SQLException "+e);
}
}
}
TCPClient
import java.io.*;
import java.net.*;
import java.util.Scanner;
import data.RequestPacket;
import data.RequestPacket.RequestType;
public class TCPClient {
public static void main(String[] args) throws UnknownHostException, IOException {
if(args.length==1){
String sentence;
String modifiedSentence;
//BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
Socket clientSocket = new Socket("0.0.0.0",Integer.parseInt(args[0]));
String query = "SELECT * FROM NOTHING";
//Scanner in = new Scanner(System.in);
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
RequestPacket rp = new RequestPacket(Integer.parseInt(args[0]), query, RequestType.NEW_REGISTRATION);
OutputStream os = clientSocket.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
/*while(in.hasNextLine())*/if(rp.port!=0){
DataInputStream inFromServer = new DataInputStream(clientSocket.getInputStream());
//sentence = in.nextLine();
//sentence = "Hello, this is Rohan";
System.out.println("Sentence is "+rp);
oos.writeObject(rp);
//outToServer.writeUTF(rp+"\n");
//outToServer.writeBytes(sentence+"\n");
oos.flush();
modifiedSentence = inFromServer.readLine();
System.out.println("DONE");
System.out.println("FROM SERVER: "+modifiedSentence);
//outToServer.flush();
}
oos.close();
os.close();
clientSocket.close();
}else{
System.out.println("Enter port for client to connect to");
System.exit(1);
}
}
}
请求包 /* */ 打包数据;
import java.io.Serializable;
/**
* @author rohandalvi
*
*/
public class RequestPacket implements Serializable {
public int port;
public String query;
public RequestType type;
public enum RequestType{
NEW_REGISTRATION,IN_TRANSIT_SCAN,REPLICATION,DELETE_MEMBERSHIP,REMOVE_BENEFICIARY
}
public RequestPacket(int port, String query,RequestType type){
this.port = port;
this.query = query;
this.type = type;
}
}
当我运行客户端时,它会将 RequestPacket 对象发送到 TCP 服务器,但是由于某种原因,TCPServer 没有向客户端返回 rp.query 值。它这样做了,只有当我停止服务器时,我才会立即看到在客户端打印的服务器响应。
如果您知道出了什么问题,请帮忙。谢谢。
【问题讨论】:
-
你有一个适用于客户端到服务器方向的合理的应用层协议,Java 的对象流协议。但我没有看到任何相反方向的应用层协议。那么客户端如何知道何时应该处理数据呢? (当然,当你停止服务器时除外。) TCP 101——你必须在 TCP 之上实现一个协议——它不会靠魔法工作。
-
您有很多注释掉的代码以及与问题无关的其他代码并没有帮助。还缺少代码,例如
RequestPacket。请尝试将您的代码缩减为一个简短但完整的程序,该程序可以演示问题但没有其他内容。 -
rp.query 是否在您的服务器端成功打印?
-
您是否尝试为查询属性添加吸气剂?我在 RPC 客户端中体验过。