网络编程
1.概念:两台设备之间通过网络数据传输。
2.网络通信:将数据通过网络从一台设备传输另外一台设备。
3.java.net包下提供了一系列的类和接口,提供程序员使用,完成网络通信。
TCP和UDP
TCP协议:
1.使用TCP协议前,需建立TCP连接,形成传输数据通道。
2.传输前,采用“三次握手”方式,是可靠的。
3.TCP协议进行通信的两个应用进程:客户端、服务端。
4.在连接中可进行大数据量的传输。
UDP协议:
1.将数据、源、目的封装成数据包,不需要建立连接
2.每个数据报的大小限制在64Kb内
3.因无需连接,故是不可靠的
4.发送数据结束时无需释放资源,速度快。
5.举例:发短信
介绍java.net中的工具类
Socket介绍
1.套接字(Socket)开发网络应用程序被广泛,以至于成为事实上的标准。
2.通信额两端都要有Socket,是两台机器通信的端点。
3.网络通信其实是Socket间的通信。
4.Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输。
5.一般主动发起通信的应用程序属于客户端,等待通信请求的为服务端。
当我们需要通讯时(读写数据),客户端和服务端分别使用以下两个方法。
1.socket.getOutputSream()
2.socket.getInputStream()
Socket有TCP编程和UDP编程。
TCP网络通信编程的案例
要求:
1.编写一个服务器端和客户端。
2.服务器端在9999端口监听。
3.客户端连接到服务器,发送“Hello server”,然后退出。
4.服务器端接受到客户端发送的信息,输出,并退出。
思路
代码实现,客户端如下:
import java.io.IOException;
import java.io.OutputStream;
import java.net.*;
public class SocketClientTCP01 {
public static void main(String[] args) {
try {
// 思路
// 1.连接服务端
// 解读:连接本机的9999,如果连接成功,返回socket对象
Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
System.out.print("服务 socket = " + socket.getClass());
// 2. 连接上后,生成Socket,通过socket.getOutputStream()
// 得到 和 socket对象关联的输出流对象
OutputStream outputStream = socket.getOutputStream();
// 3.通过输出流,写入数据到据通道
outputStream.write("hello , server ".getBytes());
// 4. 关闭流
outputStream.close();
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
服务端如下:
import java.io.IOException;
import java.io.InputStream;
import java.net.*;
public class SocketServerTCP01 {
public static void main(String[] args) {
try {
// 1.在本机的9999端口监听,等待连接
//细节:一台主机只能有重复的端口存在
//细节:ServerSocket可以通过accept()返回多个Socket[多个客户端]
ServerSocket serverSocket = new ServerSocket(9999);
System.out.print("我在9999端口等待监听,等待连接");
// 2.当没有客户端连接9999端口时,程序会阻塞,等待连接
//如果有客户端连接,则会返回Socket对象,程序继续
Socket socket = serverSocket.accept();
System.out.print("服务端 socket = " + socket.getClass());
// 3.通过socket.getInputStream(),读取客户端写入到数据通道的数据,显示
InputStream input = socket.getInputStream();
// 4.读取IO相关
byte [] buf = new byte[1024];
int readLen = 0 ;
while((readLen = input.read(buf)) != -1) {
//根据读取到的实际长度,显示内容
System.out.print(new String(buf , 0 , readLen));
}
input.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
案例,服务端与客户端相互发送
其中服务端 代码如下:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketTCP02Server {
public static void main(String[] args) {
try {
// 1.在本机的9999端口监听,等待连接
//细节:一台主机只能有重复的端口存在
//细节:ServerSocket可以通过accept()返回多个Socket[多个客户端]
ServerSocket serverSocket = new ServerSocket(9999);
System.out.print("我在9999端口等待监听,等待连接 \n");
// 2.当没有客户端连接9999端口时,程序会阻塞,等待连接
//如果有客户端连接,则会返回Socket对象,程序继续
Socket socket = serverSocket.accept();
System.out.print("服务端 socket = " + socket.getClass() + "\n");
// 3.通过socket.getInputStream(),读取客户端写入到数据通道的数据,显示
InputStream input = socket.getInputStream();
// 4.读取IO相关
byte [] buf = new byte[1024];
int readLen = 0 ;
while((readLen = input.read(buf)) != -1) {
//根据读取到的实际长度,显示内容
System.out.print(new String(buf , 0 , readLen));
}
// 获取socket相关的输出流
OutputStream outputStream = socket.getOutputStream();
outputStream.write("hello , client ".getBytes());
socket.shutdownOutput();
//关闭资源
input.close();
socket.close();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端程序为:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class SocketTCP02Client {
public static void main(String[] args) {
try {
// 思路
// 1.连接服务端
// 解读:连接本机的9999,如果连接成功,返回socket对象
Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
System.out.print("服务 socket = " + socket.getClass() + "\n");
// 2. 连接上后,生成Socket,通过socket.getOutputStream()
// 得到 和 socket对象关联的输出流对象
OutputStream outputStream = socket.getOutputStream();
// 3.通过输出流,写入数据到据通道
outputStream.write("hello , server ".getBytes());
//发送结束标志 半双工吗?
socket.shutdownOutput();
//4.获取和socket关联的输入流,读取数据(byte),并显示
InputStream inputStream = socket.getInputStream();
// 4.读取IO相关
byte [] buf = new byte[1024];
int readLen = 0 ;
while((readLen = inputStream.read(buf)) != -1) {
//根据读取到的实际长度,显示内容
System.out.print(new String(buf , 0 , readLen));
}
// 5. 关闭流
inputStream.close();
outputStream.close();
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}