TCP:Transmission Control Protocol
IP: Internet Protocol
五层模型:物理层、数据链路层、网络层、传输层、应用层。
http:80 ftp:21 telnet:23
针对网络通信不同层次,Java提供的网络功能有四大类:
1、InetAddress:用于标识网络上的硬件资源,标示互联网协议地址(IP地址)。
没有提供构造方法,可以通过静态方法返回InetAddress对象。
2、URL:统一资源定位符。由协议名和资源名组成。java.net包中提供了URL类操作URL。
3、Sockets
基于TCP协议实现网络通信类
客户端的Socket类
服务端的ServerSocket类
1、建立服务端侦听socket
2、客户端创建连接socket向服务端发送请求
3、服务端等待并接收连接请求
4、接收请求后服务端创建连接socket
5、服务端与客户端通信
6、服务端和客户端分别关闭socket和相关资源
编程流程
服务端:
1、创建ServerSocket对象,绑定监听端口
2、通过accept()方法监听客户端请求
3、连接建立后,通过输入流读取客户端发送的请求信息
4、通过输出流向客户端发送响应信息
5、关闭响应的资源
客户端:
1、创建Socket对象,指明需要连接的服务器的地址和端口号
2、建立连接后,通过输出流向服务器发送请求信息
3、通过输入流获取服务器响应的信息
4、关闭相关资源
代码:
服务端:
public class Server{
public static void main(){
//创建ServerSocket对象,绑定监听端口
ServerSocket serverSocket = new ServerSocket(8888);//需捕获异常,这里省略
//通过accept()方法监听客户端请求,处于阻塞状态等待侦听
Socket socket = serverSocket.accept();
//获取输入流,并读取客户端信息
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String info = null;
while((info=br.readLine())!=null){
//处理;
}
socket.shutdownInput();
//获取输出流响应客户端请求
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
pw.write("hdhdhdhhd");
pw.flush();
pw.close();
br.close();
isr.close();
is.close();
socket.close();
serverSocket.close();
}
}
客户端:
public class Client{
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket = new Socket("localhost",8888);
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
pw.write("hahahhahahaha");
pw.flush();
socket.shutdownOutput();
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String info = null;
while((info = br.readLine())!=null){
System.out.println(info);
}
br.close();
is.close();
pw.close();
os.close();
socket.close();
}
}
服务器与多客户端通信:
多线程实现方法
1、服务器创建ServerSocket,循环调用accept()等待客户端连接
2、客户端创建一个socket并请求和服务端连接
3、服务端接受客户端请求,创建socket与该客户建立专线连接
4、建立连接的两个socket在一个单独的线程上对话
5、服务端等待新的连接
服务端创建专门处理的线程类
public class ServerThread extends Thread{
Socket socket = null;
public ServerThread(Socket socket){
this.socket = socket;
}
public void run(){
InputStream is = null;
InputStreamReader isr = null;
BufferedReader br =null;
OutputStream os = null;
PrintWriter pw =null;
is = socket.getInputStream();
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
String info = null;
while((info=br.readLine())!=null){
//处理;
}
socket.shutdownInput();
//获取输出流响应客户端请求
os = socket.getOutputStream();
pw = new PrintWriter(os);
pw.write("hdhdhdhhd");
pw.flush();
pw.close();
br.close();
isr.close();
is.close();
socket.close();
}
}
服务端main方法
public static void main(String[] args){
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = null;
while(true){
socket = serverSocket.accept();
ServerThread serverThread = new ServerThread(socket);
serverThread.start();
InetAddress address = socket.getInetAddress();//获取客户端ip地址
}
}
4、Datagram:使用udp协议,将数据保存在数据报中,通过网络进行通信。
DatagramPacket:数据报
DatagramSocket:端到端通信的类
服务器端:
1、创建DatagramSocket,指定端口号
2、创建DatagramPacket
3、接收客户端发送的数据信息
4、读取数据
客户端:
1、定义发送信息
2、创建DatagramPacket,包含将要发送的信息
3、创建DatagramSocket
4、发送数据
代码:
服务器端
public static void main(String[] args) throws UnknownHostException, IOException {
DatagramSocket socket = new DatagramSocket(8800);
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data,data.length);
socket.receive(packet);//此方法在接收数据报之前一直处于阻塞状态
String info = new String(data,0,packet.getLength());
System.out.println(info);
/**
* 响应客户端
*/
InetAddress address = packet.getAddress();
int port = packet.getPort();
byte[] data2 = "hello".getBytes();
DatagramPacket packet2 = new DatagramPacket(data2,data2.length,address,port);
socket.send(packet2);
socket.close();
}
客户端
public static void main(String[] args) throws UnknownHostException, IOException {
//1、服务器 的地址端口号数据
InetAddress address = InetAddress.getByName("localhost");
int port = 8800;
byte[] data = "hahahhahhahahha".getBytes();
//创建数据报。发送信息
DatagramPacket packet = new DatagramPacket(data,data.length,address,port);
DatagramSocket socket = new DatagramSocket();
socket.send(packet);
/*
* 接收服务器的响应信息
*/
byte[] data2 = new byte[1024];
DatagramPacket packet2 = new DatagramPacket(data2,data2.length);
socket.receive(packet2);
String reply = new String(data2,0,packet2.getLength());
System.out.println(reply);
socket.close();
}