Java系列讲座二:Socket网络通信实现聊天软件项目讲解(UDP)

上一篇我们讲了通过TCP方式实现网络通信软件开发的原理,思路及实现,今天跟大家谈谈Socket通信中UDP方式通信的软件开发步骤及主要代码讲解,UDP实现方式实现的通信软件特点是不分客户端与服务器端,一个程序既是客户端与是服务器端,典型软件是一些局域网的聊天软件,如飞鸽等软件。

UDP方式通信主要用到了java.net包中的3个类分别是DatagramPacket类,DatagramSocket类与InetAddress类,下面通过实现一个简易聊天软件小项目来讲解他们的使用方法,代码如下:

package T16;

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.FlowLayout;

import java.awt.GridLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.io.IOException;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

import java.net.SocketException;

import java.net.UnknownHostException;

import java.util.Date;

import javax.swing.BorderFactory;

import javax.swing.JButton;

import javax.swing.JEditorPane;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

import javax.swing.JTextField;

/**

* UDP通信的聊天软件

*

* */

public class UDPChat extends JFrame implements ActionListener{

private JLabel lblPort,lblAddr,lblPort2;

private JTextField txtPort,txtAddr,txtPort2;

private JButton btnConn,btnSend,btnClose;

private JEditorPane txtReceive,txtSend;

public UDPChat(int n){

}

private UDPChat(int n,int m){

}

public UDPChat() {

super("UDP通信的聊天软件");

lblPort = new JLabel("本机端口:",JLabel.RIGHT);

lblPort2 = new JLabel("对方端口:",JLabel.RIGHT);

lblAddr = new JLabel("对方地址:",JLabel.RIGHT);

txtPort = new JTextField("8888",5);

txtPort2 = new JTextField("9999",5);

InetAddress ipaddr =null;

try {

ipaddr = InetAddress.getLocalHost();

} catch (UnknownHostException e) {

e.printStackTrace();

}

txtAddr = new JTextField(ipaddr.getHostAddress(),10);

btnConn = new JButton("连接(C))");

btnConn.setMnemonic(‘C‘);

JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));

topPanel.add(lblPort);

topPanel.add(txtPort);

topPanel.add(lblAddr);

topPanel.add(txtAddr);

topPanel.add(lblPort2);

topPanel.add(txtPort2);

topPanel.add(btnConn);

txtReceive = new JEditorPane();

txtSend = new JEditorPane();

JPanel centerPanel = new JPanel(new GridLayout(2,1,5,10));

centerPanel.add(txtReceive);

txtReceive.setBorder(BorderFactory.createLoweredBevelBorder());

//接收框不能编辑

txtReceive.setEditable(false);

txtSend.setBorder(BorderFactory.createLoweredBevelBorder());

centerPanel.add(txtSend);

btnSend = new JButton("发送(S)");

btnSend.setMnemonic(‘S‘);

btnClose = new JButton("退出(X)");

btnClose.setMnemonic(‘X‘);

JPanel bottomPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));

bottomPanel.add(btnSend);

bottomPanel.add(btnClose);

add(topPanel,BorderLayout.NORTH);

//centerPanel.setBackground(Color.RED);

add(centerPanel,BorderLayout.CENTER);

add(bottomPanel,BorderLayout.SOUTH);

btnConn.addActionListener(this);

btnSend.addActionListener(this);

btnClose.addActionListener(this);

//发送按钮禁用

btnSend.setEnabled(false);

setSize(600, 400);

setVisible(true);

setLocationRelativeTo(null);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

//创建内部类,实现接收线程

