TCP和UDP网络通信 网络编程以及示例代码

相关通信技术 06/14 阅读 1117 views次 人气 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();
        }

    }
}

评论

该文章不支持评论!

分享到: