Java中的网络支持:
- 针对网络通信的不同层次,Java提供的网络功能主要分为四大类:
基于TCP的Socket通信实现步骤
- 服务器端:
- 创建ServerSocket,指定绑定的端口
- 调用accept方法开始监听,等待客户端的连接,返回Sockect对象
- 调用Socket对象的getInputStream方法,获取输入流,得到客户端发送的信息
- 处理信息
- 关闭输入输出流,socket,serversocket
- 客户端:
- 创建客户端Socket,指定服务器地址和端口
- 调用Socket对象的getOutputStream方法,获得输出流
- 将输出流包装成字符流,并调用write方法,将信息写入流
- 调用flush方法完成传输
- 关闭socket输出流
- 关闭各种资源
服务器端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 基于tcp协议通信,服务器端
* @author sunqi
*
*/
public class Tcp_Server {
public static void main(String[] args) {
try {
//建立服务器socket
ServerSocket serverSocket=new ServerSocket(8888);//指定端口号为8888的服务器socket
System.out.println("服务器Socket已建立,等待客户端连接");
Socket socket=null;
int count=0;
//调用accept监听
while (true) {
socket=serverSocket.accept();//等待客户端链接
Tcp_ServerThread serverThread=new Tcp_ServerThread(socket);
serverThread.start();
count++;
System.out.println("当前连接数量"+count);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
/**
* 服务器端线程
* @author sunqi
*
*/
public class Tcp_ServerThread extends Thread {
Socket socket=null;
public Tcp_ServerThread(Socket socket) {
super();
this.socket = socket;
}
public void run() {
super.run();
InputStream is=null;
InputStreamReader isr=null;
BufferedReader br=null;
OutputStream os=null;
PrintWriter pw=null;
try {
//获取输入流,读取客户端数据
is = socket.getInputStream();
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
String info=null;
while ((info=br.readLine())!=null) {
System.out.println("客户端:"+info);
}
socket.shutdownInput();
//获取输出流,向客户端发送数据
os = socket.getOutputStream();
pw = new PrintWriter(os);
pw.write("欢迎您!");
pw.flush();
socket.shutdownOutput();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//关闭资源
try {
if(pw!=null)
pw.close();
if(os!=null)
os.close();
if(br!=null)
br.close();
if(isr!=null)
isr.close();
if(is!=null)
is.close();
if(socket!=null)
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
客户端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* 基于tcp协议,客户端
* @author sunqi
*
*/
public class Tcp_Client {
public static void main(String[] args) {
try {
//1.建立客户端socket,并连接指定端口
Socket socket=new Socket("localhost", 8888);
System.out.println("客户端socket建立");
//2.获取输出流,向服务器发送数据
OutputStream os=socket.getOutputStream();
PrintWriter pw=new PrintWriter(os);//输出流包装成打印流
pw.write("用户名:admin,密码:123");
pw.flush();//刷新完成打印流传输
socket.shutdownOutput();//关闭输出流
//3.获取输入流,接收服务器数据
InputStream is=socket.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String info=null;
while ((info=br.readLine())!=null) {
System.out.println("服务器:"+info);
}
socket.shutdownInput();
//4.关闭资源
br.close();
is.close();
pw.close();
os.close();
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
基于UDP的Socket通信实现步骤
- 服务器端:
- 创建DatagramSocket,指定端口号
- 创建DatagramPacket数据报用byte数组作为缓冲
- 调用DatagramSocket的receive方法等待接收客户端发送的数据信息
- 读取数据(对byte数组内容包装/处理)
- 客户端:
- 调用InetAddress类的方法定义服务器的地址、端口号,初始化要发送的数据(存储在byte数组中)
- 创建DatagramPacket对象,并将byte数组包装到DatagramPacket中
- 创建DatagramSocket对象
- 调用DatagramSocket对象的send方法,参数:DatagramPacket对象,将信息发送
服务器端:
package Udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
* 基于UDP协议,服务器端
* @author sunqi
*
*/
public class Udp_Server {
public static void main(String[] args) throws IOException {
/**
* 获取客户端数据
*/
//1.建立socket
DatagramSocket dsocket=new DatagramSocket(8800);
System.out.println("服务器socket已建立");
while (true) {
byte[] data=new byte[1024];//存放客户端发送的信息
//2.建立数据报,接收客户端数据
DatagramPacket dPacket=new DatagramPacket(data, data.length);
dsocket.receive(dPacket);//等待连接,服务器处于阻塞态
new Udp_ServerThread(dsocket,dPacket,data).start();
}
}
}
package Udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Udp_ServerThread extends Thread {
DatagramSocket dsocket=null;
DatagramPacket dPacket=null;
byte[] data=null;
public Udp_ServerThread(DatagramSocket dsocket,DatagramPacket dPacket, byte[] data) {
super();
this.dsocket = dsocket;
this.dPacket=dPacket;
this.data=data;
}
public void run() {
try {
super.run();
String info=new String(data, 0, dPacket.getLength());
System.out.println("客户端说:"+info);
/**
* 响应客户端
*/
//1.获得客户端地址和端口号,初始化响应信息
InetAddress address=dPacket.getAddress();
int port=dPacket.getPort();
byte[] data2="欢迎您!".getBytes();
//2.创建数据报
DatagramPacket packet=new DatagramPacket(data2, data2.length, address, port);
//3.发送数据
dsocket.send(packet);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
客户端:
package Udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* 基于UDP协议通信,客户端
* @author sunqi
*
*/
public class Udp_Client {
public static void main(String[] args) throws IOException {
/**
* 向服务器发送数据
*/
//1.指定服务器地址,端口号,要发送的数据
InetAddress address=InetAddress.getByName("localhost");//通过服务器名称获取地址
int port =8800;
byte[] data="用户名:tom;密码:456".getBytes();
//2.创建数据报
DatagramPacket dpacket=new DatagramPacket(data, data.length,address,port);
//3.创建socket
DatagramSocket dSocket=new DatagramSocket();
//4.发送数据
dSocket.send(dpacket);
/**
* 获取服务器响应
*/
//1.创建字节数组,存储响应数据
byte[] data2=new byte[1024];
DatagramPacket packet=new DatagramPacket(data2, data2.length);
//2.接收响应
dSocket.receive(packet);
//3.获取数据
String info=new String(data2, 0, packet.getLength());
System.out.println("服务器说:"+info);
dSocket.close();
}
}