java中的网络编程实例
一、TCP的全称?UDP的全称?
TCP(Transfer Control Protocol)
TCP:一种面向连接(连接导向)的、可靠的、基于字节流的传输层(Transport layer)通信协议。特点:面向连接;点到点的通信;高可靠性;占用系统资源多、效率低。
UDP(User Datagram Protocol)
特点:非面向连接;传输不可靠,可能丢失;发送不管对方是否准备好,接收方收到也不确认;可以广播发送;非常简单的协议,开销小
二、如何理解Socket的含义
所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
我们开发的网络应用程序位于应用层,TCP和UDP属于传输层协议,在应用层如何使用传输层的服务呢?在应用层和传输层之间,则是使用套接字来进行分离。
套接字就像是传输层为应用层开的一个小口,应用程序通过这个小口向远程发送数据,或者接收远程发来的数据;而这个小口以内,也就是数据进入这个口之后,或者数据从这个口出来之前,是不知道也不需要知道的,也不会关心它如何传输,这属于网络其它层次的工作。Socket就是应用层与传输层之间的桥梁。使用Socket编程可以开发客户机和服务器应用程序,可以在本地网络上进行通信,也可通过Internet在全球范围内通信。
生活案例:如果你想写封邮件发给远方的朋友,如何写信、将信打包,属于应用层。信怎么写,怎么打包完全由我们做主;而当我们将信投入邮筒时,邮筒的那个口就是套接字,在进入套接字之后,就是传输层、网络层等(邮局、公路交管或者航线等)其它层次的工作了。我们从来不会去关心信是如何从西安发往北京的,我们只知道写好了投入邮筒就OK了。
三、基于TCP的Socket网络编程的主要步骤是什么?
Java分别为TCP和UDP两种通信协议提供了相应的Socket编程类,这些类存放在java.net包中。与TCP对应的是服务器的ServerSocket和客户端的Socket,与UDP对应的是DatagramSocket。
基于TCP协议的Socket编程的主要步骤:
服务器端(server):
1.构建一个ServerSocket实例,指定本地的端口。这个socket就是用来监听指定端口的连接请求的。
2.重复如下几个步骤:
a.调用socket的accept()方法来获得下面客户端的连接请求。通过accept()方法返回的socket实例,建立一个和客户端的新连接。
b.通过这个返回的socket实例获取InputStream和OutputStream,可以通过这两个stream来分别读和写数据。
c.结束的时候调用socket实例的close()方法关闭socket连接。
客户端(client):
1.构建Socket实例,通过指定的远程服务器地址和端口来建立连接。
2.通过Socket实例包含的InputStream和OutputStream来进行数据的读写。
3.操作结束后调用socket实例的close方法,关闭。
代码实例:
服务端:
public class TCPServer {
public static void main(String[] args) throws IOException {
// 1.创建服务,指定服务端口
ServerSocket serverSocket = new ServerSocket(8081);
// 2.接受客户端的连接
Socket socket = serverSocket.accept();
System.out.println("服务端接受连接!");
// 3.发送数据
DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
dos.writeUTF("你好!我是服务端!");
dos.flush();
}
}
客户端:
public class TCPClient1 {
public static void main(String[] args) throws IOException {
// 1.创建服务,指定服务端口
Socket client = new Socket("localhost",8081);
// 2.接收服务端数据
DataInputStream dis = new DataInputStream(new BufferedInputStream(client.getInputStream()));
String s = dis.readUTF();
System.out.println(s);
}
}
基于UDP的Socket网络编程的主要步骤是什么?
基于UDP协议的Socket编程的主要步骤
服务器端(server):
构造DatagramSocket实例,指定本地端口。
通过DatagramSocket实例的receive方法接收DatagramPacket.DatagramPacket中间就包含了通信的内容。
通过DatagramSocket的send和receive方法来收和发DatagramPacket.
客户端(client):
构造DatagramSocket实例。
2.通过DatagramSocket实例的send和receive方法发送DatagramPacket报文。
3.结束后,调用DatagramSocket的close方法关闭。
代码实例:
服务端:
public class UDPServer {
public static void main(String[] args) throws IOException {
// 1.创建服务,指定服务端口
DatagramSocket datagramSocket = new DatagramSocket(8086);
// 2.准备容器
byte[] container = new byte[1024];
// 3.打包容器
DatagramPacket packet = new DatagramPacket(container, container.length);
// 4.接收数据
datagramSocket.receive(packet);
// 5.从包里取出数据
byte[] data = packet.getData();
// 6.转换
String str = convert(data);
System.out.println(str);
}
public static String convert(byte[] data) throws IOException {
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data);
DataInputStream dis = new DataInputStream(byteArrayInputStream);
String s = dis.readUTF();
return s;
}
}
客户端:
public class UDPClient {
public static void main(String[] args) throws IOException {
// 1.创建服务,指定服务端口
DatagramSocket client = new DatagramSocket(8088);
// 2.准备数据
String str = "哈哈哈!";
byte[] data = convert(str);
// 3.数据打包
DatagramPacket packet = new DatagramPacket(data, data.length, new InetSocketAddress("localhost", 8086));
// 4.发送数据
client.send(packet);
// 5.释放资源
client.close();
}
public static byte[] convert(String str) throws IOException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(bos);
dos.writeUTF(str);
dos.flush();
byte[] data = bos.toByteArray();
dos.close();
return data;
}
}