📄 j02150301.java
字号:
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
public class j02150301 extends Frame implements Runnable
{
DatagramSocket receSocket;
DatagramPacket recePacket;
DatagramSocket sendSocket;
DatagramPacket sendPacket;
boolean wantReceive = false;
List list1;
Label label1,label2,label3,label4,label5,label6,label7;
TextField textField1,textField2,textField3,textField4,textField5;
Button button1,button2,button3;
public j02150301()
{
this.setLayout(null);
this.setBounds(200,200,400,445);
this.setTitle("UDP 网络聊天室");
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
label1 = new Label("本地端 IP:");
try
{
label1.setText("本地端 IP:"
+ InetAddress.getLocalHost().getHostAddress());
}
catch(UnknownHostException ecp)
{
label1.setText("本地端 IP:无法得知");
}
label1.setBounds( 10, 25, 155, 25 );
label1.setBackground(new Color(255,193,255));
this.add(label1);
label2= new Label("收之Port:");
label2.setBounds( 170, 25, 60, 25 );
this.add(label2);
textField1 = new TextField("3333");
textField1.setBounds( 235, 25, 45, 25 );
this.add(textField1);
label3= new Label("送之Port:");
label3.setBounds( 170, 55, 60, 25 );
this.add(label3);
textField2 = new TextField("8888");
textField2.setBounds( 235, 55, 45, 25 );
this.add(textField2);
button1 = new Button("开始收");
button1.setBounds( 285, 25, 50, 25 );
button1.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
wantReceive = true;
new Thread(getThis()).start();
button1.setEnabled(false);
textField1.setEnabled(false);
}
});
this.add(button1);
button2 = new Button("停止收");
button2.setBounds( 340, 25, 50, 25 );
button2.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
wantReceive = false;
button1.setEnabled(true);
textField1.setEnabled(true);
}
});
this.add(button2);
label4= new Label("交谈对向:");
label4.setBounds( 10, 100, 70, 25 );
label4.setBackground(new Color(255,193,255));
this.add(label4);
label5 = new Label("IP =");
label5.setBounds( 80, 100, 25, 25 );
this.add(label5);
textField3 = new TextField("127.0.0.1");
textField3.setBounds( 110, 100, 110, 25 );
this.add(textField3);
label6 = new Label("对方收之Port =");
label6.setBounds( 230, 100, 90, 25 );
this.add(label6);
textField4 = new TextField("3333");
textField4.setBounds( 320, 100, 45, 25 );
this.add(textField4);
label7 = new Label("发言:");
label7.setBounds( 10, 135, 40, 25 );
this.add(label7);
textField5 = new TextField("Hi cyh");
textField5.setBounds( 55, 135, 250, 25 );
textField5.addKeyListener(new KeyAdapter()
{
public void keyReleased(KeyEvent e)
{
if(e.getKeyCode() == KeyEvent.VK_ENTER)
{
sendMesg();
textField5.setText("");
}
}
});
this.add(textField5);
button3 = new Button("送出");
button3.setBounds( 310, 135, 70, 25 );
button3.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
sendMesg();
textField5.setText("");
}
});
this.add(button3);
list1 = new List();
list1.setBounds( 10, 175, 380, 260 );
this.add(list1);
this.setBackground(new Color(220,255,255));
this.setVisible(true);
} //public j02150301() end
public void paint(Graphics g)
{
list1.setSize(this.getWidth()-20,this.getHeight()-190);
}
j02150301 getThis()
{
return this;
}
public void run()
{
byte receBUF[];
try
{
while( wantReceive )
{ //接收讯息
receBUF = new byte[150];
receSocket = new DatagramSocket(Integer.parseInt(textField1.getText().trim()));
//若不指定本地 Port,会自动 bind 一个本地的 Port
recePacket = new DatagramPacket(receBUF , receBUF.length );
receSocket.receive( recePacket );
String str = new String( recePacket.getData() ).trim();
if(!str.equals(""))
{ //收到的若是空字符串,不加入list 显示
list1.add(str);
list1.makeVisible(list1.getItemCount()-1); //卷动到可见最后一项
}
receSocket.close();
Thread.sleep(1000);
}
}
catch(UnknownHostException E){System.out.println("Excp1");}
catch(InterruptedException E){System.out.println("Excp2");}
catch( SocketException E){System.out.println("Excp3");}
catch(IOException E){System.out.println("Excp4");}
} //void run() end
void sendMesg()
{ //送出讯息
try
{
if(textField5.getText().trim().equals(""))
return; //未发言则不送出
if(textField2.getText().trim().equals(""))
textField2.setText( String.valueOf(Integer.parseInt(textField1.getText().trim())+1 ) );
sendSocket = new DatagramSocket(Integer.parseInt(textField2.getText().trim()));
//sendSocket = new DatagramSocket(); //也可,会自动 bind 一个 Port
/* 本例有指定本地端「送」之 Port,勿同于本地端「收」之 Port,
否则讯息可能送不出去,因该 Port 已被使用 */
String mesg
= "发言人:IP = " + InetAddress.getLocalHost().getHostAddress()
+ " 收之Port = " + textField1.getText().trim()
+ " 送之Port = " + textField2.getText().trim()
+ "> " + textField5.getText().trim();
sendPacket
= new DatagramPacket(
mesg.getBytes(), mesg.getBytes().length,
InetAddress.getByName(textField3.getText().trim()),
Integer.parseInt(textField4.getText().trim())
);
//指定对方 IP 地址,及对方用来「收」之Port
mesg = "Send To "+ textField3.getText().trim()
+ " Port = " + textField4.getText().trim()
+ "> " + textField5.getText().trim();
list1.add(mesg); //在本地显示自己对别人的发言
sendSocket.send(sendPacket); //送出数据封包
sendSocket.close();//关闭 DatagramSocket
}
catch(SocketException E){System.out.println("Excp5");}
catch(IOException E){System.out.println("Excp6");}
}//void sendMesg() end
public static void main(String[] args)
{
new j02150301();
}
}//class j02150301 end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -