本人qq邮箱是[email protected]谢谢哥哥姐姐了,

解决方案 »

  1.   

    服务器端的代码
    import java.awt.BorderLayout;
    import java.awt.Container;
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import javax.swing.JFrame;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;
    import javax.swing.JScrollPane;public class J_ChatServer extends JFrame
    {
    private ObjectInputStream m_input;
    private ObjectOutputStream m_output;
    private JTextField m_enter;
    private JTextArea m_display;
    private int m_clientNumber=0;

    public J_ChatServer()
    {
    super("聊天程序服务器端");
    Container c=getContentPane();
    m_enter=new JTextField();
    m_enter.setEnabled(false);
    m_enter.addActionListener(new ActionListener()
    {
    public void actionPerformed(ActionEvent event)
    {
    try
    {
    String s=event.getActionCommand();
    m_output.writeObject(s);
    m_output.flush();
    mb_displayAppend("服务器端:"+s);
    m_enter.setText("");
    }
    catch(Exception e)
    {
    System.err.println(e);
    e.printStackTrace();
    }
    }
    }
    );
    c.add(m_enter,BorderLayout.NORTH);
    m_display=new JTextArea();
    c.add(new JScrollPane(m_display),BorderLayout.CENTER);
    }
    public void mb_displayAppend(String s)
    {
    m_display.append(s+"\n");
    m_display.setCaretPosition(m_display.getText().length());
    m_enter.requestFocusInWindow();
    }
    public boolean mb_isEndSession(String m)
    {
    if(m.equalsIgnoreCase("q"))
    return (true);
    if(m.equalsIgnoreCase("quit"))
    return (true);
    if(m.equalsIgnoreCase("exit"))
    return (true);
    if(m.equalsIgnoreCase("end"))
    return (true);
    if(m.equalsIgnoreCase("结束"))
    return (true);
    return false;

    }
    public void mb_run()
    {
    try
    {
    ServerSocket server=new ServerSocket(5000);
    String m;
    while(true)
    {
    m_clientNumber++;
    mb_displayAppend("等待连接["+m_clientNumber+"]");
    Socket s=server.accept();
    mb_displayAppend("接收到客户端链接["+m_clientNumber+"]");
    m_output=new ObjectOutputStream(s.getOutputStream());
    m_input=new ObjectInputStream(s.getInputStream());
    m_output.writeObject("连接成功");
    m_output.flush();
    m_enter.setEnabled(true);
    do
    {
    m=(String)m_input.readObject();
    mb_displayAppend("客户端:"+m);
    }while(!mb_isEndSession(m));
    m_output.writeObject("q");
    m_output.flush();
    m_enter.setEnabled(false);
    m_output.close();
    m_input.close();
    s.close();
    mb_displayAppend("连接["+m_clientNumber+"]结束");
    }
    }
    catch(Exception e)
    {
    System.err.println(e);
    e.printStackTrace();
    mb_displayAppend("连接["+m_clientNumber+"]发生异常");
    }
    }
    public static void main(String args[])
    {
    J_ChatServer app =new J_ChatServer();
    app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    app.setSize(350,150);
    app.setVisible(true);
    app.mb_run();
    }}
      

  2.   

    客户端的代码
    import java.awt.BorderLayout;
    import java.awt.Container;
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import javax.swing.JFrame;
    import javax.swing.JTextField;
    import javax.swing.JTextArea;
    import javax.swing.JScrollPane;
    import java.net.InetAddress;
    public class J_ChatClient extends JFrame
    {
    private ObjectInputStream m_input;
    private ObjectOutputStream m_output;
    private JTextField m_enter;
    private JTextArea m_display;
    public J_ChatClient()
    {
    super("聊天程序客户端");
    Container c=getContentPane();
    m_enter=new JTextField();
    m_enter.setEnabled(false);
    m_enter.addActionListener(new ActionListener()
    {
    public void actionPerformed(ActionEvent event)
    {
    try
    {
    String s=event.getActionCommand();
    m_output.writeObject(s);
    m_output.flush();
    mb_displayAppend("客户端:"+s);
    m_enter.setText("");
    }
    catch(Exception e)
    {
    System.err.println(e);
    e.printStackTrace();
    }
    }
    }
    );
    c.add(m_enter,BorderLayout.NORTH);
    m_display=new JTextArea();
    c.add(new JScrollPane(m_display),BorderLayout.CENTER);
    }
    public void mb_displayAppend(String s)
    {
    m_display.append(s+"\n");
    m_display.setCaretPosition(m_display.getText().length());
    m_enter.requestFocusInWindow();
    }
    public boolean mb_isEndSession(String m)
    {
    if(m.equalsIgnoreCase("q"))
    return (true);
    if(m.equalsIgnoreCase("quit"))
    return (true);
    if(m.equalsIgnoreCase("exit"))
    return (true);
    if(m.equalsIgnoreCase("end"))
    return (true);
    if(m.equalsIgnoreCase("结束"))
    return (true);
    return false;

    }
    public void mb_run(InetAddress host,int port)
    {
    try
    {
    mb_displayAppend("尝试连接");
    Socket s=new Socket (host,port);//host可以是InetAddress类型吗,好像没这个构造方法啊
    String m;
    m_output=new ObjectOutputStream(s.getOutputStream());
    m_input=new ObjectInputStream(s.getInputStream());
    m_enter.setEnabled(true);
    do
    {
    m=(String)m_input.readObject();
    mb_displayAppend("服务器端:"+m);
    }while(!mb_isEndSession(m));
    m_output.writeObject("q");
    m_output.flush();
    m_output.close();
    m_input.close();
    s.close();
    System.exit(0);
    }
    catch(Exception e)
    {
    System.err.println(e);
    e.printStackTrace();
    mb_displayAppend("发生异常:");
    }
    }
    public static void main(String args[]) throws UnknownHostException 
    {
    byte[]s=new byte[]{(byte)192,(byte) 168,(byte)0,(byte)101};
    /*InetAddress ts=null;
    try
    {
    ts=InetAddress.getByAddress(s);
    }
    catch(UnknownHostException e)
    {
    System.err.println(e);
    e.printStackTrace();
    }*/
    J_ChatClient app=new J_ChatClient();
    app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    app.setSize(350,150);
    app.setVisible(true);
    //if(args.length==0)
    app.mb_run(InetAddress.getByAddress(s), 5000);
    //else app.mb_run(args[0], 5000);
    }}
      

  3.   

    我这个课本的tcp程序只能实现简单的服务器与客户端通信。。
    第五题是:把这个程序改成多线程的可以实现多个客户端与服务器聊天的功能。
    第六题是:把这个程序改成udp协议下的程序,实现同样的功能。