版权声明:欢迎转载,若有不当之处请在评论中指出,共同交流。 https://blog.csdn.net/qq_33290787/article/details/52206628
相信Socket对大家都不陌生了,网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。我们平时接触的QQ,其聊天功能就是通过Socket实现的。简单点说,Socket就是通信的一种媒介。下面是Socket通信的原理图:
- 要建立Socket通信,首先要在服务器端建立一个ServerSocket对象对服务器的某个端口进行请求监听。
- 然后,客户端根据指定的服务器地址与端口创建连接的Socket对象发送连接请求。服务器接受到连接请求后会生成与之对应的Socket对象与该客户端Socket进行通信。
- 客户端的Socket对象与服务器中与之对应的Socket对象通过输入输出流进行信息交换,即通信。
- 通信结束后,关闭相关资源。
Server.java:
package SocketPackage;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 基于TCP协议的Socket通信,模拟用户登录
* 服务端
*/
public class Server {
public static void main(String[] args){
try{
//服务端建立ServerSocket对象,用于监听指定的服务器端口56569
ServerSocket serverSocket = new ServerSocket(56569);
System.out.println(NowTime.now()+" Server "+serverSocket+" now starts to monitor");
Socket socket = serverSocket.accept();//accept()方法开始监听,开始阻塞,直到有客户请求连接,返回Socket对象与客户端进行通信
InputStream inputStream = socket.getInputStream();//获取字节输入流,接收客户端请求信息
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);//将字节流转换为字符流,提高读取的性能
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);//为字符输入流添加缓冲,以缓冲的方式进行数据读取
String infoFromClient = null;
while((infoFromClient=bufferedReader.readLine())!=null){
System.out.println(NowTime.now()+" Server receives information from client:"+infoFromClient);
}
socket.shutdownInput();//关闭输入流
OutputStream outputStream = socket.getOutputStream();//获取输出流,响应客户端的请求
PrintWriter printWriter = new PrintWriter(outputStream);//将输出流包装成打印流
printWriter.write("Welcome you!");
printWriter.flush();//刷新缓存,向客户端发送信息
socket.shutdownOutput();//关闭输出流
//关闭资源
printWriter.close();
outputStream.close();
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
socket.close();
serverSocket.close();
}
catch (IOException e){
e.printStackTrace();
}
}
}
Client.java:
package SocketPackage;
import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* 基于TCP协议的Socket通信,模拟用户登录
* 客户端
*/
public class Client {
public static void main(String[] args) {
try {
//客户端建立Socket对象,指定服务器地址与端口
Socket socket = new Socket("127.0.0.1",56569);
OutputStream outputStream = socket.getOutputStream();//获取字节输出流
PrintWriter printWriter = new PrintWriter(outputStream);//将字节输出流包装成打印流
printWriter.write("username:huangfugui,password:123");
printWriter.flush();//刷新缓存,向服务器端发送信息
socket.shutdownOutput();//关闭输出流
InputStream inputStream = socket.getInputStream();//获取输入流,读取服务器发送的响应信息
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String infoFromServer = null;
while ((infoFromServer = bufferedReader.readLine())!=null){
System.out.println(NowTime.now()+" Client receives server information: "+infoFromServer);
}
socket.shutdownInput();//关闭输入流
//关闭资源
bufferedReader.close();
inputStream.close();
printWriter.close();
outputStream.close();
socket.close();
}
catch (UnknownHostException e1){
e1.printStackTrace();
}
catch (IOException e2){
e2.printStackTrace();
}
}
}
NowTime.java(得到当前时间):
package SocketPackage;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Created by Administrator on 2016/8/14.
*/
public class NowTime {
public static String now(){
Date now = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
return simpleDateFormat.format(now);
}
}
运行结果:
服务端:
客户端: