网络通信

来源:互联网 发布:手机怎么注册淘宝直播 编辑:程序博客网 时间:2024/04/28 19:56

一.TCP程序设计基础

InetAddress类:与IP地址相关的类,利用该类可以获取IP地址、主机信息等信息。

常用方法:getByName(String host)获取与Host相对相应的InetAddress地址;

    getHostAddress(),获取InetAddress对象所含的Ip地址;

    getHostName(),获取次IP地址的主机名;

    getLocalHost(),返回本地主机的InetAddress对象;

<span style="font-family:SimSun;font-size:18px;">import java.net.*;public class Address { // 创建类public static void main(String[] args) {InetAddress ip; // 创建InetAddress对象try { // try语句块捕捉可能出现的异常ip = InetAddress.getLocalHost(); // 实例化对象String localname = ip.getHostName(); // 获取本机名String localip = ip.getHostAddress(); // 获取本IP地址System.out.println("本机名:" + localname);// 将本机名输出System.out.println("本机IP地址:" + localip); // 将本机IP输出} catch (UnknownHostException e) {e.printStackTrace(); // 输出异常信息}}}</span>
SercerSocket类:套接字;

构造方法:SercerSocket()创建非绑定服务器套接字

        SercerSocket(int port)创建绑定到特定端口的服务器套接字

    SercerSocket(inetAddress(int port,int backlog)利用指定的backlog创建服务器套接字并将其绑定到指定的本地端口号

    SercerSocket(int port,int backlog,InetAddress blindAddress)使用指定的端口,侦听backlog和要绑定到的本地IP地址穿件服务器。这种情况使用与计算机上有多块网卡和多个IP地址的情况,用于可以明确规定SercerSocket在哪块网卡或IP地址上等待客户的链接请求。

常用方法:accept();isBound();getinetaddress().isclosed,close,blind(),getinetaddress();

<span style="font-family:SimSun;font-size:18px;">package com.lzw;import java.io.*;import java.net.*;public class MyTcp { // 创建类MyTcpprivate BufferedReader reader; // 创建BufferedReader对象private ServerSocket server; // 创建ServerSocket对象private Socket socket; // 创建Socket对象socketvoid getserver() {try {server = new ServerSocket(8998); // 实例化Socket对象System.out.println("服务器套接字已经创建成功"); // 输出信息while (true) { // 如果套接字是连接状态System.out.println("等待客户机的连接"); // 输出信息socket = server.accept(); // 实例化Socket对象reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); // 实例化BufferedReader对象getClientMessage(); // 调用getClientMessage()方法}} catch (Exception e) {e.printStackTrace(); // 输出异常信息}}private void getClientMessage() {try {while (true) { // 如果套接字是连接状态if (reader.ready()) {// 获得客户端信息System.out.println("客户机:" + reader.readLine());}}} catch (Exception e) {e.printStackTrace(); // 输出异常信息}try {if (reader != null) {reader.close(); // 关闭流}if (socket != null) {socket.close(); // 关闭套接字}} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) { // 主方法MyTcp tcp = new MyTcp(); // 创建本类对象tcp.getserver(); // 调用方法}}</span>
二.UDP程序设计基础

UDP程序发送数据包的步骤:

  1. 使用DatagramSocket()创建一个数据包套接字。
  2. 使用DatagramPacket(byte[] buf,int offset,int length,inetAddress address,int port)创建要发送的数据包
  3. 使用DatagramSocket()类的send()方法发送数据包
UDP接收数据包的步骤:
  1. 使用DatagramSocket(int port)创建数据包套接字,绑定到指定的端口。
  2. 使用DatagramPacket(byte[] buf,int length)创建字节数组来接收数据包。
  3. 使用DatagramPacket类的receive()方法接收UDP包。
<span style="font-family:SimSun;font-size:18px;">import java.awt.*;import java.awt.event.*;import java.net.*;import javax.swing.*;public class Receive extends JFrame implements Runnable, ActionListener {/** *  */private static final long serialVersionUID = 1L;int port; // 定义int型变量InetAddress group = null; // 声明InetAddress对象MulticastSocket socket = null; // 创建多点广播套接字对象JButton ince = new JButton("开始接收"); // 创建按钮对象JButton stop = new JButton("停止接收");JTextArea inceAr = new JTextArea(10, 10); // 显示接收广播的文本域JTextArea inced = new JTextArea(10, 10);Thread thread; // 创建Thread对象boolean b = false; // 创建boolean型变量public Receive() { // 构造方法super("广播数据报"); // 调用父类方法setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);thread = new Thread(this);ince.addActionListener(this); // 绑定按钮ince的单击事件stop.addActionListener(this); // 绑定按钮stop的单击事件inceAr.setForeground(Color.blue); // 指定文本域中文字颜色JPanel north = new JPanel(); // 创建Jpane对象north.add(ince); // 将按钮添加到面板north上north.add(stop);add(north, BorderLayout.NORTH); // 将north放置在窗体的上部JPanel center = new JPanel(); // 创建面板对象centercenter.setLayout(new GridLayout(1, 2)); // 设置面板布局center.add(inceAr); // 将文本域添加到面板上final JScrollPane scrollPane = new JScrollPane();center.add(scrollPane);scrollPane.setViewportView(inced);add(center, BorderLayout.CENTER); // 设置面板布局validate(); // 刷新port = 9898; // 设置端口号try {group = InetAddress.getByName("224.255.10.0"); // 指定接收地址socket = new MulticastSocket(port); // 绑定多点广播套接字socket.joinGroup(group); // 加入广播组} catch (Exception e) {e.printStackTrace(); // 输出异常信息}setBounds(100, 50, 360, 380); // 设置布局setVisible(true); // 将窗体设置为显示状态}public void run() { // run()方法while (true) {byte data[] = new byte[1024]; // 创建byte数组DatagramPacket packet = null; // 创建DatagramPacket对象// 待接收的数据包packet = new DatagramPacket(data, data.length, group, port);try {socket.receive(packet); // 接收数据包String message = new String(packet.getData(), 0, packet.getLength()); // 获取数据包中内容// 将接收内容显示在文本域中inceAr.setText("正在接收的内容:\n" + message);inced.append(message + "\n"); // 每条信息为一行} catch (Exception e) {e.printStackTrace(); // 输出异常信息}if (b == true) { // 当变量等于true时,退出循环break;}}}public void actionPerformed(ActionEvent e) { // 单击事件if (e.getSource() == ince) { // 单击按钮ince触发的事件ince.setBackground(Color.red); // 设置按钮颜色stop.setBackground(Color.yellow);if (!(thread.isAlive())) { // 如线程不处于“新建状态”thread = new Thread(this); // 实例化Thread对象}thread.start(); // 启动线程b = false; // 设置变量值}if (e.getSource() == stop) { // 单击按钮stop触发的事件ince.setBackground(Color.yellow); // 设置按钮颜色stop.setBackground(Color.red);b = true; // 设置变量值s}}public static void main(String[] args) { // 主方法Receive rec = new Receive(); // 创建本类对象rec.setSize(460, 200); // 设置窗体大小}}</span>

<span style="font-family:SimSun;font-size:18px;">import java.net.*;public class Weather extends Thread { // 创建类。该类为多线程执行程序String weather = "节目预报:八点有大型晚会,请收听";int port = 9898; // 定义端口InetAddress iaddress = null; // 创建InetAddress对象MulticastSocket socket = null; // 声明多点广播套接字Weather() { // 构造方法try {// 实例化InetAddress,指定地址iaddress = InetAddress.getByName("224.255.10.0");socket = new MulticastSocket(port); // 实例化多点广播套接字socket.setTimeToLive(1); // 指定发送范围是本地网络socket.joinGroup(iaddress); // 加入广播组} catch (Exception e) {e.printStackTrace(); // 输出异常信息}}public void run() { // run()方法while (true) {DatagramPacket packet = null; // 声明DatagramPacket对象byte data[] = weather.getBytes(); // 声明字节数组// 将数据打包packet = new DatagramPacket(data, data.length, iaddress, port);System.out.println(new String(data)); // 将广播信息输出try {socket.send(packet); // 发送数据sleep(3000); // 线程休眠} catch (Exception e) {e.printStackTrace(); // 输出异常信息}}}public static void main(String[] args) { // 主方法Weather w = new Weather(); // 创建本类对象w.start(); // 启动线程}}</span>




0 0
原创粉丝点击