class ReceiveThread extends Thread{

DatagramSocket socket;

public ReceiveThread() {

try{

int port = Integer.parseInt(txtPort.getText().trim());

socket = new DatagramSocket(port);

}catch(Exception e){

e.printStackTrace();

}

}

@Override

public void run() {

byte[] b = new byte[1024];

DatagramPacket packet = new DatagramPacket(b,b.length);

while(true){

try {

//接收数据

socket.receive(packet);

//转换为字符串

String str = new String(b,0,packet.getLength());

//显示在接收框

String content = txtReceive.getText();

content += new Date().toLocaleString()+"\n";

content += str+"\n";

txtReceive.setText(content);

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

public static void main(String[] args) {

//UDPChat chat = new UDPChat();

try {

Class.forName("T16.UDPChat").newInstance();

} catch (InstantiationException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

@Override

public void actionPerformed(ActionEvent e) {

if(e.getSource()==btnConn){

btnConn.setEnabled(false);

btnSend.setEnabled(true);

//启动线程

new ReceiveThread().start();

}else if(e.getSource()==btnSend){

//发送内容

String str = txtSend.getText().trim();

if(str.equals("")){

JOptionPane.showMessageDialog(this, "请输入要发送的内容");

return;

}

//把要发送的内容显示到接收框

String content = txtReceive.getText();

content += new Date().toLocaleString()+"\n";

content += str+"\n";

txtReceive.setText(content);

try {

//设置对方IP地址

InetAddress ip = InetAddress.getByName(txtAddr.getText().trim());

//设置对方的端口

int port = Integer.parseInt(txtPort2.getText().trim());

//创建发送包

byte b[] = str.getBytes();

DatagramPacket p = new DatagramPacket(b,b.length,ip,port);

//创建DatagramSocket发送

DatagramSocket socket = new DatagramSocket();

//发送

socket.send(p);

//清空发送框的内容

txtSend.setText("");

} catch (UnknownHostException e1) {

e1.printStackTrace();

} catch (SocketException e2) {

e2.printStackTrace();

} catch (IOException e3) {

e3.printStackTrace();

}

}else if(e.getSource()==btnClose){

System.exit(0);

}

}

}

该程序必须同启动2个实例才能实现在局域网聊天,互相设置对方的端口与IP地址即可。

本人从事软件项目开发20年,10年的Java工程师系列课程的教学工作,录制30多门精品视频课程,每门课程都包含有项目实战,上课PPT,及完整的源代码下载,有兴趣的朋友可以看看我的在线课堂,

关于网络即时通讯,多线程等技术的详细介绍内容很多,如果大家有兴趣可以看看我的java从入门到精通+QQ即时通讯软件项目实训的教学视频,链接地址:http://edu.51cto.com/course/6946.html

时间: 2024-10-10 20:47:11

Java系列讲座二:Socket网络通信实现聊天软件项目讲解(UDP)的相关文章

跟老杨学java系列(二) PNP训练法介绍

跟老杨学java系列(二) PNP训练法介绍 声明:以下内容可能会有做广告的嫌疑,哈哈~~.大家不想看的忽略就好..欢迎大家留言探讨技术问题.其他问题概不回复. (书接上回)PNP训练法是国内java培训机构-乐橙谷推出的一种针对java培训的学习训练方法.该训练法摒弃了传统的以章节知识点为线索的教学方式,改为以完整的项目开发过程为线索.以对功能点的分析设计驱动出的知识点为授课内容.以迭代为教学手段,学习难度由浅入深,让学生在充分了解软件开发过程的基础上,熟练掌握项目开发经验.深入掌握相关开发技

聊天软件项目TCP升级版

1 //聊天软件项目TCP升级版 2 import java.io.*; 3 import java.net.*; 4 class TcpClient2 5 { 6 public static void main(String[] args)throws Exception 7 { 8 Socket s = new Socket("192.168.1.254",10004); 9 OutputStream out = s.getOutputStream(); 10 out.write(

.net辗转java系列(二)IDE

上一篇文章.net辗转java系列(一)视野 废话: "视野"这篇文章,管理员说它比较空洞!也许初学者看不懂表格中的大部分内容!多年的neter估计也有很多不知道的! "辗转"并不代表"转",它是指反复不定,翻来覆去的样子.所以在此过程,并不是说要弃net而去,也不一定能够完全进入java.懂多一门技术多一条出路. 小公司一直在模仿大厂, 华为 DevOps 转型之旅 微软 DevOps 转型之旅 从未得要领,却要求有狼性效应!DevOps,在各

Java系列讲座一:TCP方式Socket通信案例讲解

开发网络通信软件,如QQ,阿里旺旺等即时通讯软件时,Socket通信是必备的基础知识,今天跟大家谈谈Socket通信中TCP方式通信的软件开发步骤及主要代码讲解: 第一步:开发服务器端程序Server.java,源代码如下: package T16; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; imp

WPF使用socket实现简单聊天软件

公司网络限制不能传文件,先贴部分代码 项目结构: 1.解决方案 1.1. Client 1.2. Server Client: <Window x:Class="CSharpSocketExample.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006

Cordova入门系列(二)分析第一个helloworld项目

版权声明:本文为博主原创文章,未经博主允许不得转载 上一章我们介绍了如何创建一个cordova android项目,这章我们介绍一下创建的那个helloworld项目的代码,分析其运行. MainActivity.java 我们已经将MainActivity导入到了eclipse中.打开scr下com.example.hello下的MainActivity.java. //MainActivity继承了CordovaActivity public class MainActivity exten

Python--网络编程-----socket代码实例--聊天软件升级版

服务端代码: 1 import socket 2 3 HOST = '' 4 PORT = 50007 5 6 sock_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 7 sock_server.bind((HOST, PORT)) 8 9 sock_server.listen(1) 10 11 while True: 12 conn, addr = sock_server.accept() 13 14 with conn:

聊天软件项目UDP升级版

1 import java.net.*; 2 import java.io.*; 3 class UdpSend2 4 { 5 public static void main(String[] args) throws Exception 6 { 7 DatagramSocket ds = new DatagramSocket(); 8 BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in)); 9 St

Python开发双工聊天软件

需求: 1.用Socket开发双工聊天软件,服务端与客户端交互 2.聊天记录要记录到MySQL数据库 3.客户端可以查看聊天记录 4.用三层架构开发 程序架构 各文件作用解析 - model              model层 - dialogue.py        dialoue表 - users.py          users表 - utility             公共层 - sql_helper.py       公共配置文件 - client.py         客户