多线程套接字Java

多线程套接字Java,java,multithreading,objectinputstream,objectoutputstream,Java,Multithreading,Objectinputstream,Objectoutputstream,我的客户: class Read_ChatClient extends Thread{ private static Socket client; private String user; static ArrayList<SingleChatF> chatFrames = new ArrayList<>(); public Read_ChatClient(Socket client, String username) { this.client = cli

我的客户:

class Read_ChatClient extends Thread{

private static Socket client;
private  String user;
static ArrayList<SingleChatF> chatFrames = new ArrayList<>();

public Read_ChatClient(Socket client, String username) {
    this.client = client;
    this.user = username;
}

public void checkAddNewFrame(String sourceName, String desName, String mess){
    boolean exitFrame = false;
    int index = 0;
    for(SingleChatF frame: chatFrames) {
        System.out.println(index + "; " + frame.getSourceName() + "; " + frame.getDestName());
        if (frame.Match(sourceName, desName)) {
            frame.gettxtchatall().append(mess + "\n");
            System.out.println("Founded frame: " + sourceName + "; " + desName);
            exitFrame = true;
            break;
        };
        index++;
    }
    if(!exitFrame) {
        SingleChatF newFrame = new SingleChatF(this.client, sourceName, desName);
        newFrame.setVisible(true);
        newFrame.gettxtchatall().append(mess + "\n");
        chatFrames.add(newFrame);
        System.out.println("Created new frame: " + sourceName + "; " + desName);
    }

}
@Override
public void run(){
    System.out.println(new Date().getTime() + " - Read_ChatClient");
    DataInputStream dis = null;
    try {
        dis = new DataInputStream(client.getInputStream());
        System.out.println(" - Read_ChatClient client.getInputStream() OK");
        while(true) {
            System.out.println(" - Read_ChatClient......");
            String sms = dis.readUTF();
            System.out.println(" - Read_ChatClient.sms: "+sms);
            if (sms.contains("login_successed")){
                System.out.println(" - Read_ChatClient: Join()");
                String[] info = sms.split(";");
                String username = info[1];
                String[] onlineuserList = info[2].split(",");
                if (username.equalsIgnoreCase(user)) {
                    MultiThreads_LoginClient.setLoginF(false);
                    MultiThreads_LoginClient.chatFrame = new ChatF(user, client);
                    MultiThreads_LoginClient.chatFrame.setVisible(true);
                    JTable OnlineTab = MultiThreads_LoginClient.chatFrame.getjtableonlineuser();
                    DefaultTableModel model = (DefaultTableModel) OnlineTab.getModel();
                    for (String name : onlineuserList) {
                       model.addRow(new String[]{name});
                    }
                }else if(!username.equalsIgnoreCase(user)){
                     MultiThreads_LoginClient.chatFrame.getjtableonlineuser().setModel(new DefaultTableModel(null,new String[]{"Online Users"}));
                    for (String name : onlineuserList) {
                        JTable OnlineTab = MultiThreads_LoginClient.chatFrame.getjtableonlineuser();
                        DefaultTableModel model = (DefaultTableModel) OnlineTab.getModel();
                        model.addRow(new String[]{name}); 
                    }
                    MultiThreads_LoginClient.chatFrame.gettxtchatall().append(username+" da ket noi\n");
                }
            } else if (sms.contains("login_failed;")) {
                JOptionPane.showMessageDialog(null, "Login Failed");
            } else if (sms.contains("user_actived")) {
                JOptionPane.showMessageDialog(null, "User's activing");
            }else if(sms.contains("updateOnlineUserList")){
                String[] list = sms.split(":");
                String[] newList = list[1].split(",");
                MultiThreads_LoginClient.chatFrame.getjtableonlineuser().setModel(new DefaultTableModel(null,new String[]{"Online Users"}));
                for (String name : newList) {
                    JTable OnlineTab = MultiThreads_LoginClient.chatFrame.getjtableonlineuser();
                    DefaultTableModel model = (DefaultTableModel) OnlineTab.getModel();
                    model.addRow(new String[]{name});
                }
                System.out.println("updateOnlineUserList:"+sms);
            }else if(sms.contains("chatPrivate")){
                //{ChatPrivate}:{Source_name}:{des_name}:{mess}:{host:port}
                System.out.println("ClientRead_chatPrivate: " + sms);
                String[] content = sms.split(";");
                String sourceName = content[1];
                String desName = content[2];
                String mess = content[3];
                checkAddNewFrame(desName, sourceName, mess);
            }else if(sms.contains("AlertAlert_SendFilesToClient")){
                System.out.println("AlertAlert_SendFilesToClient");
                currentThread().wait();
                Read_FileClient rf = new Read_FileClient(client);
                rf.start();
            }else{
                MultiThreads_LoginClient.chatFrame.gettxtchatall().append("\n" + sms);
                System.out.println(sms);
            }
        }
    } catch (Exception e) {
       try {
           currentThread().wait();
           Read_FileClient rf = new Read_FileClient(client);
           rf.start();
           //dis.close();
        } catch (InterruptedException ex) {
            Logger.getLogger(Read_ChatClient.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}}
我的类发送文件:

class Write_SendFiles extends Thread{
private Data_file data;
private Socket client;
public Write_SendFiles(Data_file data,Socket client) {
  this.data = data;
  this.client = client;
}

@Override
public void run() {
    System.out.println("Write_SendFiles");
    ObjectOutputStream oos = null;
    try {
        oos = new ObjectOutputStream(client.getOutputStream());
         System.out.println("-Write_SendFiles:"+data.getfilename());
        oos.writeObject(data);

        System.out.println("-Write_SendFiles: pass send file");
    } catch (IOException ex) {
        /*try {
            oos.close();
        } catch (IOException ex1) {
             System.out.println("-Write_SendFiles Err:"+ex.getMessage());
            Logger.getLogger(Write_SendFiles.class.getName()).log(Level.SEVERE, null, ex1);
        }*/
          System.out.println("-Write_SendFiles Err:"+ex.getMessage());
        Logger.getLogger(Write_SendFiles.class.getName()).log(Level.SEVERE, null, ex);
    }
}   }
类Read\u FileClient扩展线程{

private Socket client;

public Read_FileClient(Socket client) {
    this.client = client;
}

@Override
public void run() {
    System.out.println("Client file");
    ObjectInputStream ois = null;
    try {
        ois = new ObjectInputStream(client.getInputStream());
        System.out.println("-Server file: pass new obj");
        try {
            Data_file datafile = (Data_file) ois.readObject();
            System.out.println("-Server file:read file successfully");
            boolean exitingChatFrame_file = false;
            for (SingleChatF single : Read_ChatClient.chatFrames) {
                exitingChatFrame_file = single.Match(datafile.getdes_name(), datafile.getdes_name());
                System.out.println("File - Finding frame: Source=" + datafile.getdes_name() + "; Dest=" + datafile.getdes_name() + "; " + exitingChatFrame_file);
                if (exitingChatFrame_file) {
                    JList FilesTranfer = single.getjlisttranfer();
                    DefaultListModel model = new DefaultListModel();
                    FilesTranfer.setModel(model);
                    model.addElement(datafile);
                    System.out.println("Founded");
                    single.gettxtchatall().append("Getting file...");
                    break;
                }
            }
            if (!exitingChatFrame_file) {
                System.out.println("ClientRead_chatPrivate: not active");
                SingleChatF newFrame = new SingleChatF(this.client, datafile.getdes_name(), datafile.getdes_name());
                newFrame.setVisible(true);
                JList FilesTranfer = newFrame.getjlisttranfer();
                DefaultListModel model = new DefaultListModel();
                FilesTranfer.setModel(model);
                model.addElement(datafile);
                chatFrames.add(newFrame);
                newFrame.gettxtchatall().append("Getting file...");
            }

            //client.close();
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Read_ChatClient.class.getName()).log(Level.SEVERE, null, ex);
        }
    } catch (IOException ex) {
        Logger.getLogger(Read_FileClient.class.getName()).log(Level.SEVERE, null, ex);
    }

}}
我的服务器读取文件:

class Read_FileServer extends Thread{
private Socket client;

public Read_FileServer(Socket client) {
    this.client = client;
}

@Override
public void run() {
    System.out.println("Server Read_FileServer");
    ObjectInputStream ois = null;
    ObjectOutputStream oos = null;
    try {
        ois = new ObjectInputStream(client.getInputStream());
        try {
            Data_file datafile = (Data_file)ois.readObject();
            System.out.println("-Server Read_FileServer: read file successfully");
            for(accountinfo item : MultiThreads_LoginServer.accountinfoList){
                if(item.username.equalsIgnoreCase(datafile.getdes_name())){
                    oos = new ObjectOutputStream(item.socket.getOutputStream());
                    oos.writeObject(datafile);
                }
            }
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Read_FileServer.class.getName()).log(Level.SEVERE, null, ex);
        }

    } catch (IOException ex) {
        try {
            ois.close();
            oos.close();

        } catch (IOException ex1) {
            Logger.getLogger(Read_FileServer.class.getName()).log(Level.SEVERE, null, ex1);
        }

        Logger.getLogger(Read_FileServer.class.getName()).log(Level.SEVERE, null, ex);
    }
}
}
但是现在我的函数是send file。所以我必须使用ObjectInputStream和ObjectOutputStream。问题是DataInputStream、DataOutputStream和ObjectInputStream、OutputStream之间存在两种类型的差异。我如何才能将ObjectInputStream和ObjectOutputStreadm的线程放到我的类中。谢谢!

试试看(DataInputStream dis=新的DataInputStream(socket.getInputStream());
DataOutputStreamdos=新的DataOutputStream(socket.getOutputStream()){
System.out.println(“尝试用户登录”+sms);
String[]contents=sms.split(“;”);
字符串信息[]=sms.split(;”;//信息[1]:用户名-信息[2]:传递
Connection con=DBConnection.getConnection();
String query=“从`info`中选择*,其中`user`=?和`pw`=?”;
编制报表pst;
结果集rs;
试一试{
pst=con.prepareStatement(查询);
pst.setString(1,信息[1]);
pst.setString(2,信息[2]);
rs=pst.executeQuery();
如果(rs.next()){
//登录;{success:true,onlineuser:[“”,“”]}
//聊天;
如果(!MultiThreads_LoginServer.checkuserexits(信息[1])){
accountinfo temp=新的accountinfo(套接字,信息[1]);
多线程\u LoginServer.chatFrame\u Server.gettxtchatall().append(“Da ket noi”+信息[1]+“\n”);
System.out.println(“Da ket noi”+插座);
多线程\u LoginServer.accountinfoList.add(temp);
showonlineuser();
String statusString=“login_successed;”“+info[1]+”;“+multi-threads_LoginServer.convertoString();
BroadCastUserListToAllClients wu=新的BroadCastUserListToAllClients(statusString);
wu.start();
}否则{
writeUTF(“用户激活;;”);
}
}否则{
writeUTF(“登录失败;;”);
//dos.flush();
}
}catch(SQLException-ex){
Logger.getLogger(Server.class.getName()).log(Level.SEVERE,null,ex);
}
DBConnection.closeConnection(con);
多线程\u LoginServer.chatFrame\u Server.gettxtchatall().append(“用户:“+info[1]+”\tPass:“+info[2]+”\n”);
}捕获(例外e){
System.out.println(“-Error Read_LoginServer:”+e.getMessage());
}

你的意思是什么?
试试(DataInputStream dis=newDataInputStream(socket.getInputStream());DataOutputStreamdos=newDataOutputStream(socket.getOutputStream())
你能给我解释一下吗?在我的博文中没有DataOutputStreamdos=newDataOutputStream(socket.getOutputStream()).所以我认为这是一个answer@Ochimot你确实有,他仍然需要解释。1.停止在同一个套接字上创建新的
DataInput/OutputStreams
ObjectInput/OutputStreams
。继续使用相同的。2.如果你在一端使用
DataInput/OutputStreams
,你就不能使用
ObjectInput/OutputStreams在另一端。下定决心。如果您只使用
read/writeUTF()
,坚持使用
DataInput/OutputStreams
。如果要发送对象,请在两端使用
ObjectInput/OutputStreams
。同样,每个对象只创建一次。但我必须同时使用这两个,因为文件不能使用DataInput/OutputStreams。您不必同时使用这两个对象,因为您不能同时使用这两个对象,也不能同时使用您梦想的任何需求如果你必须在一个地方使用对象流,那么你必须在任何地方都使用它们。这没有两种方法。我正在构建一个聊天应用程序,所以我几乎使用read/writeUTF(),但是当我发送文件时,我必须使用read/writeobjectSo?你知道
ObjectInputStream.readUTF()吗
存在?并且
ObjectOutputStream.writeUTF()
class Read_FileServer extends Thread{
private Socket client;

public Read_FileServer(Socket client) {
    this.client = client;
}

@Override
public void run() {
    System.out.println("Server Read_FileServer");
    ObjectInputStream ois = null;
    ObjectOutputStream oos = null;
    try {
        ois = new ObjectInputStream(client.getInputStream());
        try {
            Data_file datafile = (Data_file)ois.readObject();
            System.out.println("-Server Read_FileServer: read file successfully");
            for(accountinfo item : MultiThreads_LoginServer.accountinfoList){
                if(item.username.equalsIgnoreCase(datafile.getdes_name())){
                    oos = new ObjectOutputStream(item.socket.getOutputStream());
                    oos.writeObject(datafile);
                }
            }
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Read_FileServer.class.getName()).log(Level.SEVERE, null, ex);
        }

    } catch (IOException ex) {
        try {
            ois.close();
            oos.close();

        } catch (IOException ex1) {
            Logger.getLogger(Read_FileServer.class.getName()).log(Level.SEVERE, null, ex1);
        }

        Logger.getLogger(Read_FileServer.class.getName()).log(Level.SEVERE, null, ex);
    }
}
}