java中UDP简单聊天程序
2013-12-29 21:48
429 查看
学过计算机网络通信的都知道,计算机之间传送数据由两种,即TCP通信和UDP通信。TCP是可靠的面向连接的通信协议,二UDP是不可靠的面向无连接的通信协议。
java中有基于TCP的网络套接字通信,也有基于UDP的用户数据报通信,UDP的信息传输速度快,但不可靠!
基于UDP通信的基本模式:
(1)将数据打包,称为数据包(好比将信件装入信封一样),然后将数据包发往目的地。
(2)接受别人发来的数据包(好比接收信封一样),然后查看数据包中的内容。
客户机
服务器:
运行截图:
java中有基于TCP的网络套接字通信,也有基于UDP的用户数据报通信,UDP的信息传输速度快,但不可靠!
基于UDP通信的基本模式:
(1)将数据打包,称为数据包(好比将信件装入信封一样),然后将数据包发往目的地。
(2)接受别人发来的数据包(好比接收信封一样),然后查看数据包中的内容。
客户机
package com.client.view; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.ObjectOutputStream; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextArea; import javax.swing.JTextField; import com.tools.ClientToServerThread; /** * @author lenovo * */ public class JChatFrm extends JFrame implements ActionListener{ JTextArea jta; JTextField jtf; JButton jb; JPanel jp; String ownerId; String friendId; ClientToServerThread ctsT; public static void main(String[] args) { // TODO Auto-generated method stub new JChatFrm(); } public JChatFrm() { setTitle("客户端"); jta=new JTextArea(); jtf=new JTextField(15); jb=new JButton("发送"); jb.addActionListener(this); jp=new JPanel(); jp.add(jtf); jp.add(jb); this.add(jta,"Center"); this.add(jp,"South"); // this.setTitle(ownerId+" 正在和 "+friend+" 聊天"); this.setIconImage((new ImageIcon("image/qq.gif").getImage())); // this.setSize(300, 200); this.setBounds(300, 200, 300, 200); this.setVisible(true); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); ctsT = new ClientToServerThread(jta); ctsT.start(); /**窗体关闭按钮事件*/ this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { if(JOptionPane.showConfirmDialog(null, "<html><font size=3>确定退出吗?</html>","系统提示",JOptionPane.OK_CANCEL_OPTION,JOptionPane.INFORMATION_MESSAGE)==0) { System.exit(0); ctsT.closeSocket(); } else { return; } } } ); } //写一个方法,让它显示消息 public void showMessage(String message) { String info= message; this.jta.append(info); } public void actionPerformed(ActionEvent arg0) { // TODO Auto-generated method stub if(arg0.getSource()==jb) { byte buffer[] = jtf.getText().trim().getBytes(); ctsT.sendData(buffer); } } }
package com.tools; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.Socket; import java.util.Properties; import javax.swing.JTextArea; import com.common.User; /** * @author lenovo * */ public class ClientToServerThread extends Thread{ private String serverIP = "127.0.0.1"; private int serverPORT = 8888; private int receivePORT = 6666; //声明发送信息的数据报套结字 private DatagramSocket sendSocket = null; //声明发送信息的数据包 private DatagramPacket sendPacket = null; //声明接受信息的数据报套结字 private DatagramSocket receiveSocket = null; //声明接受信息的数据报 private DatagramPacket receivePacket = null; //收发数据的端口 private int myPort = 0; //接收数据主机的IP地址 private String friendIP = null; private int friendPort = 0; //缓冲数组的大小 public static final int BUFFER_SIZE = 5120; private byte inBuf[] = null; //接收数据的缓冲数组 private byte outBuf[] = null; //发送数据的缓冲数组 JTextArea jta; // 构造函数 public ClientToServerThread(JTextArea jta) { this.jta = jta; getPropertiesInfo(); } public void run() { String receiveInfo = ""; try{ inBuf = new byte[BUFFER_SIZE]; receivePacket = new DatagramPacket(inBuf,inBuf.length); receiveSocket = new DatagramSocket(receivePORT); }catch (Exception e) { e.printStackTrace(); // TODO: handle exception } while (true) { if(receiveSocket == null){ break; } else { try { receiveSocket.receive(receivePacket); String message = new String(receivePacket.getData(),0,receivePacket.getLength()); jta.append("收到数据"+message+"\n"); } catch (Exception e) { e.printStackTrace(); // TODO: handle exception } } } } /** * 该方法用来获得服务器属性文件中的IP、PORT */ private void getPropertiesInfo(){ Properties prop = new Properties(); InputStream inStream = Thread.currentThread().getContextClassLoader() .getResourceAsStream("ServerInfo.properties"); try{ //获得相应的键值对 prop.load(inStream); }catch(IOException e){ e.printStackTrace(); } //根据相应的键获得对应的值 serverIP = prop.getProperty("serverip"); serverPORT = Integer.parseInt(prop.getProperty("serverudp.port")); receivePORT = Integer.parseInt(prop.getProperty("receiveudp.port")); } public void sendData(byte buffer[]){ try{ InetAddress address = InetAddress.getByName(serverIP); // outBuf = new byte[BUFFER_SIZE]; sendPacket = new DatagramPacket(buffer,buffer.length,address,serverPORT); sendSocket = new DatagramSocket(); sendSocket.send(sendPacket); }catch (Exception e) { e.printStackTrace(); // TODO: handle exception } } public void closeSocket(){ receiveSocket.close(); } }
服务器:
package com.server.view; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.ObjectOutputStream; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextArea; import javax.swing.JTextField; import com.tools.ClientToServerThread; /** * @author lenovo * */ public class JChatFrm extends JFrame implements ActionListener{ JTextArea jta; JTextField jtf; JButton jb; JPanel jp; String ownerId; String friendId; ClientToServerThread ctsT; public static void main(String[] args) { // TODO Auto-generated method stub new JChatFrm(); } public JChatFrm() { setTitle("服务器"); jta=new JTextArea(); jtf=new JTextField(15); jb=new JButton("发送"); jb.addActionListener(this); jp=new JPanel(); jp.add(jtf); jp.add(jb); this.add(jta,"Center"); this.add(jp,"South"); // this.setTitle(ownerId+" 正在和 "+friend+" 聊天"); this.setIconImage((new ImageIcon("image/qq.gif").getImage())); // this.setSize(300, 200); this.setBounds(300, 200, 300, 200); this.setVisible(true); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); ctsT = new ClientToServerThread(jta); ctsT.start(); /**窗体关闭按钮事件*/ this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { if(JOptionPane.showConfirmDialog(null, "<html><font size=3>确定退出吗?</html>","系统提示",JOptionPane.OK_CANCEL_OPTION,JOptionPane.INFORMATION_MESSAGE)==0) { System.exit(0); ctsT.closeSocket(); } else { return; } } } ); } //写一个方法,让它显示消息 public void showMessage(String message) { String info= message; this.jta.append(info); } public void actionPerformed(ActionEvent arg0) { // TODO Auto-generated method stub if(arg0.getSource()==jb) { byte buffer[] = jtf.getText().trim().getBytes(); ctsT.sendData(buffer); } } }
package com.tools; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.Socket; import java.util.Properties; import javax.swing.JTextArea; import com.common.User; /** * @author lenovo * */ public class ClientToServerThread extends Thread{ private String sendIP = "127.0.0.1"; private int sendPORT = 6666; private int receivePORT = 8888; //声明发送信息的数据报套结字 private DatagramSocket sendSocket = null; //声明发送信息的数据包 private DatagramPacket sendPacket = null; //声明接受信息的数据报套结字 private DatagramSocket receiveSocket = null; //声明接受信息的数据报 private DatagramPacket receivePacket = null; //收发数据的端口 private int myPort = 0; //接收数据主机的IP地址 private String friendIP = null; private int friendPort = 0; //缓冲数组的大小 public static final int BUFFER_SIZE = 5120; private byte inBuf[] = null; //接收数据的缓冲数组 private byte outBuf[] = null; //发送数据的缓冲数组 JTextArea jta; // 构造函数 public ClientToServerThread(JTextArea jta) { this.jta = jta; getPropertiesInfo(); } public void run() { String receiveInfo = ""; try{ inBuf = new byte[BUFFER_SIZE]; receivePacket = new DatagramPacket(inBuf,inBuf.length); receiveSocket = new DatagramSocket(receivePORT); }catch (Exception e) { e.printStackTrace(); // TODO: handle exception } while (true) { if(receiveSocket == null){ break; } else { try { receiveSocket.receive(receivePacket); String message = new String(receivePacket.getData(),0,receivePacket.getLength()); jta.append("收到数据"+message+"\n"); } catch (Exception e) { e.printStackTrace(); // TODO: handle exception } } } } /** * 该方法用来获得服务器属性文件中的IP、PORT */ private void getPropertiesInfo(){ Properties prop = new Properties(); InputStream inStream = Thread.currentThread().getContextClassLoader() .getResourceAsStream("ServerInfo.properties"); try{ //获得相应的键值对 prop.load(inStream); }catch(IOException e){ e.printStackTrace(); } //根据相应的键获得对应的值 receivePORT = Integer.parseInt(prop.getProperty("serverudp.port")); } public void sendData(byte buffer[]){ try{ InetAddress address = InetAddress.getByName(sendIP); // outBuf = new byte[BUFFER_SIZE]; sendPacket = new DatagramPacket(buffer,buffer.length,address,sendPORT); sendSocket = new DatagramSocket(); sendSocket.send(sendPacket); }catch (Exception e) { e.printStackTrace(); // TODO: handle exception } } public void closeSocket(){ receiveSocket.close(); } }
运行截图:
相关文章推荐
- 【Java网络编程】UDP协议实例——简单的在线聊天程序
- java中UDP简单聊天程序实例代码
- JAVA系列课程讲座二:使用Socket通信实现简单聊天通信程序(UDP方式)
- JAVA学习第六十课 — UDP协议 &基于多线程模拟简单的QQ聊天程序
- 黑马程序员-JAVA学习之用多线程实现简单UDP聊天程序
- 用java编写简单UDP网络通信程序
- Java网络编程 - 基于UDP协议 实现简单的聊天室程序
- JAVA网络编程——简单的聊天程序
- java 网络编程之UDP通信和简单的群聊程序
- Java网络编程--简单聊天程序
- Java基础-UDP 键盘录入数据 、聊天程序
- 黑马程序员_Java基础_网络编程_UDP传输协议编程,控制台聊天程序
- java实现简单TCP聊天程序
- 【Java】UDP聊天程序
- 基于UDP协议的Java聊天小程序!
- [Java] Socket/ServerSocket 控制台简单聊天程序
- java用socket和serversocket实现一对一聊天(java实现简单的TCP聊天程序)
- UDP 发送端和接收端 聊天程序简单例子
- 【java学习记录】12.用Socket网络访问方法,实现简单的网络聊天程序
- 使用UDP协议的JAVA网络聊天程序