黑马程序员技术交流社区
标题:
请教一个关于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 编辑
public void actionPerformed(ActionEvent e) //定义窗口控件功能
{
try
{
String str=serverMsg.getText();
byte[ ] buf=str.getBytes();
serverMsg.setText("");
outs.write(buf);
}
catch(IOException ioe){}
}
复制代码
楼主这段服务器端的代码,设置了一个监听来触发写的动作,但是似乎没有定义触发的条件哦?
那么服务器端收到了客户端的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