iteye_15331 2009-06-17 11:05
浏览 237
已采纳

急啊!求程序!熟悉socket和多线程的高人请进!

:oops: 要求,服务器端不停地发送数据给客户端;客户端通过键盘输入的某个命令把服务器端的数据存到本地二进制文件(非文本文件)(最好能自己设置服务器的IP和端口) ,在通过其他某个命令停止上述操作;服务器端可以没有界面,客户端必须有界面;要用多线程实现,不要单线程的 :oops:
[b]问题补充:[/b]
小弟我是刚接触socket,很菜的。还希望高手们能提供下代码啊!
[b]问题补充:[/b]
我参照各位大虾的信息,写了一个程序。
服务器连续发送数据给客户端,可客户端还是无法连续将数据写入文件啊。
我的代码在我的博客里
http://mxx123.iteye.com/blog/410109
希望大家能指点一下小弟啊
附件里也是代码。

  • 写回答

4条回答 默认 最新

  • panyi5202 2009-06-17 12:17
    关注

    这个是我以前学java这部分的时候的一些代码,现在贴出来希望对你有点帮助,稍微改下应该就能满足你的要求了,如下:
    client.java

    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.*;
    import java.net.*;
    import java.io.*;

    class Client extends JFrame implements ActionListener,Runnable
    {
    JLabel label = new JLabel("Please input data:");
    JTextField tf = new JTextField(20);
    JButton send = new JButton("Send");

    JTextArea  area = new JTextArea(30,100);
    JScrollPane pane = new JScrollPane(area);
    
    Socket socket;
    BufferedReader br;
    PrintWriter bw;
    
    static String name;
    
    public Client()
    {
        super(name);
        addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent e)
            {
                bw.println("Window");
                System.exit(0);
            }
        });
        send.addActionListener(this);
        Container c = getContentPane();
        JPanel panel = new JPanel();
        panel.setLayout(new FlowLayout());
        panel.add(label);panel.add(tf);panel.add(send);
    
        c.add(panel,"North");
            c.add(pane);
        setSize(600,400);
        setVisible(true);
        init();
    }
    void init()
    {
        try
        {
            socket = new Socket("127.0.0.1",6666);
            br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            bw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()),true);
            bw.println(name);
    
            Thread thread = new Thread(this);
            thread.start();
        }catch(Exception e)
        {
            e.printStackTrace();
        }
    }
    public void run()
    {
        while(true)
        {
            try
            {
                String data = br.readLine();
                if(data.equals("Server Close"))
                {
                    System.exit(0);
                }
            JScrollBar jb = pane.getVerticalScrollBar();
            jb.setValue(jb.getMaximum());// 拉到最后一行
                area.append(data+"\n");
            }catch(Exception e)
            {
                e.printStackTrace();
            }
        }
    }
    public void actionPerformed(ActionEvent e)
    {
        String data = tf.getText();
        try
        {
            bw.println(data);
        }catch(Exception a)
        {
            a.printStackTrace();
        }       
    }
    public static void main(String[] args) 
    {
        if(args.length!=1)
        {
            System.out.println("Usage:java Client xiaowang");
            System.exit(0);
        }
        name = args[0];
        new Client();
    }
    

    }

    server.java

    import javax.swing.*;
    import java.net.*;
    import java.io.*;
    import java.util.*;
    import java.awt.event.*;

    class Server extends JFrame
    {
    JTextArea area = new JTextArea();
    JScrollPane pane = new JScrollPane(area);
    Vector vector = new Vector();
    public Server()
    {
    addWindowListener(new WindowAdapter()
    {
    public void windowClosing(WindowEvent e)
    {
    for(int i=0;i<vector.size();i++)
    {
    try
    {
    PrintWriter pw = (PrintWriter)vector.get(i);
    pw.println("Server Close");
    }catch(Exception a){}
    }
    System.exit(0);
    }
    });
    getContentPane().add(pane);
    setSize(300,400);
    setVisible(true);
    init();
    }

    void init()
    {
        try
        {
            ServerSocket server = new ServerSocket(6666);
            while(true)
            {
                Socket socket = server.accept();
                BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()),true);
                vector.add(pw);
                Chat c = new Chat(br);
                c.start();
            }
    
        }catch(Exception e)
        {
            e.printStackTrace();
        }
    }
    class Chat extends Thread
    {
        BufferedReader br;
        String name;
        public Chat(BufferedReader br)
        {
            this.br = br;
        }
        public void run()
        {
            try
            {
                name = br.readLine();
            }catch(Exception a)
            {
                a.printStackTrace();
            }
            while(true)
            {
                try
                {
                    String data = br.readLine();
                    if(data.equals("Window"))
                    {
                        break;
                    }
                    for(int i=0;i<vector.size();i++)
                    {
                        PrintWriter writer = (PrintWriter)vector.get(i);
                        writer.println(name+" : "+data);
                    }
                    area.append(name+" : "+data+"\n");
                }catch(Exception e)
                {
                    e.printStackTrace();
                }
            }
        }
    }
    
    public static void main(String[] args) 
    {
        new Server();
    }
    

    }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?