• 欢迎访问奇跡の海网站,本站不上传任何资源,所有资源均来自于网络,欢迎加入奇跡の海~!奇跡の海-WordPress QQ群
  • 本站下载资源为网络上收集整理而来,并且以计算机技术研究交流为目的,版权归原作者所有,仅供大家参考,学习,不存在任何商业目的与商业用途.
  • 本站系统镜像均来自于官方原版,ed2k可视为P2P下载链接。所有操作系统默认均为试用版,如有正版密钥可以有效激活,本站不提供任何激活和相关服务。

TCP和UDP两种不同的网络通信方式及网络编程示例代码

编程开发 奇跡の海 2年前 (2017-05-30) 298次浏览 已收录 0个评论 扫描二维码

简介

TCP和UDP是两种不同的网络通信方式,TCP为有连接的会话,客户端和服务端需建立一条长连接,在会话期间保持会话活动,相对比较可靠,能够保障通讯数据的正常接收,有较好的校验和冗余机制,UDP为没有连接的会话,客户端和服务段不需要建立连接,客户端只管给服务端发消息,无法保证消息是否接收,是否正确,没有校验和冗余机制,两种通讯方式各有应用场景。

InetAddress类

InetAddress类在网络套接字socket编程中非常重要,inetaddress类获取主机的IP等信息,返回一个数组,调用方法为 getAllByName(String host)方法返回一个InetAddress对象的引用,每个对象包含一个表示相应主机名的单独的IP地址,如果没有IP地址存在那么这个方法将抛出一个UnknownHostException 异常对象。

.getAllByName(String host)方法返回一个InetAddress对象的引用,每个对象包含一个表示相应主机名的单独的IP地址,这个IP地址是通过host参数传递的,对于指定的主机如果没有IP地址存在那么这个方法将抛出一个UnknownHostException 异常对象。

.getByAddress(byte [] addr)方法返回一个InetAddress对象的引用,这个对象包含了一个Ipv4地址或Ipv6地址,Ipv4地址是一个4字节数组,Ipv6地址是一个16字节地址数组,如果返回的数组既不是4字节的也不是16字节的,那么方法将会抛出一个UnknownHostException异常对象。

.getByAddress(String host, byte [] addr)方法返回一个InetAddress对象的引用,这个InetAddress对象包含了一个由host和4字节的addr数组指定的IP地址,或者是host和16字节的addr数组指定的IP地址,如果这个数组既不是4字节的也不是16位字节的,那么该方法将抛出一个UnknownHostException异常对象。

.getByName(String host)方法返回一个InetAddress对象,该对象包含了一个与host参数指定的主机相对应的IP地址,对于指定的主机如果没有IP地址存在,那么方法将抛出一个UnknownHostException异常对象。

.getLocalHost()方法返回一个InetAddress对象,这个对象包含了本地机的IP地址,考虑到本地主机既是客户程序主机又是服务器程序主机,为避免混乱,我们将客户程序主机称为客户主机,将服务器程序主机称为服务器主机。

获取网络中的IP地址样例代码:

try {
    InetAddress ia=InetAddress.getByName("MICROSOF-F92F47");
    InetAddress ia=InetAddress.getByName("192.168.1.2");
    InetAddress ia=InetAddress.getLocalHost();
    System.out.println(ia.getHostName());
    System.out.println(ia.toString());
} catch (UnknownHostException e) {
    e.printStackTrace();
}

ServerSocket类

ServerSocket类用来表示服务器套接字。服务器套接字通过指定的端口来等待连接的套接字,他的主要功能是等待来自网络上的连接“请求”。服务器套接字一次可以与一个套接字连接,如果多台客户机同时提出连接请求,服务器套接字会将请求连接的客户机存入队列中,然后从中取出一个套接字,与服务器新建的套接字连接起来,如果请求连接数大于最大容纳数,则多出的请求被拒绝。队列的默认大小为50。

调用ServerSocket类的accept()方法会返回一个和客户端Socket对象连接的Socket对象。

服务器端的Socket对象使用getOutputStream()方法获得的输出流将指向客户端Socket对象使用getInputStream()方法获得的那个输入流。反之也成立。也就是说:当服务器端向输出流写入信息时,客户端通过相应的输入流就能读取;反之也成立。

创建一个服务器套接字样例代码:

public static void main(String[] args) {
    try {
       ServerSocket s=new ServerSocket(9999);
       System.out.println("成功创建服务器套接字");
       while(true){
           System.out.println("等待客户端的连接...");
           Socket so=s.accept();
           System.out.println("与客户端建立连接");
       }
    } catch (IOException e) {
       e.printStackTrace();
    }
}

Socket类

Socket类是套接字类,使用Socket类时需要制定待连接的服务器的ip和端口号。服务器套接字与客户端套接字连接成功后,则可以获取套接字的输入输出流,进行数据交换。

host用于指定服务器的ip地址,port是连接服务器的端口号。

客户端和服务器端的连接

TCP网络通信->

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
 
public class TCPServer {
 
    public static void main(String[] args) {
        try {
            ServerSocket socket = new ServerSocket(4444);
            while (true) {
                Socket sc =socket.accept();
                InputStream instr = sc.getInputStream();
                DataInputStream dataInputStream = new DataInputStream(instr);
                System.out.println(dataInputStream.readUTF());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
}
 
 
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
 
public class TCPClient {
 
    public static void main(String[] args) {
        try {
            Socket socket = new Socket("127.0.0.1",4444);
            OutputStream oStream = socket.getOutputStream();
            DataOutputStream dataOutputStream = new DataOutputStream(oStream);
            dataOutputStream.writeUTF("Hello");
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

UDP网络通信->

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
 
public class UDPServer {
 
    public static void main(String[] args) {
        try {
            byte [] buffer = new byte[1024];
            DatagramSocket socket = new DatagramSocket(4444);
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
            while(true){
                socket.receive(packet);
                System.out.println(new String(buffer,0,packet.getLength()));
            }
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
 
 
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
 
public class UDPClient {
 
    public static void main(String[] args) {
        byte [] buffer = null;
        buffer = new String("hello").getBytes();
        DatagramPacket packet=null;
        try {
            packet = new DatagramPacket(buffer, buffer.length,new InetSocketAddress("127.0.0.1", 4444));
            DatagramSocket socket = new DatagramSocket(1234);
            socket.send(packet);
            socket.close();
        } catch (SocketException e1) {
            e1.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
    }
}

版权声明:本站所有文章和资源使用CC BY-NC-SA 4.0协议授权发布 , 转载应当以相同方式注明文章来自“SeaOMC.COM->TCP和UDP两种不同的网络通信方式及网络编程示例代码!在下边可以分享本文哦!
喜欢 (0)
[]
分享 (0)
奇跡の海
关于作者:
一个WordPress菜鸟!
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址