public void run() { while(true) { //这里该线程就可以接受客户端的信息 try { ObjectInputStream ois=new ObjectInputStream(s.getInputStream()); Message m=(Message)ois.readObject(); System.out.println(m.getSender()+"给 "+m.getGetter()+"发送: "+m.getCon());//判断接受到客户端的信息 //拿到发送者与服务器的socket,此时就需要hashmap; SerConClientThread sc=ManageClientThread.getClientThread(m.getGetter()); ObjectOutputStream oos=new ObjectOutputStream(sc.s.getOutputStream()); //接受人的通信线程; oos.writeObject(m); } catch(Exception e) { e.printStackTrace(); } } }
时间: 2023-07-15 14:10:12 浏览: 47
这段代码是一个多线程的服务器端程序,用于接收客户端发送的消息,并将消息发送给指定的接收者。
程序的主要逻辑如下:
1. 服务器端通过 socket.accept() 方法监听客户端的连接请求,每当有新的客户端连接时,就会创建一个新的线程来处理该客户端的请求。
2. 在线程中,通过 ObjectInputStream 读取客户端发送的消息,并解析出消息的发送者、接收者以及消息内容。
3. 利用 ManageClientThread 类中维护的 HashMap,根据接收者的用户名获取对应的 SerConClientThread 对象,再通过其 socket 获取 ObjectOutputStream 对象,将消息发送给接收者。
4. 如果出现异常,则打印堆栈信息。
需要注意的是,这段代码还缺少了对客户端下线的处理。如果客户端下线,则需要将其对应的 SerConClientThread 对象从 HashMap 中删除。
相关问题
ObjectInputStream ois = new ObjectInputStream( new FileInputStream(file) );
这段代码是用来从文件中读取对象的。首先通过`FileInputStream`打开指定的文件,然后通过`ObjectInputStream`读取文件中的对象。这些对象必须是之前使用`ObjectOutputStream`写入文件的,而且读取的顺序必须与写入的顺序相同。如果读取的对象类型与写入的对象类型不同,程序可能会抛出`ClassCastException`异常。读取完毕后,关闭文件流以释放资源。
new Thread(new ServerWindow()).start(); try { //监听是循环的,当和某个客户端建立连接后,会继续监听 ss = new ServerSocket(9999); while (true){ //如果没有客户端连接就会阻塞,有客户端连接就往下走 Socket socket = ss.accept(); //得到socket关联的对象输入流 ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); //读取客户端发送的user对象 User user = (User)ois.readObject(); ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); //验证
这段代码是一个死循环,不断监听客户端的连接请求。首先创建一个ServerSocket对象并绑定在9999端口上,然后进入循环等待客户端的连接请求。如果没有客户端连接,会一直阻塞在accept()方法处。当有客户端连接时,accept()方法会返回一个新的Socket对象,代表与客户端建立的连接。然后从该Socket的输入流中读取客户端发送的User对象,并创建一个与该Socket关联的对象输出流。接下来进行身份验证的操作。