JAVA通信原理及其代码示例
- TCP方式通信
说明:通信分为服务器端和客户端,可以用打电话的例子比喻:拨号,接通,通话;客户端和服务器之间会进行几次信息交换,大致的过程如下:
1.客户端获取服务器端的地址和端口;
2.客户端传递信息给服务器端,此时服务器端处于监听状态;
3.服务器端获取客户端发送的信息;
4.客户端反馈信息传递结束的信息给服务端;
5.服务器端反馈是否成功接受信息的反馈给客户端;
6.客户端断开传输信息
7.服务器端读取信息;
8.客户端和服务器端释放资源
具体的代码如下:
客户端:
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
public class TcpClientDemo2 {
public static void main(String[] args) throws Exception {
//1.客户端获取服务器的端口
Socket socket= new Socket(InetAddress.getByName("127.0.0.1"),9998);
//2.客户端创建一个输出流
OutputStream os =socket.getOutputStream();
//3.客户端读取文件(管道流)
//文件类型:FileInputStream 类;字符类型:InputStream
FileInputStream file=new FileInputStream(new File("01.jpg"));
//4.向os中写入传输的信息
byte[] buffer=new byte[1024];
int len;
while ((len=file.read(buffer))!=-1){
os.write(buffer,0,len);
}
//5.客户端反馈服务器已经传输完毕
socket.shutdownOutput();
//6.客户端接受服务器反馈
InputStream inputStream=socket.getInputStream();
ByteArrayOutputStream baos=new ByteArrayOutputStream();
byte[] buffer2=new byte[2014];
int len2;
while ((len2=inputStream.read(buffer2))!=-1){
baos.write(buffer2,0,len2);
}
System.out.println(baos.toString());//打印服务端反馈信息
//7.客户端关闭资源
baos.close();
inputStream.close();
socket.close();
file.close();
os.close();
}
}
服务器端:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServerDemo2 {
public static void main(String[] args) throws Exception {
//1.服务器创建接受信息的端口
ServerSocket serverSocket=new ServerSocket(9998);
//2.服务器监听客户端传递信息
Socket socket =serverSocket.accept();//阻塞式监听,一直监听客户端的命名
//3.服务器端获取输入流
InputStream is=socket.getInputStream();
//4.文件接受(文件管道流)
FileOutputStream fos=new FileOutputStream(new File("receive.jpg"));
byte[] buffer=new byte[1024];
int len;
while ((len=is.read(buffer))!=-1){
fos.write(buffer,0,len);
}
//5.服务器通知客户端,信息已经接受完毕
OutputStream os=socket.getOutputStream();
os.write("我已经接受完毕了,你可以断开了".getBytes());
//6.服务器关闭资源
os.close();
fos.close();
is.close();
socket.close();
serverSocket.close();
}
}
- UDP通信
说明:客户端之间都可以进行通信,类型发快递一样,客户端1准备信息将信息打包成一个包裹,客户端2接受客户端1发送的包裹,拆包裹,读取包裹内的信息:
示例代码:
客户端1(发送方)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
public class UdeSenderDemo {
public static void main(String[] args) throws Exception {
//1.定义客户端1的端口
DatagramSocket Socket=new DatagramSocket(8888);
//2.客户端1准备数据(获取控制台输入信息:System.in)
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
//3.循环输出信息,只有输入就执行以下命令
while (true) {
//3.1将控制台输入的信息转换为字符类型
String data = reader.readLine();
//3.2打包信息,准备包裹,制定接受的服务器2的地址和端口信息
byte[] datas = data.getBytes();
DatagramPacket Packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress("127.0.0.1", 6666));
//3.3发送信息
Socket.send(Packet);
//3.4如果发送信息未bye,则结束客户端1的服务
if(data.equals("bye")){
break;
}
}
//4.关闭客户端1的资源
Socket.close();
}
}
客户端(接受方)
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpReciveDemo {
public static void main(String[] args) throws Exception {
//1.定义客户端2的端口
DatagramSocket Socket=new DatagramSocket(6666);
//2.循环接受信息,只有有信息接受就执行以下命令
while (true) {
//2.1.客户端2准备一个容器接受包裹
byte[] container = new byte[2014];
DatagramPacket Packet = new DatagramPacket(container, 0, container.length);
//2.2.客户端2服务Socket接受包裹
Socket.receive(Packet);//
//2.3.客户端2拆包裹,读取包裹内的信息
byte[] data=Packet.getData();
String ReciveData=new String(data,0,data.length);
//2.4.打印出接受的信息
System.out.println(ReciveData);
//2.5.如果接受的信息未bye,则终止客户端2服务
if(ReciveData.equals("bye")){
break;
}
}
//3.关闭客户端2的资源
Socket.close();
}
}