socket网络编程实现客户端和服务端通信

时间:2022-04-06 22:15:29

    之前的博客分享过远程备份oracle数据库的代码,但是因为情况变动,代码部署的服务器和数据库服务器不是一个,并且代码部署所在服务器没有oracle的客户端,因此之前的实现策略只能舍弃。尝试一个新的方法:socket编程,本篇博客以Java.net.Socket为demo简单介绍下。


什么是socket编程


 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。  建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;如果说HTTP是轿车,提供了封装或者显示数据的具体形式;那么Socket是发动机,提供了网络通信的能力。

Socket与ServerSocket的交互:

   盗了一张图,我觉得介绍的特别清楚。客户端new Socket('主机号','端口号');服务端new ServerSocket('端口号');并且通过accept()方法进行监听,等待连接;它们都是通过输入输出流交换数据。可以根据自己的需要将输入输出流包装成其他流。

socket网络编程实现客户端和服务端通信

实现demo:
客户端:

 public static void main(String[] args){
try{
//1、创建客户端Socket,指定服务器地址和端口
Socket socket =new Socket("127.0.0.1",9086);
//2、获取输出流,向服务器端发送信息
OutputStream os = socket.getOutputStream();//字节输出流
PrintWriter pw =new PrintWriter(os);//将输出流包装成打印流
pw.write("用户名:admin;密码:admin");
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("Receive from server message=: "+info);
}

//4、关闭资源
br.close();
is.close();
pw.close();
os.close();
socket.close();
}catch(IOException e){
System.out.println(e);
}
}
服务端:

public static void main(String[] args) throws IOException {
ServerSocket serverSocket = null;
Socket socket = null;
Reader reader = null;
OutputStream os = null;
PrintWriter pw = null;
try{
//1、创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
serverSocket =new ServerSocket(9086);//1024-65535的某个端口
//2、调用accept()方法开始监听,等待客户端的连接
socket = serverSocket.accept();
//3、获取输入流,并读取客户端信息
reader = new InputStreamReader(socket.getInputStream());
char chars[] = new char[1024];
int len;
String strClient = "";
while ((len=reader.read(chars)) != -1) {
strClient=new String(chars, 0, len);
System.out.println("Receive from client message=: " + strClient);
}
socket.shutdownInput();//关闭输入流
//4、获取输出流,响应客户端的请求
os = socket.getOutputStream();
pw = new PrintWriter(os);
pw.write("Hello World");
pw.flush();
//5、关闭资源
pw.close();
os.close();
reader.close();
socket.close();
serverSocket.close();
}catch(IOException e){
e.printStackTrace();
}

输出结果:

   client输出:

   Receive from server message=: Hello World

   Server输出:
   Receive from client message=: 用户名:admin;密码:admin


    客户端和服务端代码放在不同的服务器上面,客户端需要服务端的ip地址和端口号,与服务端的端口号相符合就建立起连接,聊天工具大概就是这种实现的。