黑马程序员技术交流社区

标题: 请教一个关于socket编程问题…… [打印本页]

作者: 涂金哲    时间: 2012-6-13 10:46
标题: 请教一个关于socket编程问题……
服务端的程序:
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
        public class ChatroomServer extends Frame implements ActionListener //创建可视化窗口
        {
                Button btn=new Button("发送");                //创建按钮
                TextArea serverMsg;                                        //创建文本域
                InputStream ins;                                        //流对象
                OutputStream outs;
                Socket sock;
                ServerSocket server;
                public ChatroomServer(){                        //初始化窗口
                        setTitle("Server Window");
                        setLayout(new BorderLayout());
                        serverMsg=new TextArea(10,50);
                        btn.addActionListener(this);
                        add("South",btn);
                        add("Center",serverMsg);
                        setResizable(false);
                        addWindowListener(new WindowAdapter()
                        {
                                public void windowClosing(WindowEvent e)
                                {System.exit(0);}});
                        pack();
                        setVisible(true);
                        try                                                                //通过socket类中的方法实现端口的监听、接收客户端请求功能
                        {
                                server=new ServerSocket(9000);
                                sock=server.accept();
                                InetAddress ClientAddress=sock.getInetAddress();
                                serverMsg.append("已接收到客户机:"+ClientAddress.toString()+"\n");
                                ins=sock.getInputStream();
                                outs=sock.getOutputStream();
                        }
                        catch(IOException ioe)
                        {
                        }
                        while(true)                                                //创建缓冲区用以接收客户端的流
                        {
                                try{
                                        byte[] buf=new byte[256];
                                        ins.read(buf);                               
                                        String str=new String(buf);
                                        serverMsg.append("客户机:"+str+"\n");
                                        serverMsg.append("\n");
                                }
                                catch(IOException e)
                                {
                                }
                        }
                }
                        public void actionPerformed(ActionEvent e)        //定义窗口控件功能
                        {
               
                                try
                                {
                                        String str=serverMsg.getText();
                                        byte[ ] buf=str.getBytes();
                                        serverMsg.setText("");
                                        outs.write(buf);                                       
                                }
                                catch(IOException ioe){}
                               
                        }
                                        public static void main(String[] args)
                                        {
                                                new ChatroomServer();
                                        }       
        }
客户端的程序:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.net.*;
import java.io.*;
public class ChatroomClient extends Frame implements ActionListener
{
        Socket client;
        OutputStream os;
        InputStream ins;
        String s;
        TextArea textArea;
        Button Mybutton=new Button("发送");
        public ChatroomClient()
        {
                setTitle("Client window");
                setLayout(new BorderLayout());
                Mybutton.addActionListener(this);
                textArea=new TextArea(10,50);
                add("South",Mybutton);
                add("Center",textArea);
                addWindowListener(new WindowAdapter()
                {
                        public void windowClosing(WindowEvent e)
                        {System.exit(0);}});
                setResizable(false);
                pack();
                setVisible(true);
                try
                {
                        client=new Socket(InetAddress.getLocalHost(),9000);
                        textArea.append("已连接服务器"+client.getInetAddress().getHostName()+":\n");
                        ins=client.getInputStream();
                        os=client.getOutputStream();
                }
                catch(IOException e)
                {
                        while(true)
                        {
                                try
                                {
                                        byte[] buf=new byte[256];       
                                        ins.read(buf);
                                        String str=new String(buf);
                                        textArea.append("服务器"+str);
                                        textArea.append("\n");
                                }
                                catch(IOException ioe)
                                {
                                       
                                }
                        }
                        }
                }
                        public void actionPerformed(ActionEvent e)
                        {
                                if(e.getSource()==Mybutton)
                                try
                                {
                                        String str=textArea.getText();
                                        byte[ ] buf=str.getBytes();
                                        textArea.setText("");
                                        os.write(buf);               
                                }
                                catch(IOException ioe){}       
                        }
        public static void main(String[] args)
                                        {
                                                new ChatroomClient();
                                        }
        }
功能描述:图像化的窗口,实现客户端与服务器端的消息发送。
问题:socket类中的getinputstream()方法返回套接字的输入流,getoutputstream()方法返回套接字输出流,在客户端和服务器端都有实现,不知道问题出在哪里……?只能从客户端发消息,服务端可以接,但是反过来不行。
谢谢!

作者: 云惟桉    时间: 2012-6-13 12:11
本帖最后由 云惟桉 于 2012-6-13 12:12 编辑
  1.                        public void actionPerformed(ActionEvent e)        //定义窗口控件功能
  2.                         {
  3.                
  4.                                           try
  5.                                          {
  6.                                                 String str=serverMsg.getText();
  7.                                                 byte[ ] buf=str.getBytes();
  8.                                                 serverMsg.setText("");
  9.                                                 outs.write(buf);                                       
  10.                                          }
  11.                                          catch(IOException ioe){}
  12.                                 
  13.                                          }
复制代码
楼主这段服务器端的代码,设置了一个监听来触发写的动作,但是似乎没有定义触发的条件哦?
那么服务器端收到了客户端的message以后,没有任何动作去触发写动作,它怎么会向客户端写东西呢。
解决方法:
1、要么写的动作放在读的后面,不需要独立加一个监听listener;
2、要么加监听的时候,选定一个触发条件(这完全可以自己定义);

希望能帮到楼主~
作者: 王晓新    时间: 2012-6-13 13:19
云惟桉 发表于 2012-6-13 12:11
楼主这段服务器端的代码,设置了一个监听来触发写的动作,但是似乎没有定义触发的条件哦?
那么服务器端收 ...

嗯,学习一下!
作者: 涂金哲    时间: 2012-6-14 15:27
云惟桉 发表于 2012-6-13 12:11
楼主这段服务器端的代码,设置了一个监听来触发写的动作,但是似乎没有定义触发的条件哦?
那么服务器端收 ...

试过加的但没成功,就是按鈕的单击触发,才又去掉了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2