输入内容后,按回车键即可。
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.List;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.net.*;
@SuppressWarnings("serial")
public class Chat extends Frame {
List lst = new List(6);
TextField tfIP = new TextField(15);
// 消息文本框
TextField tfData = new TextField(20);
// 利用网络来发送消息。
DatagramSocket ds = null;
public Chat() {
try {
// 端口为3000.
ds = new DatagramSocket(3000);
} catch (SocketException e1) {
e1.printStackTrace();
}
this.add(lst, "Center");
Panel p = new Panel();
this.add(p, "South");
p.setLayout(new BorderLayout());
p.add(tfIP, "West");
p.add(tfData, "East");
/**
*
* 用于接收 消息。
*
*/
new Thread(new Runnable() {
@Override
public void run() {
byte buf[] = new byte[1024];
// DatagramPacket 用于 接收到的消息 并存入 buf中。
DatagramPacket dp = new DatagramPacket(buf, 1024);
while (true) {
try {
ds.receive(dp);
// 接受消息。
lst.add(new String(/* dp.getData() */buf, 0, dp
.getLength())
+ "from"
+ dp.getAddress().getHostAddress()
+ ":" + dp.getPort(), 0);
} catch (IOException e) {
if(!ds.isClosed()){// 用于判断 Socket 是否已经关闭了。
e.printStackTrace();
}
}
}
}
}).start();
// 匿名内置类。----------消息文本框的事件处理代码!!!
// 监听器。
tfData.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
byte buf[];
buf = tfData.getText().getBytes();
try {
DatagramPacket dp = new DatagramPacket(buf, buf.length,
InetAddress.getByName(tfIP.getText()), 3000);
// 发送消息。。
ds.send(dp);
} catch (UnknownHostException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
// 清除消息文本的内容。
tfData.setText("");
}
});
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
ds.close();
dispose();
System.exit(0);
}
});
}
public static void main(String[] args) {
System.out.println("Strating Chat...");
Chat mainFrame = new Chat();
mainFrame.setSize(300, 400);
mainFrame.setTitle("Chat");
mainFrame.setVisible(true);
mainFrame.setResizable(false);// 窗口的大小不可变。
}
}
java.io
类 PrintWriter
java.lang.Object java.io.Writer java.io.PrintWriter
-
所有已实现的接口:
- Closeable, Flushable, Appendable
public class PrintWriter extends Writer
向文本输出流打印对象的格式化表示形式。此类实现在 PrintStream
中的所有print 方法。它不包含用于写入原始字节的方法,对于这些字节,程序应该使用未编码的字节流进行写入。
与 PrintStream
类不同,如果启用了自动刷新,则只有在调用println、printf 或format 的其中一个方法时才可能完成此操作,而不是每当正好输出换行符时才完成。这些方法使用平台自有的行分隔符概念,而不是换行符。
此类中的方法不会抛出 I/O 异常,尽管其某些构造方法可能抛出异常。客户端可能会查询调用 checkError()
是否出现错误。
PrintWriter
public PrintWriter(Writer out)
-
创建不带自动行刷新的新 PrintWriter。
-
参数:
-
out
- 字符输出流
-
PrintWriter
public PrintWriter(Writer out, boolean autoFlush)
-
创建新 PrintWriter。
-
参数:
-
out
- 字符输出流 -
autoFlush
- boolean 变量;如果为 true,则 println、 printf 或 format 方法将刷新输出缓冲区
-
PrintWriter
public PrintWriter(OutputStream out)
-
根据现有的 OutputStream 创建不带自动行刷新的新 PrintWriter。此便捷构造方法创建必要的中间 OutputStreamWriter,后者使用默认字符编码将字符转换为字节。
-
参数:
-
out
- 输出流
另请参见:
-
OutputStreamWriter.OutputStreamWriter(java.io.OutputStream)
-
PrintWriter
public PrintWriter(OutputStream out, boolean autoFlush)
-
通过现有的 OutputStream 创建新的 PrintWriter。此便捷构造方法创建必要的中间 OutputStreamWriter,后者使用默认字符编码将字符转换为字节。
-
参数:
-
out
- 输出流 -
autoFlush
- boolean 变量;如果为 true,则 println、 printf 或 format 方法将刷新输出缓冲区
另请参见:
-
OutputStreamWriter.OutputStreamWriter(java.io.OutputStream)
-