其实网络编程时很重要的,当初我也没好好去学,现在也因为一直没接触到,也没想着去看,今天无聊,就闲着看了看。
首先看下通讯的流程。
接下来我们来简单实现一下:
先看图有个基本的了解:
接下来我们就用两个类简单模拟一下客户端与服务端:
先看客户端类:
Client:
package com.socket.demo;
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;
/**
* 客户端
* @author lolli
*
*/
public class Client {
public static void main(String[] args) {
try {
// 实例化一个Socket,请求8888端口
Socket socket = new Socket("localhost", 8888);
// 获取一个输出流像服务端发送消息
OutputStream outputStream = socket.getOutputStream();
PrintWriter out = new PrintWriter(outputStream);
out.write("用户名:admin; 密码:123456");
// 刷新缓存 ,发送请求
out.flush();
socket.shutdownOutput();
// 获取一个输入流,接受服务端的响应
InputStream in = socket.getInputStream();
// 转换成字符流
InputStreamReader inputStreamReader = new InputStreamReader(in);
// 放入缓冲流
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
// 获取客户端请求的数据
String str = "";
while((str = bufferedReader.readLine())!=null){
// 打印客户端请求的数据
System.out.println("我是客户端,服务端说: " + str);
}
socket.shutdownInput();
// 关闭流
out.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();
}
}
}
再看看服务端:
Server:
package com.socket.demo;
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;
/**
* 服务端
* @author lolli
*
*/
public class Server {
public static void main(String[] args) {
try {
// 实例化一个ServerSocket,监听8888端口
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("***** 启动服务器,等待客户端的连接请求 ******");
Socket socket = serverSocket.accept();
// 接收输入流(字节流)
InputStream in = socket.getInputStream();
// 转换成字符流
InputStreamReader inputStreamReader = new InputStreamReader(in);
// 放入缓冲流
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
// 获取客户端请求的数据
String str = "";
String data = "";
while((str = bufferedReader.readLine())!=null){
// 打印客户端请求的数据
System.out.println("我是服务端,客户端说: " + str);
data = str;
}
System.out.println(str);
// 接收到客户端请求的数据后相应客户端
OutputStream outputStream = socket.getOutputStream();
PrintWriter out = new PrintWriter(outputStream);
out.write("接收到了客户端传递的数据,数据为:‘" + data + "’");
out.flush();
socket.shutdownInput();
socket.shutdownOutput();
// 关闭流
bufferedReader.close();
inputStreamReader.close();
in.close();
socket.close();
serverSocket.close();
out.close();
outputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
再看看控制台的简单打印:
先看服务端的控制台:
在看看客户端的控制台:
这里值得注意的是,我们必须先启动服务端,客户端才能去请求。先启动服务端,然后通过serverSocket.accept();来监听客户端的请求