客户端
public class TalkClient {
public static void main(String[] args) {
// Create application frame.
ClientSend cs = new ClientSend();
TalkClientFrame frame = new TalkClientFrame(cs);
// Show frame
frame.setVisible(true);
}
}
//----------------------------------------------------
import java.net.*;
public class ClientSend {
private DatagramSocket ds_CSend;
private DatagramPacket dp_CSend;
public ClientSend(){
try{
ds_CSend = new DatagramSocket(8080);
}
catch(Exception e){
e.printStackTrace();
}
}
public void Sended(byte[] buf,String sip){
try{
dp_CSend = new DatagramPacket(buf,buf.length,InetAddress.getByName(sip),8888);
ds_CSend.send(dp_CSend);
}
catch(Exception e){
e.printStackTrace();
}
}
}
///----------------------------------------------------------------
import java.awt.*;
import java.awt.event.*;
import java.net.*;
public class TalkClientFrame extends Frame {
private List lst = new List(6);//存放对话内容
private TextField tf_Data = new TextField(20);//存放发送内容
private TextField tf_ip = new TextField(15);//存放IP和PORT;
private ClientSend cs;
public TalkClientFrame(ClientSend cs) {
this.cs = cs;
tf_ip.setText("127.0.0.1");
Panel p_Data = new Panel();//放置tf_Data,tf_ip的容器
//-----------------------布局-----------------------------------
this.add(lst,"Center");
this.add(p_Data,"South");
p_Data.add(tf_ip,"West");
p_Data.add(tf_Data,"East");
tf_Data.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
//
tf_Dataactionperformed(evt);
}
});
//----------------------------------------------------------------
MenuBar menuBar = new MenuBar();
Menu menuFile = new Menu();
MenuItem menuFileExit = new MenuItem();
menuFile.setLabel("文件(F)");
menuFileExit.setLabel("退出(X)");
// Add action listener.for the menu button
menuFileExit.addActionListener
(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (tf_Data.getText().length()>0)
TalkClientFrame.this.windowClosed();
}
}
);
menuFile.add(menuFileExit);
menuBar.add(menuFile);
setTitle("TalkClient");
setMenuBar(menuBar);
setSize(new Dimension(350, 400));
// Add window listener.
this.addWindowListener
(
new WindowAdapter() {
public void windowClosing(WindowEvent e) {
TalkClientFrame.this.windowClosed();
}
}
);
}
void tf_Dataactionperformed(ActionEvent e){
byte[] buf = tf_Data.getText().getBytes();
String strIp = tf_ip.getText();
try{
cs.Sended(buf,strIp);
}
catch(Exception ex){
ex.printStackTrace();
}
tf_Data.setText("");
}
/**
* Shutdown procedure when run as an application.
*/
protected void windowClosed() {
// TODO: Check if it is safe to close the application
// Exit application.
System.exit(0);
}
}
服务端
public class talkServer {
public static void main(String[] args) {
// TODO: Add your code here
talkRecv tR = new talkRecv();
tR.Recved();
}
}
//------------------------------------------------
import java.net.*;
public class talkRecv {
private DatagramSocket ds_Recv;
private DatagramPacket dp_Recv;
public boolean b_stop=true;
public talkRecv(){
try{
ds_Recv = new DatagramSocket(8888);//将8888端口作为接受端口
byte[] buf = new byte[1024];
dp_Recv = new DatagramPacket(buf,1024);
}
catch(Exception e){
e.printStackTrace();
}
}
public void Recved(){
while(b_stop){
try{
ds_Recv.receive(dp_Recv);
String str_info = new String(dp_Recv.getData(),0,dp_Recv.getLength());
System.out.println(" ip:"+dp_Recv.getAddress().getHostAddress());
System.out.println("port:"+dp_Recv.getPort());
System.out.println("data:"+str_info);
}
catch (Exception e){
e.printStackTrace();
}
}
}
}
//------------------------------------------------
这几个类都没怎么考虑对象的释放问题,这个问题希望那位大大能够关注一下,给小弟一点指点,小弟感激不禁
java有对象回收机制,内存对象的释放不用程序员操心。但是非内存对象的释放:如数据库连接,屏幕的图形等在sun的jvm中还是需要程序员处理的。
我认为,如果对java的基本特性没有一个基本的掌握的话,急着写代码可能会走一些弯路。强烈推荐看看thinking in java。
蝙蝠兄的话确实很有道理,最近我也发现由于基础知识掌握不够,开始写一些代码感觉有点困难,所以我也在尽力掌握各种基础知识点.
但是我个人认为,如果不多做些习作性开发的话,
第一,学习没有成就感,这会让java学习变的为了学习而学习,感觉很枯燥无味
第二,代码编写会很生疏,就算有强大了理论支持,也缺乏实际经验的积累
呵呵,练武的不是有句老话吗"练功不练拳,犹如无舵船","练拳不练功,到老一场空";大概就是描述理论知识和实践经验这二者之间的关系吧
完全同意你的看法,我也是提倡在实战中进行学习。
这也是我们学习日记的宗旨,目标式学习。
上面菜单中的练功场项目也是基于你说的这种思想产生。
再推荐两篇类似思想的文章吧:
世界不会等待我们(转帖)
第二篇文章有点长,后面摘录了一点:
学习理论文章欣赏:信息时代如何学习[转帖]
那么最后简单地讲一下,我们应当树立什么样的学习观念,在信息社会。第一条,学会享受学习,这几个字不一样,我们以前不这么说的呀,“学海无涯苦作舟”,苦作舟怎么是享受学习呢?苦作舟那是工业社会的逻辑,今天我们要换一种心态来学习,学习没有那么悲观,没有那么消极,没有那么可怕,谁不爱享受,谁都爱享受,但我们想起享受这两个字的时候,我们就很轻松了,所以用享受的心态来对待学习。第二学会快速学习,我一开始讲了,1991年毕业以后,我不会学习,为什么?因为我学习得从第一个字看到最后一个字,那么一大摞书,我怎么看,我得看多少年。也就是说那个时候,我只掌握了工业社会的精益求精的学习,而没有掌握面向信息社会快速的、粗糙的、蜻蜓点水的学习,在信息社会,你不掌握这套学习方法,你真的很难,所以我并不想否认那种学习精读,但是精读的同时,我们要学会快读,什么时候用精读,什么时候用快读,要看阅读的对象,有的对象需要我们精读,下工夫,一年读透一本书,有的时候很多书用不着那么读,一年可以读十本书,二十本书,五十本书,一百本书,不一样,要看学习的对象,也要看学习的目的,究竟为什么读,大量的阅读对于我们来说是特别重要的,在信息社会,因为信息太多了。第三条,学习既可以是循序渐进的,也可以是跳跃的,超前的。学校教育现在搞出了一套体系,我们必须循序渐进,这个体系有没有道理呢,这个体系为工业化服务很有道理,就掌握基本知识、基本技能来说很有道理,但是它是不够的,所以我说要两条腿走路。种学习方法并行,循序渐进的方法和非循序渐进的方法,跳跃的、超前的都可以来,什么都可以来。
第四条,过去我们接受了一个理念,学习就是往脑子里不断地加东西,那么我们很乐于接受加法的学习,甚至是乘法的学习。那么我今天想告诉大家,因为在信息社会知识的半衰期很快,更新换代的速度很快,所以不要太留恋已经得到的东西,要清理清理家里的垃圾,不断地清除垃圾,要学会减法的学习,甚至是除法的学习,整个一块你都可以放掉,家里的藏书,隔一段时间就得清理一下,三、五年不看的书,除了那些工具书和很权威的书之外,就得换了。
祝你成为一个成功的学习者。