一课聊天小程序花了一个通宵
{:soso_e125:}
import java.io.*;
import java.awt.*;
import java.net.*;
import java.awt.event.*;
abstract class ChatWindow
{
//为了让继承他的子类可以修改文本区域的内容和操作网络,所以将他们设置为protected修饰
protected DatagramSocket client,server;
protected TextArea writeArea,readArea;
//窗体和窗体中的组件不能被修改,所以使用private修饰
private Frame frame ;
private Button send,close;
ChatWindow(String IP , int clientPort ,int serverPort)
{
try
{
//创建一个接收和发送的套接字
client = new DatagramSocket();
server = new DatagramSocket(serverPort);
//连接到指定的服务器
client.connect(InetAddress.getByName(IP),clientPort);
}
catch(SocketException e)
{
throw new RuntimeException("网络创建失败");
}
catch(UnknownHostException e)
{
throw new RuntimeException("网络连接失败");
}
ini();
}
private void ini()
{
//创建发送和关闭两个按键
send = new Button("发送 Ctr+Enter");
close = new Button("关闭");
//监听关闭按键
close.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
//关闭连接中的套接字
client.close();
server.close();
//退出虚拟机
System.exit(0);
}
});
//监听发送按键
send.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
send();
}
});
//设置按键的位置和大小
send.setBounds(350,410,90,25);
close.setBounds(450,410,70,25);
//创建输入和读取文本区域
writeArea = new TextArea("",500,80,readArea.SCROLLBARS_VERTICAL_ONLY);
readArea = new TextArea("",500,300,readArea.SCROLLBARS_VERTICAL_ONLY);
//添加键盘监听,实现Ctr+Enter
writeArea.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
if((e.getKeyCode()==KeyEvent.VK_ENTER)&&e.isControlDown())
send();
}
});
//设置输入和读取文本区域的大小
writeArea.setBounds(20,330,500,80);
readArea.setBounds(20,40,500,280);
//设置输入和读取文本区域的字体
writeArea.setFont(new Font("楷体",Font.BOLD,13));
readArea.setFont(new Font("楷体",Font.BOLD,13));
//创建聊天窗体
frame = new Frame("Mini 聊天室");
//设置窗口布局为null
frame.setLayout(null);
//设置窗口大小
frame.setBounds(500,100,550,450);
//将文本区域添加到聊天窗口
frame.add(writeArea);
frame.add(readArea);
//给窗体添加按钮
frame.add(send);
frame.add(close);
//显示窗口
frame.setVisible(true);
//添加窗口监听,重写windowClosing,用于关闭聊天窗口
frame.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
//关闭连接中的套接字
server.close();
client.close();
//关闭虚拟机
System.exit(0);
}
});
}
//抽象的发送方法
abstract void send();
//抽象的接收方法
abstract void receive();
}
class MiniChat extends ChatWindow
{
private String name = "";
//初始化的时候需要输入服务端和客户端的端口
MiniChat(String IP , int clientPort ,int serverPort)
{
super(IP,clientPort,serverPort);
new Thread() //创建并启动一个线程执行接收数据的功能
{
public void run()
{
receive();
}
}.start();
}
//发送方法的实现
void send()
{
//获取已经输入的文本
String str = writeArea.getText();
String str1 = (name+":\r\n"+writeArea.getText()+"\r\n");
byte[] buf = str1.getBytes();
//创建要发送的数据包
DatagramPacket sendDate = new DatagramPacket(buf,buf.length);
try
{
readArea.append(name+":\r\n"+str+"\r\n");
//发送数据
client.send(sendDate);
//数据发送之后情况输入文本区
writeArea.setText("");
}
catch(IOException e)
{
throw new RuntimeException("文件发送失败");
}
}
//接收方法的实现
void receive()
{
//创建一个保存数据的缓冲区
byte[] buf = new byte[1024];
//创建要接收数据的数据包
DatagramPacket reiveDate = new DatagramPacket(buf,buf.length);
try
{
//先接收一次数据,为了获取对方IP
server.receive(reiveDate);
if(name.equals(""))
{
//用IP地址作为名字
name = reiveDate.getAddress().getHostAddress();
}
while(true)
{
//将数据转换成字符串
String str = new String(buf);
//将字符串读取到文本区
readArea.append(str.substring(0,reiveDate.getLength()));
//接收数据
server.receive(reiveDate);
}
}
catch(IOException e)
{
}
}
//提供一个设置名字的方法
public void setName(String name)
{
this.name = name ;
}
public static void main(String args[])
{
MiniChat chat = new MiniChat("127.0.0.1",10000,12000);
chat.setName("张三");
}
}
|