简体   繁体   English

服务器套接字从一个客户端读取对象,并在Java中的其他套接字上写入

[英]server socket reads object from one client and writes on other socket in java

I want to develop a sever which do following tasks. 我想开发一个执行以下任务的服务器。 1)Accepts request from client1 reads objet and write another object 2)Accepts request from client2 reads objet and write another object 3)Client1 enters info of client2,server has to get the client2 based on info and write an object on client2 1)接受来自客户端1的请求读取对象并写入另一个对象2)接受来自客户端2的请求读取对象并写入另一个对象3)客户端1输入客户端2的信息,服务器必须基于该信息获取客户端2并在客户端2上写入对象

Server java 服务器Java

public class Server{
ServerSocket serverSocket ;
Socket socket;
@SuppressWarnings("rawtypes")
public static List<Map> clientList = new ArrayList<Map>();//creating list to store map objects of all clients


// Server socket instantiating
Server(int port) {
    try{
        serverSocket = new ServerSocket(port);
    }catch(Exception e){
        e.printStackTrace();
    }
}

//server is waiting on listen mode for accepting clients
void serverConnect() {
    while (true) {
        try {
            System.out.println("Server is Waiting for client to connect ");
            socket = serverSocket.accept();
            socket.setKeepAlive(true);
            System.out.println("connected to: "+ socket.getRemoteSocketAddress());
            new Thread(new ClientSession(socket)).start();//creating a new thread for every client
        } catch (Exception e) {
            e.printStackTrace();
            break;
        }
    }
}


public static void main(String args[]) throws IOException {
    Server server = new Server(5050);
    try {
        server.serverConnect();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

} }

ClientSession.java ClientSession.java

`public class ClientSession implements Runnable {

Socket clientsocket;
String emailId;
String msg;
String ipaddress;
String phoneNumber;
String sessionId;
String socketAddress;
String calleeInfo;
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost/Server";
ObjectOutputStream oos;
  @SuppressWarnings("rawtypes")
  Map globalmap = new HashMap();//creating a hashmap object to store sockets,objectoutputstreamobjects of clients

ClientSession(Socket socket) {
    // TODO Auto-generated constructor stub
    globalmap.put("clientsockets", socket);
    this.clientsocket = socket;
    System.out.println("socket--"+socket);
     try {
        oos = new ObjectOutputStream(clientsocket.getOutputStream());
        globalmap.put("oos", oos);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

@SuppressWarnings("unchecked")
public void run() {
    // TODO Auto-generated method stub
    System.out.println("A new Thread started");
    try {
        System.out.println("IN SERVER READ METHOD");
        ObjectInputStream ois = new ObjectInputStream(clientsocket.getInputStream());
        Map<String, String> map = (Map<String, String>) ois.readObject();
        System.out.println("map in servereread"+map);
        System.out.println("IN SERVER DECODE METHOD");
        msg =  map.get("msg");
        System.out.println(msg);
        emailId =  map.get("email");
        phoneNumber =  map.get("phoneno");
        globalmap.put("phoneno", phoneNumber);
        globalmap.put("email",emailId);
        Server.clientList.add(globalmap);
        if (msg.equals("REGISTER")) {
            System.out.println("IN DECODE REGISTER");
            ipaddress =  map.get("ipaddr");
        } else if (msg.equals("INVITE")) {
            System.out.println("IN DECODE INVITE");
            sessionId =  map.get("sessionId");
            calleeInfo =  map.get("calleeInfo");
        }
        analyze(map);
    } catch (Exception e) {
        e.printStackTrace();
    }

}



private void analyze(Map<String, String> map) {
    // TODO Auto-generated method stub
    try {
        String SQL = null;
        System.out.println(msg);
        Class.forName("com.mysql.jdbc.Driver");
        System.out.println("Connecting to database...");
        Connection conn = DriverManager.getConnection(DB_URL,"username","pwd");
        Statement st = conn.createStatement();
        SocketAddress socketAddr = clientsocket.getRemoteSocketAddress();
        socketAddress = socketAddr.toString();
        if (msg.equals("REGISTER")) {
            SQL = "INSERT INTO Register (email,phoneNumber,ipaddress,socketaddress) VALUES ('"+ emailId+ "','"+ phoneNumber+ "','"+ ipaddress+ "','" + socketAddress + "')";
            System.out.println("SQL statement..." + SQL);
            serverWrite();
        } else if (msg.equals("INVITE")) {
            System.out.println("Connecting to database for invite...");
            SQL = "INSERT INTO Invite (sessionid,calleremail,callerphoneNo,calleeInfo) VALUES ('"+ sessionId+ "','"+ emailId+ "','"+ phoneNumber+ "','" + calleeInfo + "')";
            System.out.println("SQL statement--" + SQL);
            System.out.println("CalleeInfo--" + calleeInfo);
            // Retrieve the socket of the destination
            String query = "SELECT * FROM Register WHERE email='"+ calleeInfo + "' OR phoneNumber = '" + calleeInfo+ "'";
            ResultSet rs = st.executeQuery(query);
            System.out.println("ResultSet--" + rs);
            if (rs.next()) {
                String socketaddr = rs.getString("socketaddress");
                String email= rs.getString("email");
                String phoneNo= rs.getString("phoneNumber");
                String ipadd= rs.getString("ipaddress");
            }
                for(int i=0;i<Server.clientList.size();i++){
                    String emailid= (String) Server.clientList.get(i).get("email");
                    String phone = (String) Server.clientList.get(i).get("phoneno");
                    if(calleeInfo.equals(emailid) || calleeInfo.equals(phone)){
                        ObjectOutputStream out1= (ObjectOutputStream) Server.clientList.get(i).get("oos");
                        System.out.println("ObjectOutputStream----"+out1);
                        System.out.println("writing on"+Server.clientList.get(i).get("clientsockets"));
                        System.out.println("map before writing on to client2--"+map);
                        out1.reset();
                        out1.writeObject(map);
                        out1.flush();
                        break;
                    }

                }
            // retrieve socket info from register table based on calleeInfo
            // as primary key
        }
        st.executeUpdate(SQL);

    } catch (Exception e) {
        e.printStackTrace();
    }
}


private void serverWrite() {
    // TODO Auto-generated method stub
    try {
        // Using ObjectOutputStream class to write object
          HashMap<String, String> map = new HashMap<String, String>();// Creating an object for HashMap class
          if (msg.equals("REGISTER")) {
            System.out.println("ObjectOutputStream storing--"+oos);
            map.put("msg", "REGISTERED"); // setting a message in HashMap object
            System.out.println("sending registered");
            oos.writeObject(map);// writing an object on socket
        } 
    /*  else if (msg.equals("INVITE")) {
            map.put("msg", "CALLING");
            System.out.println("sending calling");
        }*/

    } catch (Exception e) {
        e.printStackTrace();
    }
}

} }

It is going to the client1 socket but its not writing on the client2..Its writing on client1.. 它要去到client1套接字,但不写在client2上。它要写在client1上。

Thanks in advance. 提前致谢。

The problem is with the client not in the server in this case..but one suggestion is don't create map object as Map map= new Map;.It will take only Strings. 问题是在这种情况下客户端不在服务器中。但是一个建议是不要创建地图对象,因为Map map = new Map;。它将仅使用字符串。 just create as Map map=new Map();It will take Strings,arrays and all datatypes. 只需将其创建为Map map = new Map();它将使用字符串,数组和所有数据类型。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM