注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

TERONY的博客

Still Achieving.

 
 
 

日志

 
 

sleepless in java & udp chat  

2011-06-24 11:32:20|  分类: Profession |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

这是 UDP 和 Swing 结合的一款聊天软件。当然,它只是一个简单的 Demo,你可以改进它,但是否重新发布依据你的自愿。并没有采用 TCP 的原因很简单,一来(单位)局域网中基本可以忽略信息的丢失,二来 UDP 协议实现起来更简单,效率更高些。

复制下面的代码直接放在一个文本文件里面,再……好吧,剩下的事情你肯定会做了。

import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import java.net.*;
import javax.swing.*;

/**
 * UDP Chat
 * @author TERONY YU
 * @version 1.1 <2011.06.24>
 * @since 1.0 <2011.06.23>
 */

public class MyJFrame {
 public static void main(String[] args) {
  NewFrame nf = new NewFrame();
  //启动监听线程
  new Thread(new ListenThread(nf.getReceiveText())).start();
 }
}

class NewFrame {
 private JTextField edtHost;
 private JTextField edtInput;
 private JTextArea receiveText;
 
 public NewFrame() {
  JFrame frame = new JFrame("My JFrame Application");
  //设置窗口大小及位置<居中显示>
  Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
  int fw = screenSize.width / 10 * 7;
  int fh = screenSize.height / 10 * 7;
  int fx = (screenSize.width - fw) / 2;
  int fy = (screenSize.height - fh) / 2;
  frame.setBounds(fx, fy, fw, fh);
  //不使用窗口布局管理器
  frame.setLayout(null);
  //是否允许调整窗口大小
  frame.setResizable(false);
  //窗口关闭则退出程序
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  /*组件添加*/
  //标签
  JLabel lblHost = new JLabel("Host:");
  lblHost.setBounds(10, 10, 40, 25);
  JLabel lblMemo = new JLabel("Msg:");
  lblMemo.setBounds(10, 40, 40, 25);
  JLabel lblMsg = new JLabel("Input:");
  lblMsg.setBounds(10, fh-90, 40, 25);
  frame.add(lblHost);
  frame.add(lblMemo);
  frame.add(lblMsg);
  //文本框
  edtHost = new JTextField();
  edtHost.setBounds(60, 10, 120, 25);
  edtInput = new JTextField();
  edtInput.setBounds(60, fh-90, fw-90, 25);
  frame.add(edtHost);
  frame.add(edtInput);
  //多行文本框
  receiveText = new JTextArea();
  receiveText.setLineWrap(true);
  JScrollPane receivePane = new JScrollPane(receiveText);
  receivePane.setBounds(60, 40, fw-90, fh-137);
  frame.add(receivePane);
  //添加按钮
  JButton btnSend = new JButton("Send");
  btnSend.setBounds(60, fh-62, 75, 25);
  //使用内部匿名类给按钮注册一个动作事件监听器
  btnSend.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
    String content = edtInput.getText();
    byte[] b = content.getBytes();
    try {
     DatagramPacket p = new DatagramPacket(b, b.length, InetAddress.getByName(edtHost.getText()), 6789);//信息发往 6789 端口
     DatagramSocket socket = new DatagramSocket(1234); //信息由 1234 端口发送
     socket.send(p);
     //释放 socket 占用的资源.<一定要释放,不然再发信息出错>
     if (socket != null) {
      socket.close();
     }
    } catch (UnknownHostException ex) {
     ex.printStackTrace();
    } catch (SocketException ex) {
     ex.printStackTrace();
    } catch (IOException ex) {
     ex.printStackTrace();
    }
   }
  });
  frame.add(btnSend);
  /*组件添加结束*/
  //窗口是否可见
  frame.setVisible(true);
 }
 public JTextArea getReceiveText() {
  return this.receiveText;
 }
}

class ListenThread implements Runnable {
 private JTextArea receiveText;
 
 public ListenThread(JTextArea receiveText) {
  this.receiveText = receiveText;
 }
 public void run() {
  byte[] buf = new byte[65600];
  DatagramPacket p = new DatagramPacket(buf, buf.length);
  try {
   DatagramSocket socket = new DatagramSocket(6789); //监听端口 6789
   while (true) {
    socket.receive(p);
    String content = "收到来自:" + p.getAddress().getHostAddress() + "的消息:";
    content = content + "\n" + new String(p.getData(), p.getOffset(), p.getLength()) + "\n";
    this.receiveText.append(content);
   }
  } catch (SocketException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
}

 

  评论这张
 
阅读(48)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017